Lines Matching defs:SiS_Pr

87 static unsigned short	SiS_GetBIOSLCDResInfo(struct SiS_Private *SiS_Pr);
89 static void SiS_SetCH70xx(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val);
97 SiS_UnLockCRT2(struct SiS_Private *SiS_Pr)
99 if(SiS_Pr->ChipType == XGI_20)
101 else if(SiS_Pr->ChipType >= SIS_315H)
102 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
104 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
111 SiS_LockCRT2(struct SiS_Private *SiS_Pr)
113 if(SiS_Pr->ChipType == XGI_20)
115 else if(SiS_Pr->ChipType >= SIS_315H)
116 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
118 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
126 SiS_SetRegSR11ANDOR(struct SiS_Private *SiS_Pr, unsigned short DataAND,
129 if(SiS_Pr->ChipType >= SIS_661) {
133 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,DataAND,DataOR);
142 GetLCDStructPtr661(struct SiS_Private *SiS_Pr)
144 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
155 if((SiS_Pr->SiS_ROMNew) &&
156 ( (SiS_Pr->SiS_VBType & VB_SISLVDS) ||
157 (!SiS_Pr->PanelSelfDetected) )) {
159 if(SiS_Pr->ChipType < SIS_661) reg = 0x3c;
162 idx = (SiS_GetReg(SiS_Pr->SiS_P3d4,reg) & 0x1f) * 26;
177 GetLCDStructPtr661_2(struct SiS_Private *SiS_Pr)
179 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
189 if((SiS_Pr->SiS_ROMNew) &&
190 ( (SiS_Pr->SiS_VBType & VB_SISLVDS) ||
191 (!SiS_Pr->PanelSelfDetected) )) {
193 romptr += ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) * SiS_Pr->SiS661LCD2TableSize);
205 SiS_AdjustCRT2Rate(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
210 modeid = SiS_Pr->SiS_RefIndex[RRTI + (*i)].ModeID;
212 if(SiS_Pr->SiS_VBType & VB_SISVB) {
214 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
217 if(SiS_Pr->ChipType >= SIS_315H) {
219 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
221 if(SiS_Pr->SiS_VBType & VB_SISRAMDAC202) {
227 } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
230 if(SiS_Pr->ChipType >= SIS_315H) {
231 if(SiS_Pr->SiS_VBType & VB_SISVB) {
232 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
238 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
242 } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToYPbPr525750|SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
245 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
247 if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
248 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
258 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
259 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
264 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
271 for(; SiS_Pr->SiS_RefIndex[RRTI + (*i)].ModeID == modeid; (*i)--) {
272 infoflag = SiS_Pr->SiS_RefIndex[RRTI + (*i)].Ext_InfoFlag;
281 if(SiS_Pr->SiS_RefIndex[RRTI + (*i)].ModeID != modeid) break;
282 infoflag = SiS_Pr->SiS_RefIndex[RRTI + (*i)].Ext_InfoFlag;
293 SiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
309 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
311 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
314 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
315 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
322 index = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x33) >> SiS_Pr->SiS_SelectCRT2Rate) & 0x0F;
327 if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
328 if(SiS_Pr->SiS_VBType & VB_SISVB) {
329 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
330 if(SiS_Pr->SiS_VBType & VB_NoLCD) index = 0;
331 else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index = backupindex = 0;
333 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
334 if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
335 temp = LCDRefreshIndex[SiS_GetBIOSLCDResInfo(SiS_Pr)];
340 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) index = 0;
341 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
342 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) index = 0;
347 RRTI = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
348 ModeNo = SiS_Pr->SiS_RefIndex[RRTI].ModeID;
350 if(SiS_Pr->ChipType >= SIS_315H) {
351 if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
352 if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
353 (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x107) ) {
361 if(SiS_Pr->SiS_RefIndex[RRTI + i].ModeID != ModeNo) break;
362 temp = SiS_Pr->SiS_RefIndex[RRTI + i].Ext_InfoFlag;
364 if(temp < SiS_Pr->SiS_ModeType) break;
369 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
370 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
371 temp = SiS_Pr->SiS_RefIndex[RRTI + i - 1].Ext_InfoFlag;
378 if((SiS_Pr->SiS_SetFlag & ProgrammingCRT2) && (!(SiS_Pr->SiS_VBInfo & DisableCRT2Display))) {
380 if(!(SiS_AdjustCRT2Rate(SiS_Pr, ModeNo, ModeIdIndex, RRTI, &i))) {
393 SiS_SaveCRT2Info(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
398 SiS_SetReg(SiS_Pr->SiS_P3d4,0x34,ModeNo);
399 temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
401 SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x31,temp2,temp1);
410 SiS_CR36BIOSWord23b(struct SiS_Private *SiS_Pr)
412 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
415 if(SiS_Pr->SiS_UseROM) {
417 temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) & 0x0f);
426 SiS_CR36BIOSWord23d(struct SiS_Private *SiS_Pr)
428 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
431 if(SiS_Pr->SiS_UseROM) {
433 temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) & 0x0f);
447 SiS_DDC2Delay(struct SiS_Private *SiS_Pr, unsigned int delaytime)
452 j += SiS_GetReg(SiS_Pr->SiS_P3c4,0x05);
458 SiS_GenericDelay(struct SiS_Private *SiS_Pr, unsigned short delay)
460 SiS_DDC2Delay(SiS_Pr, delay * 36);
466 SiS_LongDelay(struct SiS_Private *SiS_Pr, unsigned short delay)
469 SiS_GenericDelay(SiS_Pr, 6623);
476 SiS_ShortDelay(struct SiS_Private *SiS_Pr, unsigned short delay)
479 SiS_GenericDelay(SiS_Pr, 66);
485 SiS_PanelDelay(struct SiS_Private *SiS_Pr, unsigned short DelayTime)
488 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
492 if(SiS_Pr->ChipType < SIS_315H) {
496 PanelID = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
497 if(SiS_Pr->SiS_VBType & VB_SISVB) {
498 if(SiS_Pr->SiS_VBType & VB_SIS301) PanelID &= 0xf7;
499 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x18) & 0x10)) PanelID = 0x12;
507 Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
509 Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
511 if(SiS_Pr->SiS_UseROM) {
518 SiS_ShortDelay(SiS_Pr, Delay);
526 if((SiS_Pr->ChipType >= SIS_661) ||
527 (SiS_Pr->ChipType <= SIS_315PRO) ||
528 (SiS_Pr->ChipType == SIS_330) ||
529 (SiS_Pr->SiS_ROMNew)) {
532 SiS_DDC2Delay(SiS_Pr, 0x1000);
534 SiS_DDC2Delay(SiS_Pr, 0x4000);
537 } else if((SiS_Pr->SiS_IF_DEF_LVDS == 1) /* ||
538 (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
539 (SiS_Pr->SiS_CustomT == CUT_CLEVO1400) */ ) { /* 315 series, LVDS; Special */
541 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
542 PanelID = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
543 if(SiS_Pr->SiS_CustomT == CUT_CLEVO1400) {
544 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x1b) & 0x10)) PanelID = 0x12;
546 if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
556 Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[0];
558 Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[1];
560 if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
570 SiS_ShortDelay(SiS_Pr, Delay);
573 } else if(SiS_Pr->SiS_VBType & VB_SISVB) { /* 315 series, all bridges */
575 DelayIndex = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
577 Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
579 Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
582 SiS_DDC2Delay(SiS_Pr, Delay);
593 SiS_PanelDelayLoop(struct SiS_Private *SiS_Pr, unsigned short DelayTime, unsigned short DelayLoop)
597 SiS_PanelDelay(SiS_Pr, DelayTime);
607 SiS_WaitRetrace1(struct SiS_Private *SiS_Pr)
611 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
612 if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x17) & 0x80)) return;
615 while((SiS_GetRegByte(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
617 while((!(SiS_GetRegByte(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
622 SiS_WaitRetrace2(struct SiS_Private *SiS_Pr, unsigned short reg)
627 while((SiS_GetReg(SiS_Pr->SiS_Part1Port,reg) & 0x02) && --watchdog);
629 while((!(SiS_GetReg(SiS_Pr->SiS_Part1Port,reg) & 0x02)) && --watchdog);
634 SiS_WaitVBRetrace(struct SiS_Private *SiS_Pr)
636 if(SiS_Pr->ChipType < SIS_315H) {
638 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
639 if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x20)) return;
641 if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x80)) {
642 SiS_WaitRetrace1(SiS_Pr);
644 SiS_WaitRetrace2(SiS_Pr, 0x25);
649 if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x40)) {
650 SiS_WaitRetrace1(SiS_Pr);
652 SiS_WaitRetrace2(SiS_Pr, 0x30);
659 SiS_VBWait(struct SiS_Private *SiS_Pr)
666 tempal = SiS_GetRegByte(SiS_Pr->SiS_P3da);
680 SiS_VBLongWait(struct SiS_Private *SiS_Pr)
682 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
683 SiS_VBWait(SiS_Pr);
685 SiS_WaitRetrace1(SiS_Pr);
695 SiS_Is301B(struct SiS_Private *SiS_Pr)
697 if(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01) >= 0xb0) return TRUE;
703 SiS_CRT2IsLCD(struct SiS_Private *SiS_Pr)
705 if(SiS_Pr->ChipType == SIS_730) {
706 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x20) return TRUE;
708 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & 0x20) return TRUE;
713 SiS_IsDualEdge(struct SiS_Private *SiS_Pr)
716 if(SiS_Pr->ChipType >= SIS_315H) {
717 if((SiS_Pr->ChipType != SIS_650) || (SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0)) {
718 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableDualEdge) return TRUE;
726 SiS_IsVAMode(struct SiS_Private *SiS_Pr)
731 if(SiS_Pr->ChipType >= SIS_315H) {
732 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
741 SiS_IsVAorLCD(struct SiS_Private *SiS_Pr)
743 if(SiS_IsVAMode(SiS_Pr)) return TRUE;
744 if(SiS_CRT2IsLCD(SiS_Pr)) return TRUE;
750 SiS_IsDualLink(struct SiS_Private *SiS_Pr)
753 if(SiS_Pr->ChipType >= SIS_315H) {
754 if((SiS_CRT2IsLCD(SiS_Pr)) ||
755 (SiS_IsVAMode(SiS_Pr))) {
756 if(SiS_Pr->SiS_LCDInfo & LCDDualLink) return TRUE;
765 SiS_TVEnabled(struct SiS_Private *SiS_Pr)
767 if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) != 0x0c) return TRUE;
768 if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {
769 if(SiS_GetReg(SiS_Pr->SiS_Part2Port,0x4d) & 0x10) return TRUE;
777 SiS_LCDAEnabled(struct SiS_Private *SiS_Pr)
779 if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) return TRUE;
786 SiS_WeHaveBacklightCtrl(struct SiS_Private *SiS_Pr)
788 if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->ChipType < SIS_661)) {
789 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x79) & 0x10) return TRUE;
797 SiS_IsNotM650orLater(struct SiS_Private *SiS_Pr)
801 if(SiS_Pr->ChipType == SIS_650) {
802 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
806 } else if(SiS_Pr->ChipType >= SIS_661) return FALSE;
813 SiS_IsYPbPr(struct SiS_Private *SiS_Pr)
815 if(SiS_Pr->ChipType >= SIS_315H) {
817 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHYPbPr) return TRUE;
825 SiS_IsChScart(struct SiS_Private *SiS_Pr)
827 if(SiS_Pr->ChipType >= SIS_315H) {
829 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHScart) return TRUE;
837 SiS_IsTVOrYPbPrOrScart(struct SiS_Private *SiS_Pr)
841 if(SiS_Pr->ChipType >= SIS_315H) {
842 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
844 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
848 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
857 SiS_IsLCDOrLCDA(struct SiS_Private *SiS_Pr)
861 if(SiS_Pr->ChipType >= SIS_315H) {
862 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
864 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
867 flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
875 SiS_HaveBridge(struct SiS_Private *SiS_Pr)
879 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
881 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
882 flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);
889 SiS_BridgeIsEnabled(struct SiS_Private *SiS_Pr)
893 if(SiS_HaveBridge(SiS_Pr)) {
894 flag = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
895 if(SiS_Pr->ChipType < SIS_315H) {
907 SiS_BridgeInSlavemode(struct SiS_Private *SiS_Pr)
911 flag1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
923 SiS_SetChrontelGPIO(struct SiS_Private *SiS_Pr, unsigned short myvbinfo)
928 if(!(SiS_Pr->SiS_ChSW)) return;
931 acpibase = sisfb_read_lpc_pci_dword(SiS_Pr, 0x74);
950 SiS_GetVBInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
956 SiS_Pr->SiS_SetFlag = 0;
958 modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);
960 SiS_Pr->SiS_ModeType = modeflag & ModeTypeMask;
962 if((ModeNo > 0x13) && (!SiS_Pr->UseCustomMode)) {
963 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
968 if(SiS_HaveBridge(SiS_Pr)) {
970 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
972 tempax = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) << 8;
977 if(SiS_Pr->ChipType >= SIS_315H) {
978 if(SiS_Pr->SiS_VBType & VB_SISLCDA) {
981 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x31,0xbf);
983 if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8))) {
985 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
988 if(SiS_Pr->SiS_UseLCDA) {
989 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {
990 if((ModeNo <= 0x13) || (!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {
991 SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA));
996 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
1002 if(SiS_Pr->ChipType >= SIS_661) { /* New CR layout */
1004 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & 0x04) {
1005 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35) & 0xe0;
1007 else if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {
1013 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
1014 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
1018 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
1028 if(!(SiS_Pr->SiS_VBType & VB_SISVGA2)) {
1032 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1042 if(SiS_Pr->ChipType >= SIS_315H) {
1043 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
1055 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
1068 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1088 if(SiS_Pr->ChipType >= SIS_315H) {
1093 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
1101 if(SiS_Pr->ChipType >= SIS_315H) {
1118 if(SiS_Pr->SiS_ModeType <= ModeVGA) {
1119 if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
1120 ((SiS_Pr->SiS_VBType & VB_NoLCD) && (tempbx & SetCRT2ToLCD)) ) {
1133 if(SiS_BridgeIsEnabled(SiS_Pr)) {
1135 if(SiS_BridgeInSlavemode(SiS_Pr)) {
1159 SiS_Pr->SiS_VBInfo = tempbx;
1162 if(SiS_Pr->ChipType == SIS_630) {
1163 SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);
1170 SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
1176 SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
1186 SiS_SetYPbPr(struct SiS_Private *SiS_Pr)
1199 SiS_Pr->SiS_YPbPr = 0;
1200 if(SiS_Pr->ChipType >= SIS_661) return;
1202 if(SiS_Pr->SiS_VBType) {
1203 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
1204 SiS_Pr->SiS_YPbPr = YPbPrHiVision;
1208 if(SiS_Pr->ChipType >= SIS_315H) {
1209 if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {
1210 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
1213 case 0x00: SiS_Pr->SiS_YPbPr = YPbPr525i; break;
1214 case 0x01: SiS_Pr->SiS_YPbPr = YPbPr525p; break;
1215 case 0x02: SiS_Pr->SiS_YPbPr = YPbPr750p; break;
1216 case 0x03: SiS_Pr->SiS_YPbPr = YPbPrHiVision; break;
1229 SiS_SetTVMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
1231 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
1233 unsigned char OutputSelect = *SiS_Pr->pSiS_OutputSelect;
1235 SiS_Pr->SiS_TVMode = 0;
1237 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;
1238 if(SiS_Pr->UseCustomMode) return;
1241 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
1244 if(SiS_Pr->ChipType < SIS_661) {
1246 if(SiS_Pr->SiS_VBInfo & SetPALTV) SiS_Pr->SiS_TVMode |= TVSetPAL;
1248 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1250 if((SiS_Pr->ChipType == SIS_630) ||
1251 (SiS_Pr->ChipType == SIS_730)) {
1254 } else if(SiS_Pr->ChipType >= SIS_315H) {
1256 if(SiS_Pr->ChipType < XGI_20) {
1258 if(SiS_Pr->ChipType >= SIS_330) romindex = 0x11b;
1262 if(romindex && SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
1265 SiS_SetRegAND(SiS_Pr->SiS_P3d4,temp,0x3F);
1268 temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,temp);
1269 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1271 SiS_Pr->SiS_TVMode |= TVSetPALM;
1272 SiS_Pr->SiS_TVMode &= ~TVSetPAL;
1274 SiS_Pr->SiS_TVMode |= TVSetPALN;
1278 SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
1283 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
1284 if(SiS_Pr->SiS_YPbPr == YPbPr750p) {
1285 SiS_Pr->SiS_TVMode |= TVSetYPbPr750p;
1286 } else if(SiS_Pr->SiS_YPbPr == YPbPr525p) {
1287 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1288 SiS_Pr->SiS_TVMode |= TVSetYPbPr625p;
1290 SiS_Pr->SiS_TVMode |= TVSetYPbPr525p;
1292 } else if(SiS_Pr->SiS_YPbPr == YPbPrHiVision) {
1293 SiS_Pr->SiS_TVMode |= TVSetHiVision;
1295 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1296 SiS_Pr->SiS_TVMode |= TVSetYPbPr625i;
1298 SiS_Pr->SiS_TVMode |= TVSetYPbPr525i;
1301 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p |
1306 SiS_Pr->SiS_VBInfo &= ~SetCRT2ToHiVision;
1307 SiS_Pr->SiS_VBInfo |= SetCRT2ToYPbPr525750;
1308 SiS_Pr->SiS_TVMode &= ~TVSetPAL;
1309 } else if(SiS_Pr->SiS_TVMode & TVSetHiVision) {
1310 SiS_Pr->SiS_TVMode |= TVSetPAL;
1313 } else if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
1314 if(SiS_Pr->SiS_CHOverScan) {
1315 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
1316 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
1317 if((temp & TVOverScan) || (SiS_Pr->SiS_CHOverScan == 1)) {
1318 SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
1320 } else if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
1321 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x79);
1322 if((temp & 0x80) || (SiS_Pr->SiS_CHOverScan == 1)) {
1323 SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
1326 if(SiS_Pr->SiS_CHSOverScan) {
1327 SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
1330 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
1331 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
1332 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1333 if(temp & EnablePALM) SiS_Pr->SiS_TVMode |= TVSetPALM;
1334 else if(temp & EnablePALN) SiS_Pr->SiS_TVMode |= TVSetPALN;
1337 SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
1345 temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
1347 SiS_Pr->SiS_TVMode |= TVSetPAL;
1349 SiS_Pr->SiS_TVMode |= TVSetPALN;
1351 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1352 SiS_Pr->SiS_TVMode &= ~TVSetPAL;
1354 SiS_Pr->SiS_TVMode |= TVSetPALM;
1358 SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
1361 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
1362 if(SiS_Pr->SiS_CHOverScan) {
1363 if((temp1 & 0x10) || (SiS_Pr->SiS_CHOverScan == 1)) {
1364 SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
1368 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1369 if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
1372 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1373 SiS_Pr->SiS_TVMode |= TVSetYPbPr625i;
1375 SiS_Pr->SiS_TVMode |= TVSetYPbPr525i;
1378 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
1379 SiS_Pr->SiS_TVMode |= TVSetYPbPr625p;
1381 SiS_Pr->SiS_TVMode |= TVSetYPbPr525p;
1384 SiS_Pr->SiS_TVMode |= TVSetYPbPr750p;
1386 SiS_Pr->SiS_TVMode &= ~TVSetPAL;
1387 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
1388 SiS_Pr->SiS_TVMode |= (TVSetHiVision | TVSetPAL);
1390 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToYPbPr525750 | SetCRT2ToHiVision)) {
1392 SiS_Pr->SiS_TVMode |= TVAspect169;
1394 temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x39);
1396 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p | TVSetHiVision)) {
1397 SiS_Pr->SiS_TVMode |= TVAspect169;
1399 SiS_Pr->SiS_TVMode |= TVAspect43LB;
1402 SiS_Pr->SiS_TVMode |= TVAspect43;
1409 if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) SiS_Pr->SiS_TVMode |= TVSetPAL;
1411 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1413 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
1414 SiS_Pr->SiS_TVMode |= TVSetPAL;
1415 SiS_Pr->SiS_TVMode &= ~(TVSetPALM | TVSetPALN | TVSetNTSCJ);
1416 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
1417 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525i |
1422 SiS_Pr->SiS_TVMode &= ~(TVSetPAL | TVSetNTSCJ | TVSetPALM | TVSetPALN);
1426 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
1427 if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
1428 SiS_Pr->SiS_TVMode |= TVSetTVSimuMode;
1432 if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
1434 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
1435 SiS_Pr->SiS_TVMode |= TVSet525p1024;
1436 } else if(!(SiS_Pr->SiS_TVMode & (TVSetHiVision |
1440 SiS_Pr->SiS_TVMode |= TVSetNTSC1024;
1445 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
1447 SiS_Pr->SiS_TVMode |= TVSetHiVi960540;
1451 SiS_Pr->SiS_TVMode |= TVRPLLDIV2XO;
1452 if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) &&
1453 (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
1454 SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
1455 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPrProg) {
1456 SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
1457 } else if(!(SiS_Pr->SiS_VBType & VB_SIS30xBLV)) {
1458 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
1459 SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
1465 SiS_Pr->SiS_VBInfo &= ~SetPALTV;
1469 xf86DrvMsg(0, X_INFO, "(init301: TVMode %x, VBInfo %x)\n", SiS_Pr->SiS_TVMode, SiS_Pr->SiS_VBInfo);
1479 SiS_GetBIOSLCDResInfo(struct SiS_Private *SiS_Pr)
1481 unsigned short temp = SiS_Pr->SiS_LCDResInfo;
1492 SiS_GetLCDInfoBIOS(struct SiS_Private *SiS_Pr)
1501 SiS_Pr->PanelHT, SiS_Pr->PanelVT,
1502 SiS_Pr->PanelHRS, SiS_Pr->PanelHRE,
1503 SiS_Pr->PanelVRS, SiS_Pr->PanelVRE,
1504 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].CLOCK,
1505 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].Part4_A,
1506 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].Part4_B);
1510 if((ROMAddr = GetLCDStructPtr661(SiS_Pr))) {
1511 if((temp = SISGETROMW(6)) != SiS_Pr->PanelHT) {
1512 SiS_Pr->SiS_NeedRomModeData = TRUE;
1513 SiS_Pr->PanelHT = temp;
1515 if((temp = SISGETROMW(8)) != SiS_Pr->PanelVT) {
1516 SiS_Pr->SiS_NeedRomModeData = TRUE;
1517 SiS_Pr->PanelVT = temp;
1519 SiS_Pr->PanelHRS = SISGETROMW(10);
1520 SiS_Pr->PanelHRE = SISGETROMW(12);
1521 SiS_Pr->PanelVRS = SISGETROMW(14);
1522 SiS_Pr->PanelVRE = SISGETROMW(16);
1523 SiS_Pr->PanelVCLKIdx315 = VCLK_CUSTOM_315;
1524 SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].CLOCK =
1525 SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].CLOCK = (unsigned short)((unsigned char)ROMAddr[18]);
1526 SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].SR2B =
1527 SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].Part4_A = ROMAddr[19];
1528 SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].SR2C =
1529 SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].Part4_B = ROMAddr[20];
1534 SiS_Pr->PanelHT, SiS_Pr->PanelVT,
1535 SiS_Pr->PanelHRS, SiS_Pr->PanelHRE,
1536 SiS_Pr->PanelVRS, SiS_Pr->PanelVRE,
1537 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].CLOCK,
1538 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].Part4_A,
1539 SiS_Pr->SiS_VBVCLKData[SiS_Pr->PanelVCLKIdx315].Part4_B);
1548 SiS_CheckScaling(struct SiS_Private *SiS_Pr, unsigned short resinfo,
1554 if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ||
1555 (SiS_Pr->UsePanelScaler == -1)) {
1556 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
1564 SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
1569 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
1578 SiS_Pr->SiS_LCDResInfo = 0;
1579 SiS_Pr->SiS_LCDTypeInfo = 0;
1580 SiS_Pr->SiS_LCDInfo = 0;
1581 SiS_Pr->PanelHRS = 999; /* HSync start */
1582 SiS_Pr->PanelHRE = 999; /* HSync end */
1583 SiS_Pr->PanelVRS = 999; /* VSync start */
1584 SiS_Pr->PanelVRE = 999; /* VSync end */
1585 SiS_Pr->SiS_NeedRomModeData = FALSE;
1588 SiS_Pr->Alternate1600x1200 = FALSE;
1590 if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return;
1592 modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);
1594 if((ModeNo > 0x13) && (!SiS_Pr->UseCustomMode)) {
1595 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
1596 modexres = SiS_Pr->SiS_ModeResInfo[resinfo].HTotal;
1597 modeyres = SiS_Pr->SiS_ModeResInfo[resinfo].VTotal;
1600 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
1605 if((SiS_Pr->ChipType >= SIS_661) || (SiS_Pr->SiS_ROMNew)) {
1606 SiS_Pr->SiS_LCDTypeInfo = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x39) & 0x7c) >> 2;
1607 } else if((SiS_Pr->ChipType < SIS_315H) || (SiS_Pr->ChipType >= SIS_661)) {
1608 SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
1610 SiS_Pr->SiS_LCDTypeInfo = (temp & 0x0F) - 1;
1614 if(SiS_Pr->ChipType < SIS_315H) {
1616 if(SiS_Pr->SiS_VBType & VB_SIS301) {
1626 if(SiS_Pr->ChipType == SIS_550) {
1630 } else if(SiS_Pr->ChipType >= SIS_661) {
1635 if(SiS_Pr->SiS_VBType & VB_SISLVDS) { /* SiS LVDS */
1639 if(SiS_Pr->SiS_ROMNew) {
1646 SiS_Pr->SiS_LCDResInfo = temp;
1649 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
1650 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
1651 SiS_Pr->SiS_LCDResInfo = Panel_Barco1366;
1652 } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
1653 SiS_Pr->SiS_LCDResInfo = Panel_848x480;
1654 } else if(SiS_Pr->SiS_CustomT == CUT_PANEL856) {
1655 SiS_Pr->SiS_LCDResInfo = Panel_856x480;
1660 if(SiS_Pr->SiS_VBType & VB_SISVB) {
1661 if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
1662 SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMin301;
1664 if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMinLVDS)
1665 SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
1668 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
1669 SiS_Pr->SiS_LCDInfo = temp & ~0x000e;
1673 switch(SiS_Pr->SiS_LCDResInfo) {
1678 SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
1681 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
1684 panelcanscale = (SiS_Pr->SiS_LCDInfo & DontExpandLCD) ? TRUE : FALSE;
1686 if(!SiS_Pr->UsePanelScaler) SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
1687 else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
1691 if(SiS_Pr->ChipType >= SIS_661) {
1692 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
1693 if(temp & 0x08) SiS_Pr->SiS_LCDInfo |= LCDPass11;
1695 if(SiS_Pr->SiS_VBType & VB_SISDUALLINK) {
1696 if(SiS_Pr->SiS_ROMNew) {
1697 if(temp & 0x02) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
1698 } else if((myptr = GetLCDStructPtr661(SiS_Pr))) {
1699 if(myptr[2] & 0x01) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
1702 } else if(SiS_Pr->ChipType >= SIS_315H) {
1703 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
1704 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x39) & 0x01) SiS_Pr->SiS_LCDInfo |= LCDPass11;
1706 if((SiS_Pr->SiS_ROMNew) && (!(SiS_Pr->PanelSelfDetected))) {
1707 SiS_Pr->SiS_LCDInfo &= ~(LCDRGB18Bit);
1708 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
1709 if(temp & 0x01) SiS_Pr->SiS_LCDInfo |= LCDRGB18Bit;
1710 if(SiS_Pr->SiS_VBType & VB_SISDUALLINK) {
1711 if(temp & 0x02) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
1713 } else if(!(SiS_Pr->SiS_ROMNew)) {
1714 if(SiS_Pr->SiS_VBType & VB_SISDUALLINK) {
1715 if((SiS_Pr->SiS_CustomT == CUT_CLEVO1024) &&
1716 (SiS_Pr->SiS_LCDResInfo == Panel_1024x768)) {
1717 SiS_Pr->SiS_LCDInfo |= LCDDualLink;
1719 if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
1720 (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
1721 (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) ||
1722 (SiS_Pr->SiS_LCDResInfo == Panel_1680x1050)) {
1723 SiS_Pr->SiS_LCDInfo |= LCDDualLink;
1731 if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBType & VB_NoLCD)) {
1733 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
1734 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
1735 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
1737 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
1740 if(panelcanscale) SiS_Pr->SiS_LCDInfo |= LCDPass11;
1741 if(SiS_Pr->CenterScreen == 1) SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
1745 SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
1746 SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
1748 switch(SiS_Pr->SiS_LCDResInfo) {
1751 case Panel_320x240_3: SiS_Pr->PanelXRes = 640; SiS_Pr->PanelYRes = 480;
1752 SiS_Pr->PanelVRS = 24; SiS_Pr->PanelVRE = 3;
1753 SiS_Pr->PanelVCLKIdx300 = VCLK28;
1754 SiS_Pr->PanelVCLKIdx315 = VCLK28;
1756 case Panel_640x480: SiS_Pr->PanelXRes = 640; SiS_Pr->PanelYRes = 480;
1757 SiS_Pr->PanelVRE = 3;
1758 SiS_Pr->PanelVCLKIdx300 = VCLK28;
1759 SiS_Pr->PanelVCLKIdx315 = VCLK28;
1761 case Panel_800x600: SiS_Pr->PanelXRes = 800; SiS_Pr->PanelYRes = 600;
1762 SiS_Pr->PanelHT = 1056; SiS_Pr->PanelVT = 628;
1763 SiS_Pr->PanelHRS = 40; SiS_Pr->PanelHRE = 128;
1764 SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 4;
1765 SiS_Pr->PanelVCLKIdx300 = VCLK40;
1766 SiS_Pr->PanelVCLKIdx315 = VCLK40;
1768 case Panel_1024x600: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 600;
1769 SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 800;
1770 SiS_Pr->PanelHRS = 24; SiS_Pr->PanelHRE = 136;
1771 SiS_Pr->PanelVRS = 2 /* 88 */ ; SiS_Pr->PanelVRE = 6;
1772 SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
1773 SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
1775 case Panel_1024x768: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768;
1776 SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
1777 SiS_Pr->PanelHRS = 24; SiS_Pr->PanelHRE = 136;
1778 SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
1779 if(SiS_Pr->ChipType < SIS_315H) {
1780 SiS_Pr->PanelHRS = 23;
1781 SiS_Pr->PanelVRE = 5;
1783 SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
1784 SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
1785 SiS_GetLCDInfoBIOS(SiS_Pr);
1787 case Panel_1152x768: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 768;
1788 SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
1789 SiS_Pr->PanelHRS = 24; SiS_Pr->PanelHRE = 136;
1790 SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
1791 if(SiS_Pr->ChipType < SIS_315H) {
1792 SiS_Pr->PanelHRS = 23;
1793 SiS_Pr->PanelVRE = 5;
1795 SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
1796 SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
1798 case Panel_1152x864: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 864;
1800 case Panel_1280x720: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 720;
1801 SiS_Pr->PanelHT = 1650; SiS_Pr->PanelVT = 750;
1802 SiS_Pr->PanelHRS = 110; SiS_Pr->PanelHRE = 40;
1803 SiS_Pr->PanelVRS = 5; SiS_Pr->PanelVRE = 5;
1804 SiS_Pr->PanelVCLKIdx315 = VCLK_1280x720;
1806 SiS_GetLCDInfoBIOS(SiS_Pr);
1808 case Panel_1280x768: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768;
1809 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
1810 SiS_Pr->PanelHT = 1408; SiS_Pr->PanelVT = 806;
1811 SiS_Pr->PanelVCLKIdx300 = VCLK81_300; /* ? */
1812 SiS_Pr->PanelVCLKIdx315 = VCLK81_315; /* ? */
1814 SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 802;
1815 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRS = 112;
1816 SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
1817 SiS_Pr->PanelVCLKIdx300 = VCLK81_300;
1818 SiS_Pr->PanelVCLKIdx315 = VCLK81_315;
1821 case Panel_1280x768_2: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768;
1822 SiS_Pr->PanelHT = 1660; SiS_Pr->PanelVT = 806;
1823 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112;
1824 SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
1825 SiS_Pr->PanelVCLKIdx315 = VCLK_1280x768_2;
1826 SiS_GetLCDInfoBIOS(SiS_Pr);
1828 case Panel_1280x800: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 800;
1829 SiS_Pr->PanelHT = 1408; SiS_Pr->PanelVT = 816;
1830 SiS_Pr->PanelHRS = 21; SiS_Pr->PanelHRE = 24;
1831 SiS_Pr->PanelVRS = 4; SiS_Pr->PanelVRE = 3;
1832 SiS_Pr->PanelVCLKIdx315 = VCLK_1280x800_315;
1833 SiS_GetLCDInfoBIOS(SiS_Pr);
1835 case Panel_1280x800_2: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 800;
1836 SiS_Pr->PanelHT = 1552; SiS_Pr->PanelVT = 812;
1837 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112;
1838 SiS_Pr->PanelVRS = 4; SiS_Pr->PanelVRE = 3;
1839 SiS_Pr->PanelVCLKIdx315 = VCLK_1280x800_315_2;
1840 SiS_GetLCDInfoBIOS(SiS_Pr);
1842 case Panel_1280x854: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 854;
1843 SiS_Pr->PanelHT = 1664; SiS_Pr->PanelVT = 861;
1844 SiS_Pr->PanelHRS = 16; SiS_Pr->PanelHRE = 112;
1845 SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
1846 SiS_Pr->PanelVCLKIdx315 = VCLK_1280x854;
1847 SiS_GetLCDInfoBIOS(SiS_Pr);
1849 case Panel_1280x960: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 960;
1850 SiS_Pr->PanelHT = 1800; SiS_Pr->PanelVT = 1000;
1851 SiS_Pr->PanelVCLKIdx300 = VCLK108_3_300;
1852 SiS_Pr->PanelVCLKIdx315 = VCLK108_3_315;
1854 SiS_Pr->PanelVCLKIdx300 = VCLK100_300;
1855 SiS_Pr->PanelVCLKIdx315 = VCLK100_315;
1858 case Panel_1280x1024: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 1024;
1859 SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
1860 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112;
1861 SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
1862 SiS_Pr->PanelVCLKIdx300 = VCLK108_3_300;
1863 SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
1864 SiS_GetLCDInfoBIOS(SiS_Pr);
1866 case Panel_1400x1050: SiS_Pr->PanelXRes = 1400; SiS_Pr->PanelYRes = 1050;
1867 SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
1868 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112;
1869 SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
1870 SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
1871 SiS_GetLCDInfoBIOS(SiS_Pr);
1873 case Panel_1600x1200: SiS_Pr->PanelXRes = 1600; SiS_Pr->PanelYRes = 1200;
1874 SiS_Pr->PanelHT = 2160; SiS_Pr->PanelVT = 1250;
1875 SiS_Pr->PanelHRS = 64; SiS_Pr->PanelHRE = 192;
1876 SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
1877 SiS_Pr->PanelVCLKIdx315 = VCLK162_315;
1878 if(SiS_Pr->SiS_VBType & VB_SISTMDSLCDA) {
1879 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
1880 SiS_Pr->PanelHT = 1760; SiS_Pr->PanelVT = 1235;
1881 SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 32;
1882 SiS_Pr->PanelVRS = 2; SiS_Pr->PanelVRE = 4;
1883 SiS_Pr->PanelVCLKIdx315 = VCLK130_315;
1884 SiS_Pr->Alternate1600x1200 = TRUE;
1886 } else if(SiS_Pr->SiS_IF_DEF_LVDS) {
1887 SiS_Pr->PanelHT = 2048; SiS_Pr->PanelVT = 1320;
1888 SiS_Pr->PanelHRS = SiS_Pr->PanelHRE = 999;
1889 SiS_Pr->PanelVRS = SiS_Pr->PanelVRE = 999;
1891 SiS_GetLCDInfoBIOS(SiS_Pr);
1893 case Panel_1680x1050: SiS_Pr->PanelXRes = 1680; SiS_Pr->PanelYRes = 1050;
1894 SiS_Pr->PanelHT = 1900; SiS_Pr->PanelVT = 1066;
1895 SiS_Pr->PanelHRS = 26; SiS_Pr->PanelHRE = 76;
1896 SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
1897 SiS_Pr->PanelVCLKIdx315 = VCLK121_315;
1898 SiS_GetLCDInfoBIOS(SiS_Pr);
1900 case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024;
1901 SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
1903 case Panel_848x480: SiS_Pr->PanelXRes = 848; SiS_Pr->PanelYRes = 480;
1904 SiS_Pr->PanelHT = 1088; SiS_Pr->PanelVT = 525;
1906 case Panel_856x480: SiS_Pr->PanelXRes = 856; SiS_Pr->PanelYRes = 480;
1907 SiS_Pr->PanelHT = 1088; SiS_Pr->PanelVT = 525;
1909 case Panel_Custom: SiS_Pr->PanelXRes = SiS_Pr->CP_MaxX;
1910 SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY;
1911 SiS_Pr->PanelHT = SiS_Pr->CHTotal;
1912 SiS_Pr->PanelVT = SiS_Pr->CVTotal;
1913 if(SiS_Pr->CP_PreferredIndex != -1) {
1914 SiS_Pr->PanelXRes = SiS_Pr->CP_HDisplay[SiS_Pr->CP_PreferredIndex];
1915 SiS_Pr->PanelYRes = SiS_Pr->CP_VDisplay[SiS_Pr->CP_PreferredIndex];
1916 SiS_Pr->PanelHT = SiS_Pr->CP_HTotal[SiS_Pr->CP_PreferredIndex];
1917 SiS_Pr->PanelVT = SiS_Pr->CP_VTotal[SiS_Pr->CP_PreferredIndex];
1918 SiS_Pr->PanelHRS = SiS_Pr->CP_HSyncStart[SiS_Pr->CP_PreferredIndex];
1919 SiS_Pr->PanelHRE = SiS_Pr->CP_HSyncEnd[SiS_Pr->CP_PreferredIndex];
1920 SiS_Pr->PanelVRS = SiS_Pr->CP_VSyncStart[SiS_Pr->CP_PreferredIndex];
1921 SiS_Pr->PanelVRE = SiS_Pr->CP_VSyncEnd[SiS_Pr->CP_PreferredIndex];
1922 SiS_Pr->PanelHRS -= SiS_Pr->PanelXRes;
1923 SiS_Pr->PanelHRE -= SiS_Pr->PanelHRS;
1924 SiS_Pr->PanelVRS -= SiS_Pr->PanelYRes;
1925 SiS_Pr->PanelVRE -= SiS_Pr->PanelVRS;
1926 if(SiS_Pr->CP_PrefClock) {
1928 SiS_Pr->PanelVCLKIdx315 = VCLK_CUSTOM_315;
1929 SiS_Pr->PanelVCLKIdx300 = VCLK_CUSTOM_300;
1930 if(SiS_Pr->ChipType < SIS_315H) idx = VCLK_CUSTOM_300;
1932 SiS_Pr->SiS_VCLKData[idx].CLOCK =
1933 SiS_Pr->SiS_VBVCLKData[idx].CLOCK = SiS_Pr->CP_PrefClock;
1934 SiS_Pr->SiS_VCLKData[idx].SR2B =
1935 SiS_Pr->SiS_VBVCLKData[idx].Part4_A = SiS_Pr->CP_PrefSR2B;
1936 SiS_Pr->SiS_VCLKData[idx].SR2C =
1937 SiS_Pr->SiS_VBVCLKData[idx].Part4_B = SiS_Pr->CP_PrefSR2C;
1941 default: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768;
1942 SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
1947 if( (SiS_Pr->SiS_IF_DEF_FSTN) ||
1948 (SiS_Pr->SiS_IF_DEF_DSTN) ||
1949 (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
1950 (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
1951 (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
1952 (SiS_Pr->SiS_CustomT == CUT_PANEL856) ) {
1953 SiS_Pr->PanelHRS = 999;
1954 SiS_Pr->PanelHRE = 999;
1957 if( (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
1958 (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
1959 (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
1960 (SiS_Pr->SiS_CustomT == CUT_PANEL856) ) {
1961 SiS_Pr->PanelVRS = 999;
1962 SiS_Pr->PanelVRE = 999;
1966 if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
1968 if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (modeflag & NoSupportLCDScale)) {
1970 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
1973 switch(SiS_Pr->SiS_LCDResInfo) {
1978 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
1985 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
1994 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2003 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2004 if(SiS_Pr->PanelHT == 1650) {
2005 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2015 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2017 case SIS_RI_1280x720: if(SiS_Pr->UsePanelScaler == -1) {
2018 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2030 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2039 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2042 case SIS_RI_1280x768: if(SiS_Pr->UsePanelScaler == -1) {
2043 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2055 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2059 case SIS_RI_1280x800: if(SiS_Pr->UsePanelScaler == -1) {
2060 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2073 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2083 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2093 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2095 case SIS_RI_1280x720: if(SiS_Pr->UsePanelScaler == -1) {
2096 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2099 case SIS_RI_1280x1024: SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
2111 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2121 SiS_CheckScaling(SiS_Pr, resinfo, nonscalingmodes);
2128 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
2129 if(SiS_Pr->SiS_CustomT == CUT_PANEL848 || SiS_Pr->SiS_CustomT == CUT_PANEL856) {
2130 SiS_Pr->SiS_LCDInfo = 0x80 | 0x40 | 0x20; /* neg h/v sync, RGB24(D0 = 0) */
2134 if(SiS_Pr->ChipType < SIS_315H) {
2135 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
2136 if(SiS_Pr->SiS_UseROM) {
2139 SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
2143 } else if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
2144 if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
2145 SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
2153 if(modexres == SiS_Pr->PanelXRes && modeyres == SiS_Pr->PanelYRes) {
2154 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
2157 if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
2158 SiS_Pr->SiS_LCDInfo |= (DontExpandLCD | LCDPass11);
2161 switch(SiS_Pr->SiS_LCDResInfo) {
2163 SiS_Pr->SiS_LCDInfo |= (DontExpandLCD | LCDPass11);
2167 if(SiS_Pr->CenterScreen == -1) SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
2170 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
2173 if((!SiS_Pr->CP_PrefClock) ||
2174 (modexres > SiS_Pr->PanelXRes) || (modeyres > SiS_Pr->PanelYRes)) {
2175 SiS_Pr->SiS_LCDInfo |= LCDPass11;
2180 if((SiS_Pr->UseCustomMode) || (SiS_Pr->SiS_CustomT == CUT_UNKNOWNLCD)) {
2181 SiS_Pr->SiS_LCDInfo |= (DontExpandLCD | LCDPass11);
2185 if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
2186 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
2190 if(!((SiS_Pr->ChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & SetDOSMode))) {
2192 if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBType & VB_NoLCD)) {
2193 if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
2195 if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
2196 SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2199 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x600) {
2200 if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
2202 SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2211 if(SiS_Pr->SiS_IF_DEF_TRUMPION == 1) {
2212 SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2213 } else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
2214 SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2215 } else if(SiS_Pr->SiS_LCDResInfo == Panel_640x480) {
2216 SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2218 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
2219 if(resinfo == SIS_RI_512x384) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2220 } else if(SiS_Pr->SiS_LCDResInfo == Panel_800x600) {
2221 if(resinfo == SIS_RI_400x300) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
2229 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
2230 if(SiS_Pr->SiS_VBInfo & SetNotSimuMode) {
2231 SiS_Pr->SiS_SetFlag |= LCDVESATiming;
2234 SiS_Pr->SiS_SetFlag |= LCDVESATiming;
2240 SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo);
2246 SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo, SiS_Pr->SiS_SetFlag);
2255 SiS_GetVCLK2Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
2263 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
2264 CRT2Index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2265 VCLKIndexGEN = (SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02)) >> 2) & 0x03;
2268 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2269 CRT2Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2270 VCLKIndexGEN = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2271 VCLKIndexGENCRT = SiS_GetRefCRTVCLK(SiS_Pr, RefreshRateTableIndex,
2272 (SiS_Pr->SiS_SetFlag & ProgrammingCRT2) ? SiS_Pr->SiS_UseWideCRT2 : SiS_Pr->SiS_UseWide);
2275 if(SiS_Pr->SiS_VBType & VB_SISVB) { /* 30x/B/LV */
2277 if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
2280 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /* LCD */
2282 if(SiS_Pr->ChipType < SIS_315H) {
2283 VCLKIndex = SiS_Pr->PanelVCLKIdx300;
2284 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
2288 VCLKIndex = SiS_Pr->PanelVCLKIdx315;
2289 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
2306 if(SiS_Pr->ChipType <= SIS_315PRO) {
2307 if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
2309 if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x00;
2312 if(SiS_Pr->ChipType <= SIS_315PRO) {
2320 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* TV */
2322 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
2323 if(SiS_Pr->SiS_TVMode & TVRPLLDIV2XO) VCLKIndex = HiTVVCLKDIV2;
2325 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) VCLKIndex = HiTVSimuVCLK;
2326 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p)
2328 else if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr625p | TVRPLLDIV2XO))
2333 if(SiS_Pr->ChipType < SIS_315H) VCLKIndex += TVCLKBASE_300;
2339 if(SiS_Pr->ChipType < SIS_315H) {
2341 if( (SiS_Pr->ChipType == SIS_630) &&
2342 (SiS_Pr->ChipRevision >= 0x30)) {
2354 if(SiS_Pr->ChipType < SIS_315H) {
2356 if( (SiS_Pr->ChipType != SIS_630) &&
2357 (SiS_Pr->ChipType != SIS_300) ) {
2368 if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
2370 if( (SiS_Pr->SiS_IF_DEF_CH70xx != 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
2374 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
2375 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
2377 if(SiS_Pr->SiS_ModeType > ModeVGA) {
2378 if(SiS_Pr->SiS_CHSOverScan) tempbx = 8;
2380 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
2382 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
2383 } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
2385 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
2389 case 0: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUNTSC; break;
2390 case 1: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKONTSC; break;
2391 case 2: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPAL; break;
2392 case 3: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
2393 case 4: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALM; break;
2394 case 5: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALM; break;
2395 case 6: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALN; break;
2396 case 7: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALN; break;
2397 case 8: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKSOPAL; break;
2398 default: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
2402 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
2404 if(SiS_Pr->ChipType < SIS_315H) {
2405 VCLKIndex = SiS_Pr->PanelVCLKIdx300;
2407 VCLKIndex = SiS_Pr->PanelVCLKIdx315;
2412 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) VCLKIndex = 0x44;
2415 if(SiS_Pr->SiS_CustomT == CUT_PANEL848 || SiS_Pr->SiS_CustomT == CUT_PANEL856) {
2416 if(SiS_Pr->ChipType < SIS_315H) {
2429 if(SiS_Pr->ChipType < SIS_315H) {
2431 if( (SiS_Pr->ChipType == SIS_630) &&
2432 (SiS_Pr->ChipRevision >= 0x30) ) {
2442 if(SiS_Pr->ChipType < SIS_315H) {
2444 if( (SiS_Pr->ChipType != SIS_630) &&
2445 (SiS_Pr->ChipType != SIS_300) ) {
2449 if(SiS_Pr->ChipType == SIS_730) {
2475 SiS_SetCRT2ModeRegs(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
2483 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
2487 modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);
2489 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
2491 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xAF,0x40);
2492 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0xF7);
2496 for(i=0,j=4; i<3; i++,j++) SiS_SetReg(SiS_Pr->SiS_Part1Port,j,0);
2497 if(SiS_Pr->ChipType >= SIS_315H) {
2498 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0x7F);
2501 tempcl = SiS_Pr->SiS_ModeType;
2503 if(SiS_Pr->ChipType < SIS_315H) {
2508 if(SiS_Pr->SiS_VBType & VB_NoLCD) {
2509 tempbl = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32);
2512 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
2516 SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,tempbl);
2526 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0xA0;
2543 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0x50;
2549 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
2551 if(SiS_Pr->ChipType < SIS_315H) {
2552 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,tempah);
2555 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
2556 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah);
2557 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
2559 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,tempah);
2561 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah);
2567 if(SiS_Pr->SiS_VBType & VB_SISVB) {
2570 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
2573 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
2575 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
2580 if(SiS_Pr->ChipType < SIS_315H) {
2582 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
2585 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,tempah);
2590 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0x08;
2591 else if(!(SiS_IsDualEdge(SiS_Pr))) tempah |= 0x08;
2592 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2E,0xF0,tempah);
2597 if((SiS_Pr->SiS_ModeType == ModeVGA) && (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode))) {
2602 if(SiS_Pr->SiS_VBType & VB_SIS301) {
2603 if(SiS_Pr->PanelXRes < 1280 && SiS_Pr->PanelYRes < 960) tempah &= ~0x80;
2606 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
2607 if(!(SiS_Pr->SiS_TVMode & TVSetYPbPrProg)) {
2608 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
2614 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0D,0x40,tempah);
2617 if(SiS_Pr->SiS_VBType & VB_SIS301) {
2618 if(SiS_Pr->PanelXRes < 1280 && SiS_Pr->PanelYRes < 960) tempah = 0;
2621 if(SiS_IsDualLink(SiS_Pr)) tempah |= 0x40;
2623 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
2624 if(SiS_Pr->SiS_TVMode & TVRPLLDIV2XO) {
2629 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0C,tempah);
2633 if(SiS_Pr->ChipType >= SIS_315H) {
2638 if((modeflag & CRT2Mode) && (SiS_Pr->SiS_ModeType > ModeVGA)) {
2639 if(SiS_Pr->SiS_VBInfo & DriverMode) {
2644 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) tempah |= 0x02;
2646 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempah ^= 0x01;
2648 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 1;
2650 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2e,0xF0,tempah);
2657 if( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
2662 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
2664 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,tempah);
2673 if(SiS_Pr->SiS_VBType & VB_SISVB) {
2675 if(SiS_Pr->ChipType >= SIS_315H) {
2678 /* unsigned char bridgerev = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01); */
2694 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
2696 if(SiS_IsDualEdge(SiS_Pr)) {
2700 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
2712 if((IS_SIS740) || (SiS_Pr->ChipType >= SIS_661) || (SiS_Pr->SiS_ROMNew)) {
2715 if((SiS_Pr->SiS_VBInfo & DisableCRT2Display) ||
2716 ((SiS_Pr->SiS_ROMNew) && (!(ROMAddr[0x5b] & 0x04)))) {
2720 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,tempah);
2721 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,tempbl);
2722 } else if(SiS_Pr->SiS_VBType & VB_SIS301) {
2724 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xcf); /* For 301 */
2725 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x21,0x3f);
2726 } else if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
2727 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30); /* For 30xLV */
2728 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x21,0xc0);
2729 } else if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* For 301B-DH */
2732 if(SiS_Pr->SiS_TVBlue == 0) {
2734 } else if(SiS_Pr->SiS_TVBlue == -1) {
2740 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
2741 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl2,tempah2);
2745 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
2747 if(SiS_IsDualEdge(SiS_Pr)) {
2751 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
2752 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl2,tempah2);
2757 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0x00;
2758 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,0x7f,tempah);
2762 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
2764 if(!(SiS_IsDualEdge(SiS_Pr))) tempah = 0x80;
2766 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
2771 } else if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
2774 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x21,0x3f);
2776 if((SiS_Pr->SiS_VBInfo & DisableCRT2Display) ||
2777 ((SiS_Pr->SiS_VBType & VB_NoLCD) &&
2778 (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD))) {
2779 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x23,0x7F);
2781 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x23,0x80);
2787 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
2788 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x0D,0x80);
2789 if(SiS_Pr->SiS_VBType & VB_SIS30xCLV) {
2790 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x3A,0xC0);
2797 if(SiS_Pr->ChipType >= SIS_315H) {
2799 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
2803 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
2805 if(SiS_IsDualEdge(SiS_Pr)) tempbl = 0xff;
2807 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
2809 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
2810 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
2813 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30);
2815 } else if(SiS_Pr->ChipType == SIS_550) {
2817 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
2818 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30);
2834 SiS_GetResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
2837 return ((unsigned short)SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo);
2839 return ((unsigned short)SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO);
2843 SiS_GetCRT2ResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
2847 if(SiS_Pr->UseCustomMode) {
2848 xres = SiS_Pr->CHDisplay;
2849 if(SiS_Pr->CModeFlag & HalfDCLK) xres <<= 1;
2850 SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
2852 SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = SiS_Pr->CVDisplay;
2856 resindex = SiS_GetResInfo(SiS_Pr,ModeNo,ModeIdIndex);
2859 xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
2860 yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
2862 xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
2863 yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
2864 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2867 if(!SiS_Pr->SiS_IF_DEF_DSTN && !SiS_Pr->SiS_IF_DEF_FSTN) {
2869 if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
2870 if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
2873 if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
2883 if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
2885 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
2886 switch(SiS_Pr->SiS_LCDResInfo) {
2888 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
2889 if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
2897 if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
2902 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
2907 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
2916 if(SiS_Pr->SiS_VBType & VB_SISVB) {
2917 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVision)) {
2922 if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
2924 if(SiS_Pr->ChipType >= SIS_315H) {
2925 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
2927 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
2929 if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) yres = 480;
2933 SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
2934 SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = yres;
2942 SiS_GetCRT2Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
2949 tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2951 tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2952 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2955 if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_IF_DEF_LVDS == 0)) {
2957 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
2959 tempbx = SiS_Pr->SiS_LCDResInfo;
2960 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 32;
2963 if(SiS_Pr->SiS_LCDResInfo == Panel_1680x1050) {
2966 } else if((SiS_Pr->SiS_LCDResInfo == Panel_1280x800) ||
2967 (SiS_Pr->SiS_LCDResInfo == Panel_1280x800_2) ||
2968 (SiS_Pr->SiS_LCDResInfo == Panel_1280x854)) {
2972 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
2978 tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC_NS;
2983 if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
2984 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
2985 if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
2987 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx++;
2995 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
2996 /* if(SiS_Pr->SiS_VGAVDE > 480) SiS_Pr->SiS_TVMode &= (~TVSetTVSimuMode); */
2998 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
3000 if(!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) tempbx = 14;
3002 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
3003 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempbx = 7;
3004 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) tempbx = 6;
3005 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr625i) tempbx = 15;
3006 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr625p) tempbx = 16;
3008 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) tempbx += 5;
3010 if(SiS_Pr->SiS_TVMode & TVSetPAL) tempbx = 3;
3012 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) tempbx += 5;
3020 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision) {
3024 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempal = 6;
3030 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
3037 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempal = 9;
3042 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr625p)) {
3047 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempal = 11;
3059 if((SiS_Pr->SiS_IF_DEF_CH70xx) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
3062 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
3064 if(SiS_Pr->SiS_ModeType > ModeVGA) {
3065 if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
3067 if(SiS_Pr->SiS_TVMode & TVSetPALM) tempbx = 94;
3068 else if(SiS_Pr->SiS_TVMode & TVSetPALN) tempbx = 96;
3071 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx++;
3076 switch(SiS_Pr->SiS_LCDResInfo) {
3094 switch(SiS_Pr->SiS_LCDResInfo) {
3101 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
3104 if(SiS_Pr->SiS_LCDInfo & LCDPass11) tempbx = 30;
3107 if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
3109 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
3110 } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848 || SiS_Pr->SiS_CustomT == CUT_PANEL856) {
3112 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
3124 SiS_GetRAMDAC2DATA(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
3130 SiS_Pr->SiS_RVBHCMAX = 1;
3131 SiS_Pr->SiS_RVBHCFACT = 1;
3135 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
3136 index = SiS_GetModePtr(SiS_Pr,ModeNo,ModeIdIndex);
3138 tempax = SiS_Pr->SiS_StandTable[index].CRTC[0];
3139 tempbx = SiS_Pr->SiS_StandTable[index].CRTC[6];
3140 temp1 = SiS_Pr->SiS_StandTable[index].CRTC[7];
3146 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3147 index = SiS_GetRefCRT1CRTC(SiS_Pr, RefreshRateTableIndex, SiS_Pr->SiS_UseWideCRT2);
3149 tempax = SiS_Pr->SiS_CRT1Table[index].CR[0];
3150 tempax |= (SiS_Pr->SiS_CRT1Table[index].CR[14] << 8);
3152 tempbx = SiS_Pr->SiS_CRT1Table[index].CR[6];
3153 tempcx = SiS_Pr->SiS_CRT1Table[index].CR[13] << 8;
3157 temp1 = SiS_Pr->SiS_CRT1Table[index].CR[7];
3172 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
3173 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
3177 SiS_CalcPanelLinkTiming(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
3182 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3183 if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
3184 if(SiS_Pr->UseCustomMode) {
3185 ResIndex = SiS_Pr->CHTotal;
3186 if(SiS_Pr->CModeFlag & HalfDCLK) ResIndex <<= 1;
3187 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = ResIndex;
3188 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->CVTotal;
3191 ResIndex = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
3193 ResIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC_NS;
3196 if(SiS_Pr->Alternate1600x1200) ResIndex = 0x20; /* 1600x1200 LCDA */
3197 else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) ResIndex = 0x21; /* 1600x1200 LVDS */
3199 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_NoScaleData[ResIndex].VGAHT;
3200 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_NoScaleData[ResIndex].VGAVT;
3201 SiS_Pr->SiS_HT = SiS_Pr->SiS_NoScaleData[ResIndex].LCDHT;
3202 SiS_Pr->SiS_VT = SiS_Pr->SiS_NoScaleData[ResIndex].LCDVT;
3205 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
3206 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
3210 SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
3211 SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
3212 SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
3213 SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
3214 SiS_Pr->SiS_VGAHT = SiS_Pr->PanelHT - (SiS_Pr->PanelXRes - SiS_Pr->SiS_VGAHDE);
3215 SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT - (SiS_Pr->PanelYRes - SiS_Pr->SiS_VGAVDE);
3220 SiS_GetCRT2DataLVDS(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
3226 SiS_GetCRT2ResInfo(SiS_Pr, ModeNo, ModeIdIndex);
3228 if(SiS_Pr->SiS_VBType & VB_SISVB) {
3229 SiS_Pr->SiS_RVBHCMAX = 1;
3230 SiS_Pr->SiS_RVBHCFACT = 1;
3231 SiS_Pr->SiS_NewFlickerMode = 0;
3232 SiS_Pr->SiS_RVBHRS = 50;
3233 SiS_Pr->SiS_RY1COE = 0;
3234 SiS_Pr->SiS_RY2COE = 0;
3235 SiS_Pr->SiS_RY3COE = 0;
3236 SiS_Pr->SiS_RY4COE = 0;
3237 SiS_Pr->SiS_RVBHRS2 = 0;
3240 if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
3243 SiS_CalcPanelLinkTiming(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3244 SiS_CalcLCDACRT1Timing(SiS_Pr, ModeNo, ModeIdIndex);
3250 backup = SiS_Pr->SiS_IF_DEF_LVDS;
3251 if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
3252 SiS_Pr->SiS_IF_DEF_LVDS = 1;
3255 SiS_GetCRT2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
3258 SiS_Pr->SiS_IF_DEF_LVDS = backup;
3261 case 10: LVDSData = SiS_Pr->SiS_LVDS320x240Data_1; break;
3262 case 14: LVDSData = SiS_Pr->SiS_LVDS320x240Data_2; break;
3263 case 12: LVDSData = SiS_Pr->SiS_LVDS640x480Data_1; break;
3264 case 16: LVDSData = SiS_Pr->SiS_LVDS800x600Data_1; break;
3265 case 18: LVDSData = SiS_Pr->SiS_LVDS1024x600Data_1; break;
3266 case 20: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
3268 case 80: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_1; break;
3269 case 81: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2; break;
3270 case 82: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1; break;
3271 case 84: LVDSData = SiS_Pr->SiS_LVDS848x480Data_1; break;
3272 case 85: LVDSData = SiS_Pr->SiS_LVDS848x480Data_2; break;
3274 case 90: LVDSData = SiS_Pr->SiS_CHTVUNTSCData; break;
3275 case 91: LVDSData = SiS_Pr->SiS_CHTVONTSCData; break;
3276 case 92: LVDSData = SiS_Pr->SiS_CHTVUPALData; break;
3277 case 93: LVDSData = SiS_Pr->SiS_CHTVOPALData; break;
3278 case 94: LVDSData = SiS_Pr->SiS_CHTVUPALMData; break;
3279 case 95: LVDSData = SiS_Pr->SiS_CHTVOPALMData; break;
3280 case 96: LVDSData = SiS_Pr->SiS_CHTVUPALNData; break;
3281 case 97: LVDSData = SiS_Pr->SiS_CHTVOPALNData; break;
3282 case 99: LVDSData = SiS_Pr->SiS_CHTVSOPALData; break;
3286 SiS_Pr->SiS_VGAHT = (LVDSData+ResIndex)->VGAHT;
3287 SiS_Pr->SiS_VGAVT = (LVDSData+ResIndex)->VGAVT;
3288 SiS_Pr->SiS_HT = (LVDSData+ResIndex)->LCDHT;
3289 SiS_Pr->SiS_VT = (LVDSData+ResIndex)->LCDVT;
3291 SiS_CalcPanelLinkTiming(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3294 if( (!(SiS_Pr->SiS_VBType & VB_SISVB)) &&
3295 (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
3296 (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) ) {
3297 if( (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ||
3298 (SiS_Pr->SiS_SetFlag & SetDOSMode) ) {
3299 SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
3300 SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
3302 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
3304 SiS_Pr->SiS_HDE = 1280;
3305 SiS_Pr->SiS_VDE = 1024;
3315 SiS_GetCRT2Data301(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
3328 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
3329 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
3330 } else if(SiS_Pr->UseCustomMode) {
3331 modeflag = SiS_Pr->CModeFlag;
3334 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3335 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3337 resinfo661 = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].ROMMODEIDX661;
3338 if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
3339 (SiS_Pr->SiS_SetFlag & LCDVESATiming) &&
3341 (SiS_Pr->SiS_NeedRomModeData) ) {
3342 if((ROMAddr = GetLCDStructPtr661(SiS_Pr))) {
3345 ROMAddr = SiS_Pr->VirtualRomBase;
3352 SiS_Pr->SiS_NewFlickerMode = 0;
3353 SiS_Pr->SiS_RVBHRS = 50;
3354 SiS_Pr->SiS_RY1COE = 0;
3355 SiS_Pr->SiS_RY2COE = 0;
3356 SiS_Pr->SiS_RY3COE = 0;
3357 SiS_Pr->SiS_RY4COE = 0;
3358 SiS_Pr->SiS_RVBHRS2 = 0;
3360 SiS_GetCRT2ResInfo(SiS_Pr,ModeNo,ModeIdIndex);
3362 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
3364 if(SiS_Pr->UseCustomMode) {
3366 SiS_Pr->SiS_RVBHCMAX = 1;
3367 SiS_Pr->SiS_RVBHCFACT = 1;
3368 SiS_Pr->SiS_HDE = SiS_Pr->SiS_VGAHDE;
3369 SiS_Pr->SiS_VDE = SiS_Pr->SiS_VGAVDE;
3371 tempax = SiS_Pr->CHTotal;
3373 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
3374 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->CVTotal;
3378 SiS_GetRAMDAC2DATA(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3382 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
3384 SiS_GetCRT2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
3388 case 2: TVPtr = SiS_Pr->SiS_ExtHiTVData; break;
3389 case 3: TVPtr = SiS_Pr->SiS_ExtPALData; break;
3390 case 4: TVPtr = SiS_Pr->SiS_ExtNTSCData; break;
3391 case 5: TVPtr = SiS_Pr->SiS_Ext525iData; break;
3392 case 6: TVPtr = SiS_Pr->SiS_Ext525pData; break;
3393 case 7: TVPtr = SiS_Pr->SiS_Ext750pData; break;
3394 case 8: TVPtr = SiS_Pr->SiS_StPALData; break;
3395 case 9: TVPtr = SiS_Pr->SiS_StNTSCData; break;
3396 case 10: TVPtr = SiS_Pr->SiS_St525iData; break;
3397 case 11: TVPtr = SiS_Pr->SiS_St525pData; break;
3398 case 12: TVPtr = SiS_Pr->SiS_St750pData; break;
3399 case 13: TVPtr = SiS_Pr->SiS_St1HiTVData; break;
3400 case 14: TVPtr = SiS_Pr->SiS_St2HiTVData; break;
3401 case 15: TVPtr = SiS_Pr->SiS_Ext625iData; break;
3402 case 16: TVPtr = SiS_Pr->SiS_Ext625pData; break;
3403 case 20: TVPtr = SiS_Pr->SiS_St625iData; break;
3404 case 21: TVPtr = SiS_Pr->SiS_St625pData; break;
3405 default: TVPtr = SiS_Pr->SiS_StPALData; break;
3408 SiS_Pr->SiS_RVBHCMAX = (TVPtr+ResIndex)->RVBHCMAX;
3409 SiS_Pr->SiS_RVBHCFACT = (TVPtr+ResIndex)->RVBHCFACT;
3410 SiS_Pr->SiS_VGAHT = (TVPtr+ResIndex)->VGAHT;
3411 SiS_Pr->SiS_VGAVT = (TVPtr+ResIndex)->VGAVT;
3412 SiS_Pr->SiS_HDE = (TVPtr+ResIndex)->TVHDE;
3413 SiS_Pr->SiS_VDE = (TVPtr+ResIndex)->TVVDE;
3414 SiS_Pr->SiS_RVBHRS2 = (TVPtr+ResIndex)->RVBHRS2 & 0x0fff;
3416 SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->HALFRVBHRS;
3417 if(SiS_Pr->SiS_RVBHRS2) {
3418 SiS_Pr->SiS_RVBHRS2 = ((SiS_Pr->SiS_RVBHRS2 + 3) >> 1) - 3;
3420 if((TVPtr+ResIndex)->RVBHRS2 & 0x8000) SiS_Pr->SiS_RVBHRS2 -= tempax;
3421 else SiS_Pr->SiS_RVBHRS2 += tempax;
3424 SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->RVBHRS;
3426 SiS_Pr->SiS_NewFlickerMode = ((TVPtr+ResIndex)->FlickerMode) << 7;
3428 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
3435 SiS_Pr->SiS_NewFlickerMode = 0x40;
3438 if(SiS_Pr->SiS_VGAVDE == 350) SiS_Pr->SiS_TVMode |= TVSetTVSimuMode;
3440 SiS_Pr->SiS_HT = ExtHiTVHT;
3441 SiS_Pr->SiS_VT = ExtHiTVVT;
3442 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
3443 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
3444 SiS_Pr->SiS_HT = StHiTVHT;
3445 SiS_Pr->SiS_VT = StHiTVVT;
3449 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
3451 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
3452 SiS_Pr->SiS_HT = 1650;
3453 SiS_Pr->SiS_VT = 750;
3454 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
3455 SiS_Pr->SiS_HT = NTSCHT;
3456 if(SiS_Pr->SiS_TVMode & TVSet525p1024) SiS_Pr->SiS_HT = NTSC2HT;
3457 SiS_Pr->SiS_VT = NTSCVT;
3458 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) {
3459 SiS_Pr->SiS_HT = NTSCHT;
3460 if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) SiS_Pr->SiS_HT = NTSC2HT;
3461 SiS_Pr->SiS_VT = NTSCVT;
3463 SiS_Pr->SiS_HT = PALHT;
3464 SiS_Pr->SiS_VT = PALVT;
3469 SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
3470 SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
3471 SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
3472 SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
3475 SiS_Pr->SiS_RY1COE = 0x00;
3476 SiS_Pr->SiS_RY2COE = 0xf4;
3477 SiS_Pr->SiS_RY3COE = 0x10;
3478 SiS_Pr->SiS_RY4COE = 0x38;
3481 if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
3482 SiS_Pr->SiS_HT = NTSCHT;
3483 if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) SiS_Pr->SiS_HT = NTSC2HT;
3484 SiS_Pr->SiS_VT = NTSCVT;
3486 SiS_Pr->SiS_HT = PALHT;
3487 SiS_Pr->SiS_VT = PALVT;
3492 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
3494 SiS_Pr->SiS_RVBHCMAX = 1;
3495 SiS_Pr->SiS_RVBHCFACT = 1;
3497 if(SiS_Pr->UseCustomMode) {
3499 SiS_Pr->SiS_HDE = SiS_Pr->SiS_VGAHDE;
3500 SiS_Pr->SiS_VDE = SiS_Pr->SiS_VGAVDE;
3502 tempax = SiS_Pr->CHTotal;
3504 SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
3505 SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->CVTotal;
3511 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
3513 SiS_Pr->SiS_VGAHT = SiS_Pr->PanelHT;
3514 SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT;
3515 SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
3516 SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
3519 } else if( (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) && (romptr) && (ROMAddr) ) {
3522 SiS_Pr->SiS_RVBHCMAX = ROMAddr[romptr];
3523 SiS_Pr->SiS_RVBHCFACT = ROMAddr[romptr+1];
3524 SiS_Pr->SiS_VGAHT = ROMAddr[romptr+2] | ((ROMAddr[romptr+3] & 0x0f) << 8);
3525 SiS_Pr->SiS_VGAVT = (ROMAddr[romptr+4] << 4) | ((ROMAddr[romptr+3] & 0xf0) >> 4);
3526 SiS_Pr->SiS_HT = ROMAddr[romptr+5] | ((ROMAddr[romptr+6] & 0x0f) << 8);
3527 SiS_Pr->SiS_VT = (ROMAddr[romptr+7] << 4) | ((ROMAddr[romptr+6] & 0xf0) >> 4);
3528 SiS_Pr->SiS_RVBHRS2 = ROMAddr[romptr+8] | ((ROMAddr[romptr+9] & 0x0f) << 8);
3529 if((SiS_Pr->SiS_RVBHRS2) && (modeflag & HalfDCLK)) {
3530 SiS_Pr->SiS_RVBHRS2 = ((SiS_Pr->SiS_RVBHRS2 + 3) >> 1) - 3;
3532 if(ROMAddr[romptr+9] & 0x80) SiS_Pr->SiS_RVBHRS2 -= tempax;
3533 else SiS_Pr->SiS_RVBHRS2 += tempax;
3535 if(SiS_Pr->SiS_VGAHT) gotit = TRUE;
3537 SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
3538 SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
3539 SiS_Pr->SiS_RVBHCMAX = 1;
3540 SiS_Pr->SiS_RVBHCFACT = 1;
3541 SiS_Pr->SiS_VGAHT = SiS_Pr->PanelHT;
3542 SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT;
3543 SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
3544 SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
3545 SiS_Pr->SiS_RVBHRS2 = 0;
3554 SiS_GetCRT2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
3558 case Panel_1024x768 : LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break;
3559 case Panel_1024x768 + 32: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data; break;
3561 case Panel_1280x720 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x720Data; break;
3562 case Panel_1280x768_2 : LCDPtr = SiS_Pr->SiS_ExtLCD1280x768_2Data; break;
3563 case Panel_1280x768_2+ 32: LCDPtr = SiS_Pr->SiS_StLCD1280x768_2Data; break;
3565 case Panel_1280x800 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x800Data; break;
3567 case Panel_1280x800_2+ 32: LCDPtr = SiS_Pr->SiS_LCD1280x800_2Data; break;
3569 case Panel_1280x854 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x854Data; break;
3571 case Panel_1280x960 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x960Data; break;
3572 case Panel_1280x1024 : LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data; break;
3573 case Panel_1280x1024 + 32: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break;
3574 case Panel_1400x1050 : LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data; break;
3575 case Panel_1400x1050 + 32: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data; break;
3576 case Panel_1600x1200 : LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data; break;
3577 case Panel_1600x1200 + 32: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data; break;
3579 case Panel_1680x1050 + 32: LCDPtr = SiS_Pr->SiS_LCD1680x1050Data; break;
3580 case 100 : LCDPtr = SiS_Pr->SiS_NoScaleData; break;
3583 case 201 : LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break;
3585 default : LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break;
3594 SiS_Pr->SiS_RVBHCMAX = (LCDPtr+ResIndex)->RVBHCMAX;
3595 SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
3596 SiS_Pr->SiS_VGAHT = (LCDPtr+ResIndex)->VGAHT;
3597 SiS_Pr->SiS_VGAVT = (LCDPtr+ResIndex)->VGAVT;
3598 SiS_Pr->SiS_HT = (LCDPtr+ResIndex)->LCDHT;
3599 SiS_Pr->SiS_VT = (LCDPtr+ResIndex)->LCDVT;
3603 tempax = SiS_Pr->PanelXRes;
3604 tempbx = SiS_Pr->PanelYRes;
3606 switch(SiS_Pr->SiS_LCDResInfo) {
3608 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
3609 if(SiS_Pr->ChipType < SIS_315H) {
3610 if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
3611 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
3614 if (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
3615 else if(SiS_Pr->SiS_VGAVDE == 420) tempbx = 620;
3616 else if(SiS_Pr->SiS_VGAVDE == 525) tempbx = 775;
3617 else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
3618 else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
3619 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
3623 if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 700;
3624 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 800;
3625 else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
3628 if (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
3629 else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
3630 else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
3633 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
3634 if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 875;
3635 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 1000;
3640 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3641 tempax = SiS_Pr->SiS_VGAHDE;
3642 tempbx = SiS_Pr->SiS_VGAVDE;
3645 SiS_Pr->SiS_HDE = tempax;
3646 SiS_Pr->SiS_VDE = tempbx;
3652 SiS_GetCRT2Data(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
3656 if(SiS_Pr->SiS_VBType & VB_SISVB) {
3658 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
3659 SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3661 if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
3663 SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3665 SiS_GetCRT2Data301(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3671 SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
3681 SiS_GetLVDSDesPtr(struct SiS_Private *SiS_Pr)
3686 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
3688 if(SiS_Pr->ChipType < SIS_315H) {
3689 if(SiS_Pr->SiS_LCDTypeInfo == 4) {
3690 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
3691 PanelDesPtr = SiS_Pr->SiS_PanelType04_1a;
3692 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3693 PanelDesPtr = SiS_Pr->SiS_PanelType04_2a;
3695 } else if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
3696 PanelDesPtr = SiS_Pr->SiS_PanelType04_1b;
3697 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3698 PanelDesPtr = SiS_Pr->SiS_PanelType04_2b;
3709 SiS_GetLVDSDesData(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
3715 SiS_Pr->SiS_LCDHDES = 0;
3716 SiS_Pr->SiS_LCDVDES = 0;
3719 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
3722 if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
3723 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
3724 if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
3725 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3732 if(SiS_Pr->ChipType < SIS_315H) {
3733 if(SiS_Pr->SiS_LCDResInfo == Panel_640x480 && SiS_Pr->SiS_LCDTypeInfo == 3) {
3734 SiS_Pr->SiS_LCDHDES = 8;
3735 if (SiS_Pr->SiS_VGAVDE >= 480) SiS_Pr->SiS_LCDVDES = 512;
3736 else if(SiS_Pr->SiS_VGAVDE >= 400) SiS_Pr->SiS_LCDVDES = 436;
3737 else if(SiS_Pr->SiS_VGAVDE >= 350) SiS_Pr->SiS_LCDVDES = 440;
3744 if( (SiS_Pr->UseCustomMode) ||
3745 (SiS_Pr->SiS_LCDResInfo == Panel_Custom) ||
3746 (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
3747 (SiS_Pr->SiS_CustomT == CUT_PANEL856) ||
3748 (SiS_Pr->SiS_LCDInfo & LCDPass11) ) {
3752 if(ModeNo <= 0x13) ResIndex = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
3753 else ResIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
3755 if((SiS_Pr->SiS_VBType & VB_SIS30xBLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
3758 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3760 if(SiS_Pr->SiS_VGAHDE != SiS_Pr->PanelXRes) {
3761 SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_HT - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_VGAHDE) / 2);
3763 if(SiS_Pr->SiS_VGAVDE != SiS_Pr->PanelYRes) {
3764 SiS_Pr->SiS_LCDVDES = SiS_Pr->SiS_VT - ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VGAVDE) / 2);
3767 if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
3768 switch(SiS_Pr->SiS_CustomT) {
3772 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
3773 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3777 switch(SiS_Pr->SiS_LCDResInfo) {
3779 if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) {
3780 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3786 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3794 if((SiS_Pr->SiS_IF_DEF_CH70xx != 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
3796 if((SiS_Pr->SiS_TVMode & TVSetPAL) && (!(SiS_Pr->SiS_TVMode & TVSetPALM))) {
3797 if(ResIndex <= 3) SiS_Pr->SiS_LCDHDES = 256;
3800 } else if((PanelDesPtr = SiS_GetLVDSDesPtr(SiS_Pr))) {
3802 SiS_Pr->SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
3803 SiS_Pr->SiS_LCDVDES = (PanelDesPtr+ResIndex)->LCDVDES;
3805 } else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
3807 if(SiS_Pr->SiS_VGAHDE != SiS_Pr->PanelXRes) {
3808 SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_HT - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_VGAHDE) / 2);
3810 if(SiS_Pr->SiS_VGAVDE != SiS_Pr->PanelYRes) {
3811 SiS_Pr->SiS_LCDVDES = SiS_Pr->SiS_VT - ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VGAVDE) / 2);
3813 if(SiS_Pr->ChipType < SIS_315H) {
3814 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3816 switch(SiS_Pr->SiS_LCDResInfo) {
3820 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT;
3823 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3831 if(SiS_Pr->ChipType < SIS_315H) {
3833 switch(SiS_Pr->SiS_LCDResInfo) {
3835 if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
3836 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3838 SiS_Pr->SiS_LCDHDES = SiS_Pr->PanelHT + 3;
3839 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT;
3840 if(SiS_Pr->SiS_VGAVDE == 400) SiS_Pr->SiS_LCDVDES -= 2;
3841 else SiS_Pr->SiS_LCDVDES -= 4;
3845 if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
3846 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3848 SiS_Pr->SiS_LCDHDES = SiS_Pr->PanelHT - 1;
3849 if(SiS_Pr->SiS_VGAVDE <= 400) SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 8;
3850 if(SiS_Pr->SiS_VGAVDE <= 350) SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 12;
3855 if( (SiS_Pr->SiS_VGAHDE == SiS_Pr->PanelXRes) &&
3856 (SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) ) {
3857 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3859 SiS_Pr->SiS_LCDHDES = SiS_Pr->PanelHT - 1;
3864 switch(SiS_Pr->SiS_LCDTypeInfo) {
3866 SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0;
3869 SiS_Pr->SiS_LCDHDES = 8;
3870 if (SiS_Pr->SiS_VGAVDE >= 480) SiS_Pr->SiS_LCDVDES = 512;
3871 else if(SiS_Pr->SiS_VGAVDE >= 400) SiS_Pr->SiS_LCDVDES = 436;
3872 else if(SiS_Pr->SiS_VGAVDE >= 350) SiS_Pr->SiS_LCDVDES = 440;
3878 switch(SiS_Pr->SiS_LCDResInfo) {
3881 if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
3882 SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
3888 SiS_Pr->SiS_LCDVDES = 524;
3895 if((ModeNo <= 0x13) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
3896 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
3897 if((SiS_Pr->SiS_VBType & VB_SIS30xBLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
3898 if(!(modeflag & HalfDCLK)) SiS_Pr->SiS_LCDHDES = 632;
3899 } else if(!(SiS_Pr->SiS_SetFlag & SetDOSMode)) {
3900 if(SiS_Pr->SiS_LCDResInfo != Panel_1280x1024) {
3901 if(SiS_Pr->SiS_LCDResInfo >= Panel_1024x768) {
3902 if(SiS_Pr->ChipType < SIS_315H) {
3903 if(!(modeflag & HalfDCLK)) SiS_Pr->SiS_LCDHDES = 320;
3906 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) SiS_Pr->SiS_LCDHDES = 480;
3907 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) SiS_Pr->SiS_LCDHDES = 804;
3908 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) SiS_Pr->SiS_LCDHDES = 704;
3910 SiS_Pr->SiS_LCDHDES = 320;
3911 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) SiS_Pr->SiS_LCDHDES = 632;
3912 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) SiS_Pr->SiS_LCDHDES = 542;
3929 SiS_HandlePWD(struct SiS_Private *SiS_Pr)
3933 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
3934 unsigned short romptr = GetLCDStructPtr661_2(SiS_Pr);
3935 unsigned char drivermode = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40;
3938 if( (SiS_Pr->SiS_VBType & VB_SISPWD) &&
3940 (SiS_Pr->SiS_PWDOffset) ) {
3941 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2b,ROMAddr[romptr + SiS_Pr->SiS_PWDOffset + 0]);
3942 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2c,ROMAddr[romptr + SiS_Pr->SiS_PWDOffset + 1]);
3943 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2d,ROMAddr[romptr + SiS_Pr->SiS_PWDOffset + 2]);
3944 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2e,ROMAddr[romptr + SiS_Pr->SiS_PWDOffset + 3]);
3945 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2f,ROMAddr[romptr + SiS_Pr->SiS_PWDOffset + 4]);
3951 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x27,0x7f,temp);
3968 SiS_DisableBridge(struct SiS_Private *SiS_Pr)
3975 if(SiS_Pr->SiS_VBType & VB_SISVB) {
3977 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) { /* ===== For 30xB/C/LV ===== */
3979 if(SiS_Pr->ChipType < SIS_315H) {
3983 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
3984 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
3985 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
3987 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x08);
3989 SiS_PanelDelay(SiS_Pr, 3);
3991 if(SiS_Is301B(SiS_Pr)) {
3992 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0x3f);
3993 SiS_ShortDelay(SiS_Pr,1);
3995 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
3996 SiS_DisplayOff(SiS_Pr);
3997 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
3998 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
3999 SiS_UnLockCRT2(SiS_Pr);
4000 if(!(SiS_Pr->SiS_VBType & VB_SISLVDS)) {
4001 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
4002 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
4004 if( (!(SiS_CRT2IsLCD(SiS_Pr))) ||
4005 (!(SiS_CR36BIOSWord23d(SiS_Pr))) ) {
4006 SiS_PanelDelay(SiS_Pr, 2);
4007 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4008 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
4010 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x04);
4021 BOOLEAN custom1 = ((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
4022 (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) ? TRUE : FALSE;
4024 modenum = SiS_GetReg(SiS_Pr->SiS_P3d4,0x34) & 0x7f;
4026 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4029 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4030 if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
4031 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
4036 didpwd = SiS_HandlePWD(SiS_Pr);
4039 (SiS_IsVAMode(SiS_Pr)) ||
4040 (!(SiS_IsDualEdge(SiS_Pr))) ) {
4042 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xfe);
4043 if(custom1) SiS_PanelDelay(SiS_Pr, 3);
4045 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xfc);
4050 SiS_DDC2Delay(SiS_Pr,0xff00);
4051 SiS_DDC2Delay(SiS_Pr,0xe000);
4052 SiS_SetRegByte(SiS_Pr->SiS_P3c6,0x00);
4053 pushax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x06);
4055 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
4057 SiS_PanelDelay(SiS_Pr, 3);
4062 if(!(SiS_IsNotM650orLater(SiS_Pr))) {
4063 /* if(SiS_Pr->ChipType < SIS_340) {*/
4065 if(SiS_IsVAMode(SiS_Pr)) tempah = 0xf7;
4066 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
4070 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4071 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,~0x10);
4075 if(SiS_IsDualEdge(SiS_Pr)) {
4077 if(!(SiS_IsVAMode(SiS_Pr))) tempah = 0xbf;
4079 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
4081 if((SiS_IsVAMode(SiS_Pr)) ||
4082 ((SiS_Pr->SiS_VBType & VB_SISLVDS) && (modenum <= 0x13))) {
4084 SiS_DisplayOff(SiS_Pr);
4085 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4086 SiS_PanelDelay(SiS_Pr, 2);
4088 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
4089 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF);
4093 if((!(SiS_IsVAMode(SiS_Pr))) ||
4094 ((SiS_Pr->SiS_VBType & VB_SISLVDS) && (modenum <= 0x13))) {
4096 if(!(SiS_IsDualEdge(SiS_Pr))) {
4097 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
4098 SiS_DisplayOff(SiS_Pr);
4100 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
4102 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4103 SiS_PanelDelay(SiS_Pr, 2);
4106 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
4107 temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
4108 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
4109 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
4110 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
4114 if(SiS_IsNotM650orLater(SiS_Pr)) {
4115 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
4118 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4120 if( (!(SiS_IsVAMode(SiS_Pr))) &&
4121 (!(SiS_CRT2IsLCD(SiS_Pr))) &&
4122 (!(SiS_IsDualEdge(SiS_Pr))) ) {
4124 if(custom1) SiS_PanelDelay(SiS_Pr, 2);
4126 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
4128 if(custom1) SiS_PanelDelay(SiS_Pr, 4);
4132 SiS_SetReg(SiS_Pr->SiS_P3c4,0x06,pushax);
4133 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4134 if(SiS_IsVAorLCD(SiS_Pr)) {
4135 SiS_PanelDelayLoop(SiS_Pr, 3, 20);
4148 if(SiS_Pr->ChipType < SIS_315H) {
4150 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4151 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x08);
4152 SiS_PanelDelay(SiS_Pr, 3);
4157 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF); /* disable VB */
4158 SiS_DisplayOff(SiS_Pr);
4160 if(SiS_Pr->ChipType >= SIS_315H) {
4161 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
4164 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF); /* disable lock mode */
4166 if(SiS_Pr->ChipType >= SIS_315H) {
4167 temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
4168 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
4169 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
4170 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
4173 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF); /* disable CRT2 */
4174 if( (!(SiS_CRT2IsLCD(SiS_Pr))) ||
4175 (!(SiS_CR36BIOSWord23d(SiS_Pr))) ) {
4176 SiS_PanelDelay(SiS_Pr, 2);
4177 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x04);
4186 if(SiS_Pr->ChipType < SIS_315H) {
4190 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
4191 SiS_SetCH700x(SiS_Pr,0x0E,0x09);
4194 if(SiS_Pr->ChipType == SIS_730) {
4195 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
4196 SiS_WaitVBRetrace(SiS_Pr);
4198 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4199 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x08);
4200 SiS_PanelDelay(SiS_Pr, 3);
4203 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
4204 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
4205 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4206 SiS_WaitVBRetrace(SiS_Pr);
4207 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
4208 SiS_DisplayOff(SiS_Pr);
4210 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x08);
4211 SiS_PanelDelay(SiS_Pr, 3);
4217 SiS_DisplayOff(SiS_Pr);
4219 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
4221 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
4222 SiS_UnLockCRT2(SiS_Pr);
4223 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
4224 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
4226 if( (!(SiS_CRT2IsLCD(SiS_Pr))) ||
4227 (!(SiS_CR36BIOSWord23d(SiS_Pr))) ) {
4228 SiS_PanelDelay(SiS_Pr, 2);
4229 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x04);
4238 if(!(SiS_IsNotM650orLater(SiS_Pr))) {
4239 /*if(SiS_Pr->ChipType < SIS_340) { */ /* XGI needs this */
4240 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,~0x18);
4244 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
4246 if(SiS_Pr->ChipType == SIS_740) {
4247 temp = SiS_GetCH701x(SiS_Pr,0x61);
4249 SiS_SetCH701x(SiS_Pr,0x76,0xac);
4250 SiS_SetCH701x(SiS_Pr,0x66,0x00);
4253 if( (!(SiS_IsDualEdge(SiS_Pr))) ||
4254 (SiS_IsTVOrYPbPrOrScart(SiS_Pr)) ) {
4255 SiS_SetCH701x(SiS_Pr,0x49,0x3e);
4259 if( (!(SiS_IsDualEdge(SiS_Pr))) ||
4260 (SiS_IsVAMode(SiS_Pr)) ) {
4261 SiS_Chrontel701xBLOff(SiS_Pr);
4262 SiS_Chrontel701xOff(SiS_Pr);
4265 if(SiS_Pr->ChipType != SIS_740) {
4266 if( (!(SiS_IsDualEdge(SiS_Pr))) ||
4267 (SiS_IsTVOrYPbPrOrScart(SiS_Pr)) ) {
4268 SiS_SetCH701x(SiS_Pr,0x49,0x01);
4274 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4275 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x08);
4276 SiS_PanelDelay(SiS_Pr, 3);
4279 if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
4280 (!(SiS_IsDualEdge(SiS_Pr))) ||
4281 (!(SiS_IsTVOrYPbPrOrScart(SiS_Pr))) ) {
4282 SiS_DisplayOff(SiS_Pr);
4285 if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
4286 (!(SiS_IsDualEdge(SiS_Pr))) ||
4287 (!(SiS_IsVAMode(SiS_Pr))) ) {
4288 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
4291 if(SiS_Pr->ChipType == SIS_740) {
4292 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
4295 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
4297 if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
4298 (!(SiS_IsDualEdge(SiS_Pr))) ||
4299 (!(SiS_IsVAMode(SiS_Pr))) ) {
4300 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
4303 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4304 if(SiS_CRT2IsLCD(SiS_Pr)) {
4305 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
4306 if(SiS_Pr->ChipType == SIS_550) {
4307 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xbf);
4308 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xef);
4312 if(SiS_Pr->ChipType == SIS_740) {
4313 if(SiS_IsLCDOrLCDA(SiS_Pr)) {
4314 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
4316 } else if(SiS_IsVAMode(SiS_Pr)) {
4317 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
4321 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
4322 if(SiS_IsDualEdge(SiS_Pr)) {
4323 /* SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff); */
4325 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
4329 SiS_UnLockCRT2(SiS_Pr);
4331 if(SiS_Pr->ChipType == SIS_550) {
4332 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80); /* DirectDVD PAL?*/
4333 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40); /* VB clock / 4 ? */
4334 } else if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
4335 (!(SiS_IsDualEdge(SiS_Pr))) ||
4336 (!(SiS_IsVAMode(SiS_Pr))) ) {
4337 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
4340 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4341 if(SiS_CRT2IsLCD(SiS_Pr)) {
4342 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4343 SiS_PanelDelay(SiS_Pr, 2);
4344 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x04);
4369 SiS_EnableBridge(struct SiS_Private *SiS_Pr)
4377 if(SiS_Pr->SiS_VBType & VB_SISVB) {
4379 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) { /* ====== For 301B et al ====== */
4381 if(SiS_Pr->ChipType < SIS_315H) {
4385 if(SiS_CRT2IsLCD(SiS_Pr)) {
4386 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4387 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
4388 } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
4389 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x00);
4391 if(SiS_Pr->SiS_VBType & (VB_SISLVDS | VB_NoLCD)) {
4392 if(!(SiS_CR36BIOSWord23d(SiS_Pr))) {
4393 SiS_PanelDelay(SiS_Pr, 0);
4398 if((SiS_Pr->SiS_VBType & VB_NoLCD) &&
4399 (SiS_CRT2IsLCD(SiS_Pr))) {
4401 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* Enable CRT2 */
4402 SiS_DisplayOn(SiS_Pr);
4403 SiS_UnLockCRT2(SiS_Pr);
4404 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
4405 if(SiS_BridgeInSlavemode(SiS_Pr)) {
4406 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
4408 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
4410 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
4411 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
4412 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4413 SiS_PanelDelay(SiS_Pr, 1);
4415 SiS_WaitVBRetrace(SiS_Pr);
4416 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x00);
4422 temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
4423 if(SiS_BridgeInSlavemode(SiS_Pr)) {
4424 tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
4427 SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
4428 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
4429 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
4430 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
4431 SiS_DisplayOn(SiS_Pr);
4432 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4433 if(SiS_CRT2IsLCD(SiS_Pr)) {
4434 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
4435 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4436 SiS_PanelDelay(SiS_Pr, 1);
4438 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
4458 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4459 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef);
4461 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4462 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
4467 if(!(SiS_IsNotM650orLater(SiS_Pr))) {
4468 /*if(SiS_Pr->ChipType < SIS_340) { */
4470 if(SiS_LCDAEnabled(SiS_Pr)) {
4471 if(SiS_TVEnabled(SiS_Pr)) tempah = 0x18;
4474 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4c,tempah);
4478 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4480 SiS_SetRegByte(SiS_Pr->SiS_P3c6,0x00);
4481 SiS_DisplayOff(SiS_Pr);
4482 pushax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x06);
4484 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
4487 didpwd = SiS_HandlePWD(SiS_Pr);
4489 if(SiS_IsVAorLCD(SiS_Pr)) {
4491 if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
4492 SiS_PanelDelayLoop(SiS_Pr, 3, 2);
4493 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
4494 SiS_PanelDelayLoop(SiS_Pr, 3, 2);
4495 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4496 SiS_GenericDelay(SiS_Pr, 17664);
4500 SiS_PanelDelayLoop(SiS_Pr, 3, 2);
4501 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4502 SiS_GenericDelay(SiS_Pr, 17664);
4507 if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40)) {
4508 SiS_PanelDelayLoop(SiS_Pr, 3, 10);
4514 if(!(SiS_IsVAMode(SiS_Pr))) {
4516 temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
4517 if(SiS_BridgeInSlavemode(SiS_Pr)) {
4518 tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
4520 if(!(SiS_LCDAEnabled(SiS_Pr))) temp |= 0x20;
4523 SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
4525 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
4527 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
4528 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
4530 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4531 SiS_PanelDelay(SiS_Pr, 2);
4536 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20);
4540 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
4541 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
4543 if(SiS_Pr->SiS_VBType & VB_SISPOWER) {
4544 if( (SiS_LCDAEnabled(SiS_Pr)) ||
4545 (SiS_CRT2IsLCD(SiS_Pr)) ) {
4547 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x2a,0x7f);
4549 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x7f);
4554 if(SiS_IsDualEdge(SiS_Pr)) {
4556 if(!(SiS_IsVAMode(SiS_Pr))) tempah = 0x40;
4558 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah);
4560 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
4562 SiS_PanelDelay(SiS_Pr, 2);
4564 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1f,0x10);
4565 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
4567 if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
4569 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4570 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
4571 SiS_GenericDelay(SiS_Pr, 2048);
4574 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
4576 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4578 cr36 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
4580 if(SiS_Pr->SiS_ROMNew) {
4581 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
4582 unsigned short romptr = GetLCDStructPtr661_2(SiS_Pr);
4584 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20); /* Reset */
4585 SiS_Pr->EMI_30 = 0;
4586 SiS_Pr->EMI_31 = ROMAddr[romptr + SiS_Pr->SiS_EMIOffset + 0];
4587 SiS_Pr->EMI_32 = ROMAddr[romptr + SiS_Pr->SiS_EMIOffset + 1];
4588 SiS_Pr->EMI_33 = ROMAddr[romptr + SiS_Pr->SiS_EMIOffset + 2];
4589 if(ROMAddr[romptr + 1] & 0x10) SiS_Pr->EMI_30 = 0x40;
4591 SiS_Pr->HaveEMI = SiS_Pr->HaveEMILCD = SiS_Pr->OverruleEMI = TRUE;
4606 if(SiS_Pr->HaveEMI) {
4607 r30 = SiS_Pr->EMI_30; r31 = SiS_Pr->EMI_31;
4608 r32 = SiS_Pr->EMI_32; r33 = SiS_Pr->EMI_33;
4620 if((!SiS_Pr->HaveEMI) || (!SiS_Pr->HaveEMILCD)) {
4624 if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) r30 &= ~0x40;
4625 if(!SiS_Pr->HaveEMI) {
4633 if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) r30 |= 0x40;
4634 if(!SiS_Pr->HaveEMI) {
4636 if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
4643 if(!SiS_Pr->HaveEMI) {
4645 if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
4652 if(!SiS_Pr->HaveEMI) {
4659 if(!SiS_Pr->OverruleEMI) {
4661 if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
4668 if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
4675 if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
4686 if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) {
4687 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20); /* Reset */
4688 SiS_GenericDelay(SiS_Pr, 2048);
4690 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x31,r31);
4691 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x32,r32);
4692 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x33,r33);
4695 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
4698 if( (SiS_LCDAEnabled(SiS_Pr)) ||
4699 (SiS_CRT2IsLCD(SiS_Pr)) ) {
4701 /*SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x2a,0x80);*/
4702 SiS_PanelDelayLoop(SiS_Pr, 3, 5);
4704 SiS_PanelDelayLoop(SiS_Pr, 3, 5);
4707 SiS_WaitVBRetrace(SiS_Pr);
4708 SiS_WaitVBRetrace(SiS_Pr);
4709 if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
4710 SiS_GenericDelay(SiS_Pr, 1280);
4712 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); /* Enable */
4713 /*SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x2a,0x7f);*/
4720 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4721 if(SiS_IsVAorLCD(SiS_Pr)) {
4722 SiS_PanelDelayLoop(SiS_Pr, 3, 10);
4724 SiS_PanelDelayLoop(SiS_Pr, 3, 10);
4726 SiS_WaitVBRetrace(SiS_Pr);
4727 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
4728 SiS_GenericDelay(SiS_Pr, 2048);
4729 SiS_WaitVBRetrace(SiS_Pr);
4732 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
4734 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x03);
4739 SiS_SetReg(SiS_Pr->SiS_P3c4,0x06,pushax);
4740 SiS_DisplayOn(SiS_Pr);
4741 SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xff);
4745 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4746 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
4755 if(SiS_Pr->ChipType < SIS_315H) {
4756 if(SiS_CRT2IsLCD(SiS_Pr)) {
4757 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x00);
4758 SiS_PanelDelay(SiS_Pr, 0);
4762 temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
4763 if(SiS_BridgeInSlavemode(SiS_Pr)) {
4764 tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
4767 SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
4769 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
4771 if(SiS_Pr->ChipType >= SIS_315H) {
4772 temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
4774 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); /* BVBDOENABLE=1 */
4778 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
4780 SiS_VBLongWait(SiS_Pr);
4781 SiS_DisplayOn(SiS_Pr);
4782 if(SiS_Pr->ChipType >= SIS_315H) {
4783 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
4785 SiS_VBLongWait(SiS_Pr);
4787 if(SiS_Pr->ChipType < SIS_315H) {
4788 if(SiS_CRT2IsLCD(SiS_Pr)) {
4789 SiS_PanelDelay(SiS_Pr, 1);
4790 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x00);
4798 if(SiS_Pr->ChipType < SIS_315H) {
4802 if(SiS_CRT2IsLCD(SiS_Pr)) {
4803 if(SiS_Pr->ChipType == SIS_730) {
4804 SiS_PanelDelay(SiS_Pr, 1);
4805 SiS_PanelDelay(SiS_Pr, 1);
4806 SiS_PanelDelay(SiS_Pr, 1);
4808 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x00);
4809 if(!(SiS_CR36BIOSWord23d(SiS_Pr))) {
4810 SiS_PanelDelay(SiS_Pr, 0);
4814 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
4815 SiS_DisplayOn(SiS_Pr);
4816 SiS_UnLockCRT2(SiS_Pr);
4817 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
4818 if(SiS_BridgeInSlavemode(SiS_Pr)) {
4819 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
4821 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
4824 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
4825 if(!(SiS_CRT2IsLCD(SiS_Pr))) {
4826 SiS_WaitVBRetrace(SiS_Pr);
4827 SiS_SetCH700x(SiS_Pr,0x0E,0x0B);
4831 if(SiS_CRT2IsLCD(SiS_Pr)) {
4832 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
4833 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
4834 if(!(SiS_CR36BIOSWord23b(SiS_Pr))) {
4835 SiS_PanelDelay(SiS_Pr, 1);
4836 SiS_PanelDelay(SiS_Pr, 1);
4838 SiS_WaitVBRetrace(SiS_Pr);
4839 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x00);
4850 if(!(SiS_IsNotM650orLater(SiS_Pr))) {
4851 /*if(SiS_Pr->ChipType < SIS_340) {*/ /* XGI needs this */
4852 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x18);
4856 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4857 if(SiS_CRT2IsLCD(SiS_Pr)) {
4858 SiS_SetRegSR11ANDOR(SiS_Pr,0xFB,0x00);
4859 SiS_PanelDelay(SiS_Pr, 0);
4863 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
4864 SiS_UnLockCRT2(SiS_Pr);
4866 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
4868 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
4869 temp = SiS_GetCH701x(SiS_Pr,0x66);
4871 SiS_Chrontel701xBLOff(SiS_Pr);
4874 if(SiS_Pr->ChipType != SIS_550) {
4875 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
4878 if(SiS_Pr->ChipType == SIS_740) {
4879 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
4880 if(SiS_IsLCDOrLCDA(SiS_Pr)) {
4881 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
4886 temp1 = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
4888 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
4891 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
4893 SiS_Chrontel701xBLOn(SiS_Pr);
4897 if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4898 if(SiS_CRT2IsLCD(SiS_Pr)) {
4899 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
4900 if(SiS_Pr->ChipType == SIS_550) {
4901 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
4902 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
4905 } else if(SiS_IsVAMode(SiS_Pr)) {
4906 if(SiS_Pr->ChipType != SIS_740) {
4907 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
4911 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4912 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
4915 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
4916 if(SiS_IsTVOrYPbPrOrScart(SiS_Pr)) {
4917 SiS_Chrontel701xOn(SiS_Pr);
4919 if( (SiS_IsVAMode(SiS_Pr)) ||
4920 (SiS_IsLCDOrLCDA(SiS_Pr)) ) {
4921 SiS_ChrontelDoSomething1(SiS_Pr);
4925 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
4926 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4927 if( (SiS_IsVAMode(SiS_Pr)) ||
4928 (SiS_IsLCDOrLCDA(SiS_Pr)) ) {
4929 SiS_Chrontel701xBLOn(SiS_Pr);
4930 SiS_ChrontelInitTVVSync(SiS_Pr);
4933 } else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
4934 if(!(SiS_WeHaveBacklightCtrl(SiS_Pr))) {
4935 if(SiS_CRT2IsLCD(SiS_Pr)) {
4936 SiS_PanelDelay(SiS_Pr, 1);
4937 SiS_SetRegSR11ANDOR(SiS_Pr,0xF7,0x00);
4956 SiS_SetCRT2Offset(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
4962 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) return;
4964 offset = SiS_GetOffset(SiS_Pr,ModeNo,ModeIdIndex,RRTI);
4966 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x07,(offset & 0xFF));
4967 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x09,(offset >> 8));
4971 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,temp);
4976 SiS_SetCRT2Sync(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short RefreshRateTableIndex)
4982 if(SiS_Pr->UseCustomMode) {
4983 infoflag = SiS_Pr->CInfoFlag;
4985 infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
4988 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* LVDS */
4990 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
4992 } else if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDInfo & LCDSync)) {
4993 tempah = SiS_Pr->SiS_LCDInfo;
4997 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
4998 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
4999 if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
5000 (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
5003 if( (SiS_Pr->SiS_IF_DEF_FSTN) ||
5004 (SiS_Pr->SiS_IF_DEF_DSTN) ||
5005 (SiS_Pr->SiS_IF_DEF_TRUMPION) ||
5006 (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
5007 (SiS_Pr->SiS_CustomT == CUT_PANEL856) ) {
5010 if( (SiS_Pr->SiS_IF_DEF_FSTN) ||
5011 (SiS_Pr->SiS_IF_DEF_DSTN) ) {
5015 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
5016 if(SiS_Pr->ChipType >= SIS_315H) {
5019 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xE7,tempah);
5022 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,0xe0);
5025 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
5028 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
5030 if(SiS_Pr->ChipType < SIS_315H) {
5034 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) { /* 630 - 301B(-DH) */
5038 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
5039 if(SiS_Pr->SiS_LCDInfo & LCDSync) {
5040 tempah = SiS_Pr->SiS_LCDInfo;
5046 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
5048 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
5049 if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
5050 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
5056 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
5057 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
5067 if(SiS_Pr->SiS_VBType & VB_SISLVDS) { /* 315 - LVDS */
5070 if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) &&
5071 (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
5073 if(SiS_Pr->SiS_LCDInfo & LCDSync) {
5074 tempbl = ((SiS_Pr->SiS_LCDInfo & 0xc0) >> 6);
5076 } else if((SiS_Pr->SiS_CustomT == CUT_CLEVO1400) &&
5077 (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050)) {
5081 tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
5084 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempbl |= 0x04;
5088 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
5089 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) tempah |= 0xc0;
5090 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
5091 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
5092 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
5093 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
5100 if(!SiS_Pr->UseCustomMode) {
5102 if((SiS_Pr->SiS_VBType & VB_SIS30xC) && (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
5104 tempah = SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02));
5107 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5108 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5109 if(SiS_Pr->SiS_LCDInfo & LCDSync) {
5110 tempah = SiS_Pr->SiS_LCDInfo;
5118 if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
5119 if(SiS_Pr->SiS_VBType & VB_NoLCD) {
5121 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempah |= 0xc0;
5123 if((SiS_Pr->SiS_VBType & VB_SIS30xC) && (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
5126 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xe7,tempah);
5128 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
5129 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
5130 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
5131 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
5145 SiS_SetCRT2FIFO_300(struct SiS_Private *SiS_Pr,unsigned short ModeNo)
5147 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
5156 SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
5158 if(!SiS_Pr->CRT1UsesCustomMode) {
5160 CRT1ModeNo = SiS_Pr->SiS_CRT1Mode; /* get CRT1 ModeNo */
5161 SiS_SearchModeID(SiS_Pr, &CRT1ModeNo, &modeidindex);
5162 SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
5163 SiS_Pr->SiS_SelectCRT2Rate = 0;
5164 refreshratetableindex = SiS_GetRatePtr(SiS_Pr, CRT1ModeNo, modeidindex);
5168 index = SiS_GetRefCRTVCLK(SiS_Pr, refreshratetableindex, SiS_Pr->SiS_UseWide);
5169 VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;
5172 colorth = SiS_GetColorDepth(SiS_Pr,CRT1ModeNo,modeidindex) >> 1;
5181 VCLK = SiS_Pr->CSRClock_CRT1;
5184 colorth = colortharray[((SiS_Pr->CModeFlag_CRT1 & ModeTypeMask) - 2)];
5190 if(SiS_Pr->ChipType == SIS_300) {
5191 index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x3A);
5193 index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1A);
5196 MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK;
5198 temp = ((SiS_GetReg(SiS_Pr->SiS_P3c4,0x14) >> 6) & 0x03) << 1;
5208 if(SiS_Pr->ChipType == SIS_300) {
5210 SiS_GetFIFOThresholdIndex300(SiS_Pr, &tempbx, &tempcl);
5216 pci50 = sisfb_read_nbridge_pci_dword(SiS_Pr, 0x50);
5217 pciA0 = sisfb_read_nbridge_pci_dword(SiS_Pr, 0xa0);
5223 if(SiS_Pr->ChipType == SIS_730) {
5241 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x14) & 0x80) index += 12;
5245 data = SiS_GetLatencyFactor630(SiS_Pr, index) + 15;
5246 if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x14) & 0x80)) data += 5;
5252 SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
5253 SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
5255 if(!SiS_Pr->UseCustomMode) {
5258 SiS_SearchModeID(SiS_Pr, &CRT2ModeNo, &modeidindex);
5260 refreshratetableindex = SiS_GetRatePtr(SiS_Pr, CRT2ModeNo, modeidindex);
5263 index = SiS_GetVCLK2Ptr(SiS_Pr, CRT2ModeNo, modeidindex, refreshratetableindex);
5264 VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;
5266 if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
5267 if(SiS_Pr->SiS_UseROM) {
5278 VCLK = SiS_Pr->CSRClock;
5283 colorth = SiS_GetColorDepth(SiS_Pr,CRT2ModeNo,modeidindex) >> 1;
5294 if(SiS_Pr->ChipType == SIS_300) {
5296 if((data <= 0x0f) || (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024))
5300 if(( (SiS_Pr->ChipType == SIS_630) ||
5301 (SiS_Pr->ChipType == SIS_730) ) &&
5302 (SiS_Pr->ChipRevision >= 0x30))
5305 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0xe0,temp);
5307 if((SiS_Pr->ChipType == SIS_630) &&
5308 (SiS_Pr->ChipRevision >= 0x30)) {
5311 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,0xe0,data);
5315 SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
5316 SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
5325 SiS_SetCRT2FIFO_310(struct SiS_Private *SiS_Pr)
5327 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,0x3B);
5328 if( (SiS_Pr->ChipType == SIS_760) &&
5329 (SiS_Pr->SiS_SysFlags & SF_760LFB) &&
5330 (SiS_Pr->SiS_ModeType == Mode32Bpp) &&
5331 (SiS_Pr->SiS_VGAHDE >= 1280) &&
5332 (SiS_Pr->SiS_VGAVDE >= 1024) ) {
5333 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2f,0x03);
5334 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,0x3b);
5335 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4d,0xc0);
5336 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2f,0x01);
5337 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4d,0xc0);
5338 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x02,0x6e);
5340 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3f,0x04);
5347 SiS_GetVGAHT2(struct SiS_Private *SiS_Pr)
5351 tempbx = (SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) * SiS_Pr->SiS_RVBHCMAX;
5352 tempax = (SiS_Pr->SiS_VT - SiS_Pr->SiS_VDE) * SiS_Pr->SiS_RVBHCFACT;
5353 tempax = (tempax * SiS_Pr->SiS_HT) / tempbx;
5359 SiS_SetGroup1_301(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex,
5373 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
5374 } else if(SiS_Pr->UseCustomMode) {
5375 modeflag = SiS_Pr->CModeFlag;
5376 xres = SiS_Pr->CHDisplay;
5378 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5379 xres = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes;
5384 if(SiS_Pr->ChipType >= SIS_315H) {
5386 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x31,0x04);
5390 SiS_Pr->CHTotal = 8224; /* Max HT, 0x2020, results in 0x3ff in registers */
5392 SiS_Pr->CHDisplay = SiS_Pr->SiS_VGAHDE;
5393 if(modeflag & HalfDCLK) SiS_Pr->CHDisplay >>= 1;
5395 SiS_Pr->CHBlankStart = SiS_Pr->CHDisplay;
5396 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
5397 SiS_Pr->CHBlankStart += 16;
5400 SiS_Pr->CHBlankEnd = 32;
5401 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
5402 if(xres == 1600) SiS_Pr->CHBlankEnd += 80;
5405 temp = SiS_Pr->SiS_VGAHT - 96;
5407 if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
5408 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x04);
5409 temp |= ((SiS_GetReg(SiS_Pr->SiS_P3c4,0x0b) & 0xc0) << 2);
5413 if(SiS_Pr->SiS_RVBHRS2) temp = SiS_Pr->SiS_RVBHRS2;
5415 SiS_Pr->CHSyncStart = temp;
5417 SiS_Pr->CHSyncEnd = 0xffe8; /* results in 0x2000 in registers */
5419 SiS_Pr->CVTotal = 2049; /* Max VT, 0x0801, results in 0x7ff in registers */
5421 VGAVDE = SiS_Pr->SiS_VGAVDE;
5429 SiS_Pr->CVDisplay = VGAVDE;
5431 SiS_Pr->CVBlankStart = SiS_Pr->CVDisplay;
5433 SiS_Pr->CVBlankEnd = 1;
5434 if(ModeNo == 0x3c) SiS_Pr->CVBlankEnd = 226;
5436 temp = (SiS_Pr->SiS_VGAVT - VGAVDE) >> 1;
5437 SiS_Pr->CVSyncStart = VGAVDE + temp;
5440 SiS_Pr->CVSyncEnd = SiS_Pr->CVSyncStart + temp;
5442 SiS_CalcCRRegisters(SiS_Pr, 0);
5443 SiS_Pr->CCRT1CRTC[16] &= ~0xE0;
5446 SiS_SetReg(SiS_Pr->SiS_Part1Port,CRTranslation[i],SiS_Pr->CCRT1CRTC[i]);
5449 SiS_SetReg(SiS_Pr->SiS_Part1Port,CRTranslation[i],SiS_Pr->CCRT1CRTC[j]);
5452 SiS_SetReg(SiS_Pr->SiS_Part1Port,CRTranslation[i],SiS_Pr->CCRT1CRTC[j]);
5455 SiS_SetReg(SiS_Pr->SiS_Part1Port,CRTranslation[i],SiS_Pr->CCRT1CRTC[j]);
5458 temp = SiS_Pr->CCRT1CRTC[16] & 0xE0;
5459 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,CRTranslation[0x0E],0x1F,temp);
5461 temp = (SiS_Pr->CCRT1CRTC[16] & 0x01) << 5;
5463 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,CRTranslation[0x09],0x5F,temp);
5466 temp |= (SiS_GetReg(SiS_Pr->SiS_P3c4,0x01) & 0x01);
5468 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,temp); /* SR01: HalfDCLK[3], 8/9 div dotclock[0] */
5470 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0F,0x00); /* CR14: (text mode: underline location) */
5471 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x12,0x00); /* CR17: n/a */
5474 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
5475 temp = (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) << 7;
5477 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1A,temp); /* SR0E, dither[7] */
5479 temp = SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02));
5480 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,temp); /* ? */
5485 SiS_Pr->CHDisplay, SiS_Pr->CHSyncStart, SiS_Pr->CHSyncEnd, SiS_Pr->CHTotal,
5486 SiS_Pr->CVDisplay, SiS_Pr->CVSyncStart, SiS_Pr->CVSyncEnd, SiS_Pr->CVTotal,
5487 SiS_Pr->CHBlankStart, SiS_Pr->CHBlankEnd, SiS_Pr->CVBlankStart, SiS_Pr->CVBlankEnd);
5490 SiS_Pr->CCRT1CRTC[0], SiS_Pr->CCRT1CRTC[1],
5491 SiS_Pr->CCRT1CRTC[2], SiS_Pr->CCRT1CRTC[3],
5492 SiS_Pr->CCRT1CRTC[4], SiS_Pr->CCRT1CRTC[5],
5493 SiS_Pr->CCRT1CRTC[6], SiS_Pr->CCRT1CRTC[7]);
5495 SiS_Pr->CCRT1CRTC[8], SiS_Pr->CCRT1CRTC[9],
5496 SiS_Pr->CCRT1CRTC[10], SiS_Pr->CCRT1CRTC[11],
5497 SiS_Pr->CCRT1CRTC[12], SiS_Pr->CCRT1CRTC[13],
5498 SiS_Pr->CCRT1CRTC[14], SiS_Pr->CCRT1CRTC[15]);
5499 xf86DrvMsg(0, X_INFO, " 0x%02x}},\n", SiS_Pr->CCRT1CRTC[16]);
5509 SiS_SetGroup1_LVDS(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
5525 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
5526 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
5528 crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5530 } else if(SiS_Pr->UseCustomMode) {
5531 modeflag = SiS_Pr->CModeFlag;
5533 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5534 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
5536 crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
5541 if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBType & VB_NoLCD)) {
5545 if(SiS_Pr->ChipType == SIS_550 &&
5546 SiS_Pr->SiS_IF_DEF_LVDS &&
5547 !SiS_Pr->SiS_IF_DEF_FSTN &&
5548 !SiS_Pr->SiS_IF_DEF_DSTN) {
5553 if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
5557 if((SiS_Pr->ChipType >= SIS_315H) && (islvds) && (!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA))) {
5558 if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN && !lvds550) {
5564 if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
5566 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);
5569 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);
5570 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x03);
5571 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
5572 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);
5576 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);
5577 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x00);
5578 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
5579 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2D,0x0f);
5580 if(SiS_Pr->SiS_VBType & VB_SIS30xC) {
5581 if((SiS_Pr->SiS_LCDResInfo == Panel_1024x768) ||
5582 (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
5583 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x20);
5593 tempax = SiS_Pr->SiS_LCDHDES;
5595 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5596 if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN && !lvds550) {
5597 if((SiS_Pr->SiS_LCDResInfo == Panel_640x480) &&
5598 (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode))) {
5606 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1A,temp); /* BPLHDESKEW[2:0] */
5608 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,temp); /* BPLHDESKEW[10:3] */
5610 tempbx = SiS_Pr->SiS_HDE;
5611 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5612 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5613 tempbx = SiS_Pr->PanelXRes;
5615 if((SiS_Pr->SiS_LCDResInfo == Panel_320x240_1) ||
5616 (SiS_Pr->SiS_LCDResInfo == Panel_320x240_2) ||
5617 (SiS_Pr->SiS_LCDResInfo == Panel_320x240_3)) {
5623 if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
5628 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,temp); /* BPLHDEE */
5630 tempcx = (SiS_Pr->SiS_HT - tempbx) >> 2;
5632 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5633 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5634 if(SiS_Pr->PanelHRS != 999) tempcx = SiS_Pr->PanelHRS;
5639 if(tempcx >= SiS_Pr->SiS_HT) tempcx -= SiS_Pr->SiS_HT;
5642 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5643 if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
5644 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
5665 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,temp); /* BPLHRS */
5667 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5669 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5671 if(SiS_Pr->PanelHRE != 999) {
5672 temp = tempcx + SiS_Pr->PanelHRE;
5673 if(temp >= SiS_Pr->SiS_HT) temp -= SiS_Pr->SiS_HT;
5683 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,temp); /* BPLHRE */
5687 tempax = SiS_Pr->SiS_VGAVDE;
5688 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5689 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5690 tempax = SiS_Pr->PanelYRes;
5694 tempbx = SiS_Pr->SiS_LCDVDES + tempax;
5695 if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
5699 tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;
5700 if((SiS_Pr->ChipType < SIS_315H) || lvds550) {
5701 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5702 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5703 tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->PanelYRes;
5710 if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
5711 (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
5712 (SiS_Pr->PanelVRS != 999) ) {
5713 tempcx = SiS_Pr->PanelVRS;
5718 if(SiS_Pr->ChipType < SIS_315H) tempbx++;
5722 if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
5725 if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
5726 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
5730 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp); /* BPLVRS */
5735 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5736 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
5737 if(SiS_Pr->PanelVRE != 999) tempcx = SiS_Pr->PanelVRE;
5743 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp); /* BPLVRE */
5746 if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN || lvds550) {
5747 if(SiS_Pr->SiS_HDE != 640) {
5748 if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
5750 } else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
5751 if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) temp |= 0x40;
5753 if((SiS_Pr->ChipType >= SIS_315H) ||
5754 (SiS_Pr->ChipRevision >= 0x30)) {
5756 if((SiS_Pr->SiS_IF_DEF_CH70xx == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
5757 if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x03) temp |= 0x80;
5760 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
5761 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
5762 if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x06) & 0x10) temp |= 0x80;
5764 if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
5768 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,tempbx,temp);
5772 tempcx = SiS_Pr->SiS_LCDVDES; /* BPLVDES */
5774 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
5775 switch(SiS_Pr->SiS_LCDResInfo) {
5777 tempbx = SiS_Pr->SiS_VGAVDE - 1;
5778 tempcx = SiS_Pr->SiS_VGAVDE;
5781 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
5786 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
5788 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
5794 if(SiS_Pr->ChipType < SIS_315H) {
5795 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
5805 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1D,temp);
5806 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1C,tempbx);
5807 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1B,tempcx);
5811 if(SiS_Pr->ChipType < SIS_315H) {
5814 tempeax = SiS_Pr->SiS_VGAVDE << 6;
5815 temp = (tempeax % (unsigned int)SiS_Pr->SiS_VDE);
5816 tempeax = tempeax / (unsigned int)SiS_Pr->SiS_VDE;
5819 if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) tempeax = 0x3F;
5822 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1E,temp); /* BPLVCFACT */
5829 tempeax = SiS_Pr->SiS_VGAVDE << 18;
5830 tempebx = SiS_Pr->SiS_VDE;
5837 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,temp);
5839 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,temp);
5841 if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
5842 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,temp);
5844 if(SiS_Pr->SiS_VBType & VB_SISPART4SCALER) {
5846 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x3c,temp);
5848 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x3b,temp);
5850 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x3a,0x3f,temp);
5852 if(SiS_Pr->SiS_VDE != SiS_Pr->SiS_VGAVDE) temp |= 0x08;
5853 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x30,0xf3,temp);
5861 tempeax = SiS_Pr->SiS_VGAHDE; /* 1f = ( (VGAHDE * 65536) / ( (VGAHDE * 65536) / HDE ) ) - 1*/
5866 if(SiS_Pr->SiS_HDE == tempeax) {
5869 tempecx = tempebx / SiS_Pr->SiS_HDE;
5870 if(SiS_Pr->ChipType >= SIS_315H) {
5871 if(tempebx % SiS_Pr->SiS_HDE) tempecx++;
5875 if(SiS_Pr->ChipType >= SIS_315H) {
5878 tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
5882 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1F,temp);
5884 if(SiS_Pr->ChipType >= SIS_315H) {
5885 tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
5888 tempeax = SiS_Pr->SiS_VGAVDE << 6;
5894 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tempbx--;
5895 if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
5896 if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
5897 else if(SiS_Pr->SiS_LCDResInfo != Panel_640x480) tempbx = 1;
5902 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x20,temp);
5903 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x21,tempbx);
5910 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x22,temp);
5912 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x23,temp);
5915 if(SiS_Pr->ChipType >= SIS_315H) {
5916 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
5917 if((islvds) || (SiS_Pr->SiS_VBInfo & VB_SISLVDS)) {
5918 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1e,0x20);
5922 if(SiS_Pr->ChipType == SIS_740) {
5923 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03);
5925 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1e,0x23);
5933 if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
5934 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
5941 if(SiS_Pr->SiS_UseROM) {
5944 if(SiS_Pr->SiS_LCDTypeInfo == 0x0e) j += 7;
5948 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xbf);
5950 SiS_SetTrumpionBlock(SiS_Pr, trumpdata);
5952 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
5955 SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode13[0]);
5959 SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode10_1[0]);
5960 SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode10_2[0]);
5964 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
5969 if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
5970 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x25,0x00);
5971 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x26,0x00);
5972 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x27,0x00);
5973 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x28,0x87);
5974 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x29,0x5A);
5975 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
5976 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x07,0x03);
5977 tempax = SiS_Pr->SiS_HDE; /* Blps = lcdhdee(lcdhdes+HDE) + 64 */
5978 if(SiS_Pr->SiS_LCDResInfo == Panel_320x240_1 ||
5979 SiS_Pr->SiS_LCDResInfo == Panel_320x240_2 ||
5980 SiS_Pr->SiS_LCDResInfo == Panel_320x240_3) tempax >>= 1;
5982 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,tempax & 0xff);
5984 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
5986 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,tempax & 0xff);
5987 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3A,0x00); /* Bflml = 0 */
5988 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x3C,~0x007);
5990 tempax = SiS_Pr->SiS_VDE;
5991 if(SiS_Pr->SiS_LCDResInfo == Panel_320x240_1 ||
5992 SiS_Pr->SiS_LCDResInfo == Panel_320x240_2 ||
5993 SiS_Pr->SiS_LCDResInfo == Panel_320x240_3) tempax >>= 1;
5995 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3B,tempax & 0xff);
5997 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
5999 tempeax = SiS_Pr->SiS_HDE;
6000 if(SiS_Pr->SiS_LCDResInfo == Panel_320x240_1 ||
6001 SiS_Pr->SiS_LCDResInfo == Panel_320x240_2 ||
6002 SiS_Pr->SiS_LCDResInfo == Panel_320x240_3) tempeax >>= 1;
6008 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x45,temp);
6009 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3F,0x00); /* BDxWadrst0 */
6010 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3E,0x00);
6011 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3D,0x10);
6012 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x3C,~0x040);
6014 tempax = SiS_Pr->SiS_HDE;
6015 if(SiS_Pr->SiS_LCDResInfo == Panel_320x240_1 ||
6016 SiS_Pr->SiS_LCDResInfo == Panel_320x240_2 ||
6017 SiS_Pr->SiS_LCDResInfo == Panel_320x240_3) tempax >>= 1;
6021 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,temp);
6023 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
6025 tempax = SiS_Pr->SiS_VDE; /* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
6026 if(SiS_Pr->SiS_LCDResInfo == Panel_320x240_1 ||
6027 SiS_Pr->SiS_LCDResInfo == Panel_320x240_2 ||
6028 SiS_Pr->SiS_LCDResInfo == Panel_320x240_3) tempax >>= 1;
6031 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,temp);
6033 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,temp);
6035 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,temp);
6037 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
6039 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x03);
6040 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,0x50);
6041 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x04,0x00);
6042 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x01);
6043 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0x38);
6045 if(SiS_Pr->SiS_IF_DEF_FSTN) {
6046 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2b,0x02);
6047 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2c,0x00);
6048 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x00);
6049 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,0x0c);
6050 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,0x00);
6051 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,0x00);
6052 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,0x80);
6053 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,0xA0);
6054 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3a,0x00);
6055 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
6056 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3c,0x00);
6057 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3d,0x10);
6058 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3e,0x00);
6059 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3f,0x00);
6060 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,0x10);
6061 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,0x25);
6062 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,0x80);
6063 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,0x14);
6064 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x44,0x03);
6065 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x45,0x0a);
6073 SiS_SetGroup1(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
6077 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
6085 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
6086 SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6091 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
6092 } else if(SiS_Pr->UseCustomMode) {
6093 modeflag = SiS_Pr->CModeFlag;
6095 CRT1Index = SiS_GetRefCRT1CRTC(SiS_Pr, RefreshRateTableIndex, SiS_Pr->SiS_UseWideCRT2);
6096 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
6097 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6100 if(SiS_Pr->ChipType == SIS_550 &&
6101 SiS_Pr->SiS_IF_DEF_LVDS &&
6102 !SiS_Pr->SiS_IF_DEF_DSTN &&
6103 !SiS_Pr->SiS_IF_DEF_FSTN) {
6107 SiS_SetCRT2Offset(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6109 if( ! ((SiS_Pr->ChipType >= SIS_315H) &&
6111 (SiS_Pr->SiS_IF_DEF_LVDS == 1) &&
6112 (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
6114 if(SiS_Pr->ChipType < SIS_315H ) {
6116 SiS_SetCRT2FIFO_300(SiS_Pr, ModeNo);
6120 SiS_SetCRT2FIFO_310(SiS_Pr);
6126 if(SiS_Pr->ChipType < SIS_315H) {
6130 temp = (SiS_Pr->SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
6131 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x08,temp); /* CRT2 Horizontal Total */
6133 temp = (((SiS_Pr->SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
6134 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp); /* CRT2 Horizontal Total Overflow [7:4] */
6136 temp = (SiS_Pr->SiS_VGAHDE + 12) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
6137 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0A,temp); /* CRT2 Horizontal Display Enable End */
6139 pushbx = SiS_Pr->SiS_VGAHDE + 12; /* bx BTVGA2HRS 0x0B,0x0C */
6140 tempcx = (SiS_Pr->SiS_VGAHT - SiS_Pr->SiS_VGAHDE) >> 2;
6153 tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HT 0x08,0x09 */
6155 if((SiS_Pr->SiS_VBType & VB_SISVB) || lvds550) {
6158 tempax = SiS_Pr->SiS_VGAHDE >> 1;
6159 tempcx = SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE + tempax;
6160 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
6161 tempcx = SiS_Pr->SiS_HT - tempax;
6166 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x08,tempcx); /* CRT2 Horizontal Total */
6168 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp); /* CRT2 Horizontal Total Overflow [7:4] */
6170 tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HDEE 0x0A,0x0C */
6171 tempbx = SiS_Pr->SiS_VGAHDE;
6180 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0A,tempbx); /* CRT2 Horizontal Display Enable End */
6190 if(SiS_Pr->SiS_VBType & VB_SISVB) {
6191 if(SiS_Pr->ChipType >= SIS_661) {
6192 if((SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) ||
6193 (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
6207 if(SiS_Pr->SiS_VBType & VB_SISVB) {
6209 if(SiS_Pr->UseCustomMode) {
6210 tempbx = SiS_Pr->CHSyncStart + bridgeadd;
6211 tempcx = SiS_Pr->CHSyncEnd + bridgeadd;
6212 tempax = SiS_Pr->SiS_VGAHT;
6218 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
6220 if(SiS_Pr->UseCustomMode) {
6221 cr4 = SiS_Pr->CCRT1CRTC[4];
6222 cr14 = SiS_Pr->CCRT1CRTC[14];
6223 cr5 = SiS_Pr->CCRT1CRTC[5];
6224 cr15 = SiS_Pr->CCRT1CRTC[15];
6226 cr4 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
6227 cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
6228 cr5 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
6229 cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
6237 tempax = SiS_Pr->SiS_VGAHT;
6243 if(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 | TVSet525p1024)) {
6250 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0B,tempbx); /* CRT2 Horizontal Retrace Start */
6252 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0D,tempcx); /* CRT2 Horizontal Retrace End */
6255 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0C,temp); /* Overflow */
6259 tempcx = SiS_Pr->SiS_VGAVT - 1;
6261 if((SiS_Pr->ChipType < SIS_661) && !lvds550) {
6262 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
6263 if(SiS_Pr->ChipType < SIS_315H) {
6264 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
6265 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
6272 } else if(SiS_Pr->ChipType >= SIS_315H) {
6276 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0E,temp); /* CRT2 Vertical Total */
6278 tempbx = SiS_Pr->SiS_VGAVDE - 1;
6279 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0F,tempbx); /* CRT2 Vertical Display Enable End */
6282 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x12,temp); /* Overflow */
6284 if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->ChipType < SIS_661) && !lvds550) {
6285 tempcx = (SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 2;
6286 tempbx = SiS_Pr->SiS_VGAVDE + tempcx;
6290 tempbx = (SiS_Pr->SiS_VGAVT + SiS_Pr->SiS_VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */
6291 tempcx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */
6294 if(SiS_Pr->SiS_VBType & VB_SISVB) {
6295 if(SiS_Pr->UseCustomMode) {
6296 tempbx = SiS_Pr->CVSyncStart;
6297 tempcx = SiS_Pr->CVSyncEnd;
6299 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
6301 if(SiS_Pr->UseCustomMode) {
6302 cr8 = SiS_Pr->CCRT1CRTC[8];
6303 cr7 = SiS_Pr->CCRT1CRTC[7];
6304 cr13 = SiS_Pr->CCRT1CRTC[13];
6305 tempcx = SiS_Pr->CCRT1CRTC[9];
6307 cr8 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
6308 cr7 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
6309 cr13 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
6310 tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
6318 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x10,tempbx); /* CRT2 Vertical Retrace Start */
6321 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x11,temp); /* CRT2 Vert. Retrace End; Overflow */
6325 if(SiS_Pr->ChipType < SIS_315H) {
6329 if(SiS_Pr->SiS_VBType & VB_SISVB) {
6331 if(SiS_Pr->ChipType == SIS_300) {
6333 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) temp = 0x2c;
6334 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) temp = 0x20;
6336 if(SiS_Pr->SiS_VBType & VB_SIS301) {
6337 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) temp = 0x20;
6339 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x960) temp = 0x24;
6340 if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) temp = 0x2c;
6341 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x08;
6342 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
6343 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) temp = 0x2c;
6346 if(SiS_Pr->SiS_UseROM) {
6348 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoYPbPrHiVision)
6350 else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision)
6352 else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)
6358 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
6359 if(SiS_Pr->PDC != -1) temp = SiS_Pr->PDC;
6364 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
6365 if(SiS_Pr->SiS_LCDResInfo == Panel_640x480) temp = 0x04;
6367 if(SiS_Pr->SiS_UseROM) {
6372 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
6373 if(SiS_Pr->PDC != -1) temp = SiS_Pr->PDC;
6379 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp); /* Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
6387 if(SiS_Pr->ChipType < SIS_661) {
6389 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
6391 if(SiS_Pr->ChipType == SIS_740) temp = 0x03;
6394 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x0a;
6396 if(SiS_Pr->ChipType == SIS_650) {
6397 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
6398 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempbl = 0x0F;
6402 if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN || lvds550) {
6405 if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
6410 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp); /* Panel Link Delay Compensation */
6418 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2C,0x3f,tempax);
6426 if(SiS_Pr->SiS_VBType & VB_SISVB) {
6427 if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
6429 SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6430 } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6431 SiS_SetGroup1_301(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6434 if(SiS_Pr->ChipType < SIS_315H) {
6435 SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6437 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
6438 if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
6439 SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6442 SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
6454 SiS_GetCRT2Part2Ptr(struct SiS_Private *SiS_Pr,unsigned short ModeNo,unsigned short ModeIdIndex,
6459 if(SiS_Pr->ChipType < SIS_315H) return FALSE;
6462 (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
6464 (*ResIndex) = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
6469 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
6470 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
6475 if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
6476 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
6477 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) (*CRT2Index) = 206;
6486 SiS_Group2LCDSpecial(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short crt2crtc)
6494 if(!SiS_Pr->UseCustomMode) {
6495 if( ( ( (SiS_Pr->ChipType == SIS_630) ||
6496 (SiS_Pr->ChipType == SIS_730) ) &&
6497 (SiS_Pr->ChipRevision > 2) ) &&
6498 (SiS_Pr->SiS_LCDResInfo == Panel_1024x768) &&
6499 (!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) &&
6500 (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
6502 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,0xB9);
6503 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,0xCC);
6504 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xA6);
6506 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x2B);
6507 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x13);
6508 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,0xE5);
6509 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,0x08);
6510 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xE2);
6514 if(SiS_Pr->ChipType < SIS_315H) {
6515 if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
6518 if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
6519 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6525 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xff);
6528 if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
6529 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6531 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x28);
6535 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x18);
6536 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
6544 SiS_Set300Part2Regs(struct SiS_Private *SiS_Pr, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex,
6551 if(SiS_Pr->ChipType != SIS_300) return;
6552 if(!(SiS_Pr->SiS_VBType & VB_SIS30xBLV)) return;
6553 if(SiS_Pr->UseCustomMode) return;
6556 crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
6558 crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
6562 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
6563 else CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2;
6567 CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
6571 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,(CRT2Part2Ptr+resindex)->CR[0]);
6572 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x02,0x80,(CRT2Part2Ptr+resindex)->CR[1]);
6574 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
6577 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
6580 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
6582 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
6583 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
6588 SiS_SetTVSpecial(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
6590 if(!(SiS_Pr->SiS_VBType & VB_SIS30xBLV)) return;
6591 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;
6592 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr625i | TVSetYPbPr625p)) return;
6594 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
6595 if(SiS_Pr->SiS_TVMode & TVSetHiVi960540) {
6596 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x14);
6597 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x47);
6598 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1f,0xea);
6599 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0f,0x00);
6600 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2b,0xf0,0x0e);
6601 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x42,0x0f,0x00);
6602 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,0xe6);
6603 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x44,0x90);
6604 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xc0,0x09);
6605 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xf8,0x03);
6607 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
6610 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x19);
6611 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x23);
6612 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1f,0x1c);
6613 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0f,0x10);
6614 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2b,0xf0,0x0b);
6615 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x42,0x0f,0x10);
6616 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,0x2c);
6617 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x44,0x68);
6618 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xc0,0x01);
6619 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xf8,0x05);
6622 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
6623 if(SiS_Pr->SiS_TVMode & TVSet525p1024) {
6624 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1f,0x77);
6625 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x20,0x13);
6626 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2b,0x78);
6627 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2c,0x04);
6628 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x42,0x14);
6629 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,0x73);
6630 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1c,0xaf);
6631 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1e,0x71);
6632 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x21,0xbb);
6633 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,0xb5);
6634 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x26,0xdc);
6635 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x46,0x3c);
6636 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x45,0x11);
6637 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x44,0x00);
6639 } else if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
6640 if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
6648 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,specialtv[j]);
6650 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,0x72);
6651 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750)) {
6652 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
6653 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x14);
6654 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1b);
6656 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x14); /* 15 */
6657 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1a); /* 1b */
6664 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1b); /* 21 */
6665 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x54); /* 5a */
6667 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1a); /* 21 */
6668 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x53); /* 5a */
6674 SiS_SetGroup2_Tail(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
6678 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
6679 if(SiS_Pr->SiS_VGAVDE == 525) {
6681 if(SiS_Pr->SiS_ModeType <= ModeVGA) {
6683 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) temp += 2;
6685 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2f,temp);
6686 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x30,0xb3);
6687 } else if(SiS_Pr->SiS_VGAVDE == 420) {
6689 if(SiS_Pr->SiS_ModeType <= ModeVGA) {
6691 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) temp++;
6693 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2f,temp);
6697 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
6698 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) {
6699 if(SiS_Pr->SiS_VBType & VB_SIS30xB) {
6700 SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x1a,0x03);
6705 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0b,temp);
6711 SiS_SetGroup2(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
6723 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
6727 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
6728 crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
6729 } else if(SiS_Pr->UseCustomMode) {
6730 modeflag = SiS_Pr->CModeFlag;
6733 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6734 crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
6738 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToAVIDEO)) temp |= 0x08;
6739 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO)) temp |= 0x04;
6740 if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) temp |= 0x02;
6741 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) temp |= 0x01;
6743 if(!(SiS_Pr->SiS_TVMode & TVSetPALTiming)) temp |= 0x10;
6745 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x00,temp);
6748 TimingPoint = SiS_Pr->SiS_PALTiming;
6751 if( (SiS_Pr->SiS_VBType & VB_SIS30xBLV) &&
6752 ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
6753 (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
6757 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
6759 TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
6760 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6761 TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
6762 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
6763 TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
6767 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
6770 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) i = 2;
6771 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) i = 1;
6772 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr625i) i = 3;
6773 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr625p) i = 4;
6779 } else if(SiS_Pr->SiS_TVMode & TVSetPAL) {
6785 TimingPoint = SiS_Pr->SiS_NTSCTiming;
6786 PhaseIndex = (SiS_Pr->SiS_TVMode & TVSetNTSCJ) ? 0x01 : 0x00; /* SiS_PALPhase : SiS_NTSCPhase */
6791 if(SiS_Pr->SiS_TVMode & (TVSetPALM | TVSetPALN)) {
6792 PhaseIndex = (SiS_Pr->SiS_TVMode & TVSetPALM) ? 0x02 : 0x03; /* SiS_PALMPhase : SiS_PALNPhase */
6796 if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
6797 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
6799 } else if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
6807 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS_TVPhase[(PhaseIndex * 4) + j]);
6811 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
6814 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
6817 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
6818 if(SiS_Pr->SiS_ModeType != ModeText) {
6819 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
6823 SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x0A,SiS_Pr->SiS_NewFlickerMode);
6825 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x35,SiS_Pr->SiS_RY1COE);
6826 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x36,SiS_Pr->SiS_RY2COE);
6827 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x37,SiS_Pr->SiS_RY3COE);
6828 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
6830 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempax = 950;
6831 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempax = 680;
6832 else if(SiS_Pr->SiS_TVMode & TVSetPALTiming) tempax = 520;
6835 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (SiS_Pr->SiS_VDE <= tempax)) {
6837 tempax -= SiS_Pr->SiS_VDE;
6839 if(!(SiS_Pr->SiS_TVMode & TVSetYPbPrProg)) {
6845 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,temp);
6848 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,temp);
6851 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoYPbPrHiVision) && (SiS_Pr->SiS_VGAHDE >= 1024)) {
6852 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
6853 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1b);
6854 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x54);
6856 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x17);
6857 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1d);
6861 tempcx = SiS_Pr->SiS_HT;
6862 if(SiS_IsDualLink(SiS_Pr)) tempcx >>= 1;
6864 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) tempcx--;
6865 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1B,tempcx);
6866 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0xF0,((tempcx >> 8) & 0x0f));
6868 tempcx = SiS_Pr->SiS_HT >> 1;
6869 if(SiS_IsDualLink(SiS_Pr)) tempcx >>= 1;
6871 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempcx -= 4;
6872 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,((tempcx << 4) & 0xf0));
6876 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x24,tempbx);
6877 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0F,((tempbx >> 4) & 0xf0));
6880 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
6884 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x29,0x0F,((tempbx << 4) & 0xf0));
6888 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x27,tempcx);
6889 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x28,0x0F,((tempcx >> 4) & 0xf0));
6892 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempcx -= 4;
6893 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2A,0x0F,((tempcx << 4) & 0xf0));
6895 tempcx = SiS_Pr->SiS_HT >> 1;
6896 if(SiS_IsDualLink(SiS_Pr)) tempcx >>= 1;
6899 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2D,0x0F,((tempcx << 4) & 0xf0));
6902 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
6903 tempcx = SiS_GetVGAHT2(SiS_Pr) - 1;
6905 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2E,tempcx);
6907 tempbx = SiS_Pr->SiS_VDE;
6908 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
6909 if(SiS_Pr->SiS_VGAVDE == 360) tempbx = 746;
6910 else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 746;
6911 else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 853;
6912 } else if( (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) &&
6913 (!(SiS_Pr->SiS_TVMode & TVSetYPbPrProg)) ) {
6915 if(SiS_Pr->ChipType >= SIS_315H) {
6916 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
6918 } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6919 if(SiS_Pr->SiS_ModeType <= ModeVGA) {
6924 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
6925 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
6928 if(!(SiS_Pr->SiS_TVMode & TVSetPALTiming)) {
6934 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2F,tempbx);
6938 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
6940 if(SiS_Pr->SiS_VBInfo & SetCRT2ToAVIDEO) temp |= 0x20;
6942 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x30,temp);
6944 if(SiS_Pr->SiS_VBType & VB_SISPART4OVERFLOW) {
6945 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x10,0xdf,((tempbx & 0x0400) >> 5));
6948 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
6949 tempbx = SiS_Pr->SiS_VDE;
6950 if( (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) &&
6951 (!(SiS_Pr->SiS_TVMode & TVSetYPbPrProg)) ) {
6956 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x46,temp);
6957 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x47,tempbx);
6959 if(SiS_Pr->SiS_VBType & VB_SISPART4OVERFLOW) {
6960 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x10,0xbf,((tempbx & 0x0400) >> 4));
6966 if(SiS_Pr->SiS_VGAHDE >= SiS_Pr->SiS_HDE) {
6972 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
6973 if(SiS_Pr->SiS_VGAHDE >= 960) {
6976 if(SiS_Pr->SiS_VGAHDE >= 1280) {
6979 } else if(SiS_Pr->SiS_VGAHDE >= 1024) {
6990 longtemp = ((SiS_Pr->SiS_VGAHDE * tempch) / tempcl) << 13;
6991 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) longtemp <<= 3;
6992 tempax = longtemp / SiS_Pr->SiS_HDE;
6993 if(longtemp % SiS_Pr->SiS_HDE) tempax++;
6998 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x44,tempax);
6999 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,tempbx);
7001 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
7003 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xF8,(tempcx & 0x07));
7005 if(SiS_Pr->SiS_TVMode & TVSetPALTiming) {
7012 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4B,tempbx);
7013 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4C,tempcx);
7016 if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
7018 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p|TVSetYPbPr625p)) temp |= 0x20;
7019 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) temp |= 0x40;
7021 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4D,temp);
7023 temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x43);
7024 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,(temp - 3));
7026 SiS_SetTVSpecial(SiS_Pr, ModeNo);
7028 if(SiS_Pr->SiS_VBType & VB_SIS30xCLV) {
7030 if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 8;
7031 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4e,0xf7,temp);
7036 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
7037 if(!(SiS_Pr->SiS_TVMode & TVSetNTSC1024)) {
7038 temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x01);
7039 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,(temp - 1));
7041 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
7044 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
7045 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
7046 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0B,0x00);
7050 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) return;
7054 tempbx = SiS_Pr->SiS_HDE;
7055 if(SiS_IsDualLink(SiS_Pr)) tempbx >>= 1;
7057 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2C,tempbx);
7058 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2B,0x0F,((tempbx >> 4) & 0xf0));
7061 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
7062 if(SiS_Pr->SiS_ModeType == ModeEGA) {
7063 if(SiS_Pr->SiS_VGAHDE >= 1024) {
7065 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
7071 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0B,temp);
7073 tempbx = SiS_Pr->SiS_VDE - 1;
7074 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x03,tempbx);
7075 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0C,0xF8,((tempbx >> 8) & 0x07));
7077 tempcx = SiS_Pr->SiS_VT - 1;
7078 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x19,tempcx);
7080 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
7082 if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
7086 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1A,0x0f,temp);
7088 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x09,0xF0);
7089 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x0A,0xF0);
7091 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x17,0xFB);
7092 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x18,0xDF);
7095 if(SiS_GetCRT2Part2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
7100 case 200: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1; break;
7103 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,(CRT2Part2Ptr+resindex)->CR[0]);
7104 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x02,0x80,(CRT2Part2Ptr+resindex)->CR[1]);
7106 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
7109 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
7112 SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
7114 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
7115 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
7117 SiS_SetGroup2_Tail(SiS_Pr, ModeNo);
7127 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
7128 if((SiS_Pr->SiS_LCDInfo & LCDPass11) || (SiS_Pr->PanelYRes == SiS_Pr->SiS_VDE)) {
7129 tempbx = SiS_Pr->SiS_VDE - 1;
7130 tempcx = SiS_Pr->SiS_VT - 1;
7132 tempbx = SiS_Pr->SiS_VDE + ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VDE) / 2);
7133 tempcx = SiS_Pr->SiS_VT - ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VDE) / 2);
7136 tempbx = SiS_Pr->PanelYRes;
7137 tempcx = SiS_Pr->SiS_VT;
7139 if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
7140 tempax = SiS_Pr->PanelYRes;
7141 /* if(SiS_Pr->SiS_VGAVDE == 525) tempax += 0x3c; */ /* 651+301C */
7142 if(SiS_Pr->PanelYRes < SiS_Pr->SiS_VDE) {
7145 tempax -= SiS_Pr->SiS_VDE;
7161 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,tempcx); /* lcdvdes */
7162 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,tempbx); /* lcdvdee */
7166 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,temp);
7168 tempax = SiS_Pr->SiS_VDE;
7169 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
7170 tempax = SiS_Pr->PanelYRes;
7172 tempcx = (SiS_Pr->SiS_VT - tempax) >> 4;
7173 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
7174 if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
7175 tempcx = (SiS_Pr->SiS_VT - tempax) / 10;
7179 tempbx = ((SiS_Pr->SiS_VT + SiS_Pr->SiS_VDE) >> 1) - 1;
7180 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
7181 if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
7182 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) { /* ? */
7183 tempax = SiS_Pr->SiS_VT - SiS_Pr->PanelYRes;
7189 if(tempbx <= SiS_Pr->SiS_VDE) tempbx = SiS_Pr->SiS_VDE + 1;
7193 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
7195 if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (crt2crtc == 6)) {
7196 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
7205 if(SiS_Pr->UseCustomMode) {
7206 tempbx = SiS_Pr->CVSyncStart;
7215 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,tempbx); /* lcdvrs */
7221 if(SiS_Pr->UseCustomMode) {
7223 temp |= (SiS_Pr->CVSyncEnd & 0x0f);
7232 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,temp);
7235 SiS_Group2LCDSpecial(SiS_Pr, ModeNo, crt2crtc);
7239 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) bridgeoffset += 2;
7240 if(SiS_Pr->SiS_VBType & VB_SIS30xCLV) bridgeoffset += 2; /* OK for Averatec 1280x800 (301C) */
7241 if(SiS_IsDualLink(SiS_Pr)) bridgeoffset++;
7242 else if(SiS_Pr->SiS_VBType & VB_SIS302LV) bridgeoffset++; /* OK for Asus A4L 1280x800 */
7246 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
7247 if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) {
7248 temp = SiS_Pr->SiS_HT - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_HDE) / 2);
7249 if(SiS_IsDualLink(SiS_Pr)) temp >>= 1;
7253 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1F,temp); /* lcdhdes */
7254 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0F,((temp >> 4) & 0xf0));
7256 tempcx = SiS_Pr->SiS_HT;
7257 tempax = tempbx = SiS_Pr->SiS_HDE;
7258 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
7259 if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) {
7260 tempax = SiS_Pr->PanelXRes;
7261 tempbx = SiS_Pr->PanelXRes - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_HDE) / 2);
7264 if(SiS_IsDualLink(SiS_Pr)) {
7278 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,tempbx); /* lcdhdee */
7279 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0xF0,((tempbx >> 8) & 0x0f));
7286 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
7287 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
7288 if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
7289 if(SiS_Pr->SiS_HDE == 1280) tempbx = (tempbx & 0xff00) | 0x47;
7294 if(SiS_Pr->UseCustomMode) {
7295 tempbx = SiS_Pr->CHSyncStart;
7297 if(SiS_IsDualLink(SiS_Pr)) tempbx >>= 1;
7307 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1C,tempbx); /* lcdhrs */
7308 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0x0F,((tempbx >> 4) & 0xf0));
7313 if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
7314 if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) tempcx >>= 2;
7318 if(SiS_Pr->UseCustomMode) {
7319 tempbx = SiS_Pr->CHSyncEnd;
7321 if(SiS_IsDualLink(SiS_Pr)) tempbx >>= 1;
7331 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x21,tempbx); /* lcdhre */
7333 SiS_SetGroup2_Tail(SiS_Pr, ModeNo);
7336 SiS_Set300Part2Regs(SiS_Pr, ModeIdIndex, RefreshRateTableIndex, ModeNo);
7348 SiS_SetGroup3(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
7353 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
7356 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x00,0x00);
7361 if(SiS_Pr->SiS_TVMode & TVSetPALTiming) {
7362 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xFA);
7363 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xC8);
7365 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xF5);
7366 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xB7);
7369 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
7370 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xFA);
7371 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xC8);
7372 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
7376 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
7377 tempdi = SiS_Pr->SiS_HiTVGroup3Data;
7378 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
7379 tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
7381 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
7382 if(!(SiS_Pr->SiS_TVMode & (TVSetYPbPr525i | TVSetYPbPr625i))) {
7383 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p)
7385 else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p)
7391 SiS_SetReg(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
7393 if(SiS_Pr->SiS_VBType & VB_SIS30xCLV) {
7394 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
7395 SiS_SetReg(SiS_Pr->SiS_Part3Port,0x28,0x3f);
7412 SiS_ShiftXPos(struct SiS_Private *SiS_Pr, int shift)
7416 temp1 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x1f);
7417 temp2 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x20);
7419 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1f,temp);
7420 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0f,((temp >> 4) & 0xf0));
7421 temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x2b) & 0x0f;
7423 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2b,0xf0,(temp & 0x0f));
7424 temp1 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x43);
7425 temp2 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x42);
7427 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,temp);
7428 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x42,0x0f,((temp >> 4) & 0xf0));
7433 SiS_SetGroup4_C_ELV(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
7436 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
7438 if(!(SiS_Pr->SiS_VBType & VB_SIS30xCLV)) return;
7439 if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToHiVision | SetCRT2ToYPbPr525750))) return;
7441 if(SiS_Pr->ChipType >= XGI_20) return;
7443 if((SiS_Pr->ChipType >= SIS_661) && (SiS_Pr->SiS_ROMNew)) {
7447 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x3a,0x08);
7448 temp = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x3a);
7450 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x3a,0xdf);
7451 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x25,0xfc);
7452 if((SiS_Pr->ChipType < SIS_661) && (!(SiS_Pr->SiS_ROMNew))) {
7453 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x25,0xf8);
7455 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x0f,0xfb);
7456 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) temp = 0x0000;
7457 else if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p|TVSetYPbPr625p)) temp = 0x0002;
7458 else if(SiS_Pr->SiS_TVMode & TVSetHiVision) temp = 0x0400;
7460 if((SiS_Pr->ChipType >= SIS_661) || (SiS_Pr->SiS_ROMNew)) {
7462 if(SiS_Pr->SiS_TVMode & TVAspect43) temp1 = 4;
7463 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0f,0xfb,temp1);
7464 if(SiS_Pr->SiS_TVMode & TVAspect43LB) temp |= 0x01;
7465 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0x7c,(temp & 0xff));
7466 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x3a,0xfb,(temp >> 8));
7468 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,0xfd);
7471 temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x3b) & 0x03;
7474 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xf8,(temp & 0xff));
7475 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x3a,0xfb,(temp >> 8));
7477 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x3b,0xfd);
7482 if(SiS_Pr->ChipType >= SIS_661) { /* ? */
7483 if(SiS_Pr->SiS_TVMode & TVAspect43) {
7484 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
7486 SiS_ShiftXPos(SiS_Pr, 97);
7488 SiS_ShiftXPos(SiS_Pr, 111);
7490 } else if(SiS_Pr->SiS_TVMode & TVSetHiVision) {
7491 SiS_ShiftXPos(SiS_Pr, 136);
7503 SiS_SetCRT2VCLK(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
7508 if(SiS_Pr->UseCustomMode) {
7509 reg1 = SiS_Pr->CSR2B;
7510 reg2 = SiS_Pr->CSR2C;
7512 vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
7513 reg1 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
7514 reg2 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
7517 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
7518 if(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 | TVSet525p1024)) {
7519 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,0x57);
7520 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,0x46);
7521 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1f,0xf6);
7523 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,reg1);
7524 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,reg2);
7527 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,0x01);
7528 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,reg2);
7529 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,reg1);
7531 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x12,0x00);
7533 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) temp |= 0x20;
7534 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,temp);
7538 SiS_SetDualLinkEtc(struct SiS_Private *SiS_Pr)
7540 if(SiS_Pr->ChipType >= SIS_315H) {
7541 if(SiS_Pr->SiS_VBType & VB_SISDUALLINK) {
7542 if((SiS_CRT2IsLCD(SiS_Pr)) ||
7543 (SiS_IsVAMode(SiS_Pr))) {
7544 if(SiS_Pr->SiS_LCDInfo & LCDDualLink) {
7545 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
7547 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x27,~0x20);
7552 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
7553 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00);
7555 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
7557 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
7562 SiS_SetGroup4(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
7569 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
7570 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
7571 } else if(SiS_Pr->UseCustomMode) {
7572 modeflag = SiS_Pr->CModeFlag;
7575 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7576 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
7579 if(SiS_Pr->ChipType >= SIS_315H) {
7580 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
7581 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
7582 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x24,0x0e);
7587 if(SiS_Pr->SiS_VBType & (VB_SIS30xCLV | VB_SIS302LV)) {
7588 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
7589 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x10,0x9f);
7593 if(SiS_Pr->ChipType >= SIS_315H) {
7594 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
7595 SiS_SetDualLinkEtc(SiS_Pr);
7600 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x13,SiS_Pr->SiS_RVBHCFACT);
7602 tempbx = SiS_Pr->SiS_RVBHCMAX;
7603 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x14,tempbx);
7607 tempcx = SiS_Pr->SiS_VGAHT - 1;
7608 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x16,tempcx);
7612 tempcx = SiS_Pr->SiS_VGAVT - 1;
7613 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempcx -= 5;
7614 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x17,tempcx);
7617 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x15,temp);
7619 tempbx = SiS_Pr->SiS_VGAHDE;
7621 if(SiS_IsDualLink(SiS_Pr)) tempbx >>= 1;
7623 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
7626 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
7630 } else if(SiS_Pr->SiS_TVMode & TVSetYPbPrProg) {
7639 temp |= SiS_Pr->Init_P4_0E;
7641 if(SiS_Pr->SiS_VBType & VB_SIS301) {
7642 if(SiS_Pr->SiS_LCDResInfo != Panel_1280x1024) {
7648 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0E,0x10,temp);
7650 tempeax = SiS_Pr->SiS_VGAVDE;
7651 tempebx = SiS_Pr->SiS_VDE;
7652 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
7656 tempcx = SiS_Pr->SiS_RVBHRS;
7657 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x18,tempcx);
7673 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1B,temp);
7675 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1A,temp);
7678 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x19,temp);
7680 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
7682 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1C,0x28);
7686 if(SiS_Pr->SiS_TVMode & (TVSetHiVision | TVSetYPbPr750p)) tempbx = 0x08;
7687 tempax = SiS_Pr->SiS_VGAHDE;
7689 if(SiS_IsDualLink(SiS_Pr)) tempax >>= 1;
7691 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
7702 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
7717 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1D,tempax);
7718 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1E,temp);
7721 if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SISLVDS)) {
7724 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
7725 if(!(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 |
7729 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
7730 if(!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
7736 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,tempbx,temp);
7738 tempbx = SiS_Pr->SiS_HT >> 1;
7739 if(SiS_IsDualLink(SiS_Pr)) tempbx >>= 1;
7741 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x22,tempbx);
7743 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0xC0,temp);
7745 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
7746 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
7747 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x24,0x0e);
7752 SiS_SetDualLinkEtc(SiS_Pr);
7756 SiS_SetCRT2VCLK(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
7764 SiS_SetGroup5(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
7767 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
7769 if(SiS_Pr->SiS_ModeType == ModeVGA) {
7770 if(!(SiS_Pr->SiS_VBInfo & (SetInSlaveMode | LoadDACFlag))) {
7771 SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
7772 SiS_LoadDAC(SiS_Pr, ModeNo, ModeIdIndex);
7782 SiS_GetLVDSCRT1Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
7792 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
7793 (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
7795 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7796 (*ResIndex) = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
7801 if((SiS_Pr->SiS_IF_DEF_CH70xx) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
7804 if((SiS_Pr->SiS_TVMode & TVSetPAL) && (!(SiS_Pr->SiS_TVMode & TVSetPALM))) {
7806 if(SiS_Pr->SiS_ModeType > ModeVGA) {
7807 if(SiS_Pr->SiS_CHSOverScan) (*DisplayType) = 84;
7811 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) (*DisplayType)++;
7817 switch(SiS_Pr->SiS_LCDResInfo) {
7836 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x600) {
7837 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) (*DisplayType) += 2;
7846 SiS_ModCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
7856 if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
7857 (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
7858 (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
7859 (SiS_Pr->SiS_CustomT == CUT_PANEL856) )
7862 if(SiS_Pr->SiS_IF_DEF_LVDS) {
7863 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
7864 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return;
7866 } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
7867 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return;
7870 if(SiS_Pr->SiS_LCDInfo & LCDPass11) return;
7872 if(SiS_Pr->ChipType < SIS_315H) {
7873 if(SiS_Pr->SiS_SetFlag & SetDOSMode) return;
7876 if(!(SiS_GetLVDSCRT1Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
7882 case 50: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x240_1; break; /* xSTN */
7883 case 14: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x240_2; break; /* xSTN */
7884 case 15: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x240_2_H; break; /* xSTN */
7885 case 18: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x240_3; break; /* xSTN */
7886 case 19: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x240_3_H; break; /* xSTN */
7887 case 10: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1; break;
7888 case 11: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1_H; break;
7890 case 26: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1; break;
7891 case 27: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1_H; break;
7892 case 28: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2; break;
7893 case 29: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2_H; break;
7895 case 80: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UNTSC; break;
7896 case 81: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1ONTSC; break;
7897 case 82: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UPAL; break;
7898 case 83: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL; break;
7899 case 84: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1SOPAL; break;
7904 SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
7908 SiS_SetReg(SiS_Pr->SiS_P3d4,CRIdx[i],tempah);
7913 SiS_SetReg(SiS_Pr->SiS_P3c4,i,tempah);
7917 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1f,tempah);
7919 if(ModeNo <= 0x13) modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
7920 else modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7924 SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,~0x020,tempah);
7928 SiS_CalcLCDACRT1Timing(SiS_Pr, ModeNo, ModeIdIndex);
7938 SiS_SetCRT2ECLK(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
7941 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
7945 if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
7946 SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
7947 if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK == 2) {
7950 vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex,
7952 SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
7954 vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex,
7958 sr2b = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
7959 sr2c = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
7961 if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
7962 if(SiS_Pr->SiS_UseROM) {
7971 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
7972 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
7977 SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x20);
7978 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
7979 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
7980 SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x10);
7981 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
7982 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
7983 SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x00);
7984 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
7985 SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
7993 SiS_SetCHTVReg(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
8000 resindex = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
8002 resindex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
8007 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
8008 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
8010 if(SiS_Pr->SiS_ModeType > ModeVGA) {
8011 if(SiS_Pr->SiS_CHSOverScan) TVType = 8;
8013 if(SiS_Pr->SiS_TVMode & TVSetPALM) {
8015 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
8016 } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
8018 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
8023 case 0: CHTVRegData = SiS_Pr->SiS_CHTVReg_UNTSC; break;
8024 case 1: CHTVRegData = SiS_Pr->SiS_CHTVReg_ONTSC; break;
8025 case 2: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPAL; break;
8026 case 3: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
8027 case 4: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALM; break;
8028 case 5: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALM; break;
8029 case 6: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALN; break;
8030 case 7: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALN; break;
8031 case 8: CHTVRegData = SiS_Pr->SiS_CHTVReg_SOPAL; break;
8032 default: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
8036 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
8045 if(SiS_Pr->SiS_TVMode & TVSetPAL) {
8046 SiS_SetCH700x(SiS_Pr,0x04,0x43); /* 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
8047 SiS_SetCH700x(SiS_Pr,0x09,0x69); /* Black level for PAL (105)*/
8049 SiS_SetCH700x(SiS_Pr,0x04,0x03); /* upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
8050 SiS_SetCH700x(SiS_Pr,0x09,0x71); /* Black level for NTSC (113)*/
8053 SiS_SetCH700x(SiS_Pr,0x00,CHTVRegData[resindex].Reg[0]); /* Mode register */
8054 SiS_SetCH700x(SiS_Pr,0x07,CHTVRegData[resindex].Reg[1]); /* Start active video register */
8055 SiS_SetCH700x(SiS_Pr,0x08,CHTVRegData[resindex].Reg[2]); /* Position overflow register */
8056 SiS_SetCH700x(SiS_Pr,0x0a,CHTVRegData[resindex].Reg[3]); /* Horiz Position register */
8057 SiS_SetCH700x(SiS_Pr,0x0b,CHTVRegData[resindex].Reg[4]); /* Vertical Position register */
8064 SiS_SetCH700x(SiS_Pr,0x01,0x28);
8073 SiS_SetCH700x(SiS_Pr,0x03,0xb1); /* old: 3103 */
8079 SiS_SetCH70xx(SiS_Pr,0x3d,0x00);
8085 SiS_SetCH70xxANDOR(SiS_Pr,0x10,0x00,0x1F);
8090 SiS_SetCH70xxANDOR(SiS_Pr,0x11,0x02,0xF8);
8094 SiS_SetCH70xxANDOR(SiS_Pr,0x1c,0x00,0xEF);
8096 if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) { /* ---- NTSC ---- */
8097 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) {
8099 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
8100 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE); /* ACIV on, no need to set FSCI */
8102 SiS_SetCH70xxANDOR(SiS_Pr,0x18,0x01,0xF0); /* 0x18-0x1f: FSCI 469,762,048 */
8103 SiS_SetCH70xxANDOR(SiS_Pr,0x19,0x0C,0xF0);
8104 SiS_SetCH70xxANDOR(SiS_Pr,0x1a,0x00,0xF0);
8105 SiS_SetCH70xxANDOR(SiS_Pr,0x1b,0x00,0xF0);
8106 SiS_SetCH70xxANDOR(SiS_Pr,0x1c,0x00,0xF0);
8107 SiS_SetCH70xxANDOR(SiS_Pr,0x1d,0x00,0xF0);
8108 SiS_SetCH70xxANDOR(SiS_Pr,0x1e,0x00,0xF0);
8109 SiS_SetCH70xxANDOR(SiS_Pr,0x1f,0x00,0xF0);
8110 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x01,0xEF); /* Loop filter on for mode 23 */
8111 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x00,0xFE); /* ACIV off, need to set FSCI */
8115 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
8116 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE);
8119 SiS_SetCH70xxANDOR(SiS_Pr,0x18,0x01,0xF0); /* (FSCI was 0x1f1c71c7 - this is for mode 22) */
8120 SiS_SetCH70xxANDOR(SiS_Pr,0x19,0x09,0xF0); /* FSCI for mode 24 is 428,554,851 */
8121 SiS_SetCH70xxANDOR(SiS_Pr,0x1a,0x08,0xF0); /* 198b3a63 */
8122 SiS_SetCH70xxANDOR(SiS_Pr,0x1b,0x0b,0xF0);
8123 SiS_SetCH70xxANDOR(SiS_Pr,0x1c,0x04,0xF0);
8124 SiS_SetCH70xxANDOR(SiS_Pr,0x1d,0x01,0xF0);
8125 SiS_SetCH70xxANDOR(SiS_Pr,0x1e,0x06,0xF0);
8126 SiS_SetCH70xxANDOR(SiS_Pr,0x1f,0x05,0xF0);
8127 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off for mode 24 */
8128 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x00,0xFE); * ACIV off, need to set FSCI */
8130 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
8131 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE);
8137 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
8138 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE); /* ACIV on */
8140 SiS_SetCH70xxANDOR(SiS_Pr,0x20,0x00,0xEF); /* loop filter off */
8141 SiS_SetCH70xxANDOR(SiS_Pr,0x21,0x01,0xFE); /* ACIV on */
8159 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) temp |= 0x10;
8160 SiS_SetCH701x(SiS_Pr,0x00,temp);
8162 SiS_SetCH701x(SiS_Pr,0x01,CHTVRegData[resindex].Reg[1]);
8163 SiS_SetCH701x(SiS_Pr,0x02,CHTVRegData[resindex].Reg[2]);
8164 SiS_SetCH701x(SiS_Pr,0x04,CHTVRegData[resindex].Reg[3]);
8165 SiS_SetCH701x(SiS_Pr,0x03,CHTVRegData[resindex].Reg[4]);
8166 SiS_SetCH701x(SiS_Pr,0x05,CHTVRegData[resindex].Reg[5]);
8167 SiS_SetCH701x(SiS_Pr,0x06,CHTVRegData[resindex].Reg[6]);
8170 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) temp = 0x66;
8171 SiS_SetCH701x(SiS_Pr,0x07,temp);
8173 SiS_SetCH701x(SiS_Pr,0x08,CHTVRegData[resindex].Reg[8]);
8174 SiS_SetCH701x(SiS_Pr,0x15,CHTVRegData[resindex].Reg[9]);
8175 SiS_SetCH701x(SiS_Pr,0x1f,CHTVRegData[resindex].Reg[10]);
8176 SiS_SetCH701x(SiS_Pr,0x0c,CHTVRegData[resindex].Reg[11]);
8177 SiS_SetCH701x(SiS_Pr,0x0d,CHTVRegData[resindex].Reg[12]);
8178 SiS_SetCH701x(SiS_Pr,0x0e,CHTVRegData[resindex].Reg[13]);
8179 SiS_SetCH701x(SiS_Pr,0x0f,CHTVRegData[resindex].Reg[14]);
8180 SiS_SetCH701x(SiS_Pr,0x10,CHTVRegData[resindex].Reg[15]);
8182 temp = SiS_GetCH701x(SiS_Pr,0x21) & ~0x02;
8189 if(SiS_Pr->SiS_TVMode & (TVSetPALN | TVSetNTSCJ)) temp |= 0x02;
8190 SiS_SetCH701x(SiS_Pr,0x21,temp);
8205 SiS_Chrontel701xBLOn(struct SiS_Private *SiS_Pr)
8210 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
8211 if(SiS_Pr->ChipType == SIS_740) {
8212 SiS_SetCH701x(SiS_Pr,0x66,0x65);
8214 temp = SiS_GetCH701x(SiS_Pr,0x66);
8216 SiS_SetCH701x(SiS_Pr,0x66,temp);
8222 SiS_Chrontel701xBLOff(struct SiS_Private *SiS_Pr)
8227 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
8228 temp = SiS_GetCH701x(SiS_Pr,0x66);
8230 SiS_SetCH701x(SiS_Pr,0x66,temp);
8235 SiS_ChrontelPowerSequencing(struct SiS_Private *SiS_Pr)
8249 if(SiS_Pr->ChipType == SIS_740) {
8250 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
8251 if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) tableptr = asus1024_740;
8253 } else if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
8254 (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
8255 (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200)) {
8256 if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) tableptr = asus1400_740;
8260 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
8262 } else if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
8263 (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
8264 (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200)) {
8270 SiS_SetCH701x(SiS_Pr, regtable[i], tableptr[i]);
8275 SiS_SetCH701xForLCD(struct SiS_Private *SiS_Pr)
8317 if(SiS_Pr->ChipType == SIS_740) {
8318 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tableptr = table1024_740;
8319 else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) tableptr = table1280_740;
8320 else if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) tableptr = table1400_740;
8321 else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) tableptr = table1600_740;
8324 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tableptr = table1024_650;
8325 else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) tableptr = table1280_650;
8326 else if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) tableptr = table1400_650;
8327 else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) tableptr = table1600_650;
8331 tempbh = SiS_GetCH701x(SiS_Pr,0x74);
8333 tempbh = SiS_GetCH701x(SiS_Pr,0x73);
8335 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) return;
8337 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) return;
8338 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) return;
8340 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) return;
8344 if(SiS_Pr->ChipType == SIS_740) tempbh = 0x0d;
8348 SiS_SetCH701x(SiS_Pr, regtable[i], tableptr[i]);
8350 SiS_ChrontelPowerSequencing(SiS_Pr);
8351 tempbh = SiS_GetCH701x(SiS_Pr,0x1e);
8353 SiS_SetCH701x(SiS_Pr,0x1e,tempbh);
8355 if(SiS_Pr->ChipType == SIS_740) {
8356 tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
8358 SiS_SetCH701x(SiS_Pr,0x1c,tempbh);
8359 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x03);
8360 tempbh = SiS_GetCH701x(SiS_Pr,0x64);
8362 SiS_SetCH701x(SiS_Pr,0x64,tempbh);
8363 tempbh = SiS_GetCH701x(SiS_Pr,0x03);
8365 SiS_SetCH701x(SiS_Pr,0x03,tempbh);
8370 SiS_ChrontelResetVSync(struct SiS_Private *SiS_Pr)
8374 temp1 = SiS_GetCH701x(SiS_Pr,0x49);
8375 SiS_SetCH701x(SiS_Pr,0x49,0x3e);
8376 temp = SiS_GetCH701x(SiS_Pr,0x47);
8378 SiS_SetCH701x(SiS_Pr,0x47,temp);
8379 SiS_LongDelay(SiS_Pr, 3);
8380 temp = SiS_GetCH701x(SiS_Pr,0x47);
8382 SiS_SetCH701x(SiS_Pr,0x47,temp);
8383 SiS_SetCH701x(SiS_Pr,0x49,temp1);
8387 SiS_Chrontel701xOn(struct SiS_Private *SiS_Pr)
8391 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
8392 if(SiS_Pr->ChipType == SIS_740) {
8393 temp = SiS_GetCH701x(SiS_Pr,0x1c);
8395 SiS_SetCH701x(SiS_Pr,0x1c,temp);
8397 if(SiS_IsYPbPr(SiS_Pr)) {
8398 temp = SiS_GetCH701x(SiS_Pr,0x01);
8401 SiS_SetCH701x(SiS_Pr,0x01,temp);
8403 if(SiS_IsChScart(SiS_Pr)) {
8404 temp = SiS_GetCH701x(SiS_Pr,0x01);
8407 SiS_SetCH701x(SiS_Pr,0x01,temp);
8409 if(SiS_Pr->ChipType == SIS_740) {
8410 SiS_ChrontelResetVSync(SiS_Pr);
8411 SiS_SetCH701x(SiS_Pr,0x49,0x20); /* Enable TV path */
8413 SiS_SetCH701x(SiS_Pr,0x49,0x20); /* Enable TV path */
8414 temp = SiS_GetCH701x(SiS_Pr,0x49);
8415 if(SiS_IsYPbPr(SiS_Pr)) {
8416 temp = SiS_GetCH701x(SiS_Pr,0x73);
8418 SiS_SetCH701x(SiS_Pr,0x73,temp);
8420 temp = SiS_GetCH701x(SiS_Pr,0x47);
8422 SiS_SetCH701x(SiS_Pr,0x47,temp);
8423 SiS_LongDelay(SiS_Pr, 2);
8424 temp = SiS_GetCH701x(SiS_Pr,0x47);
8426 SiS_SetCH701x(SiS_Pr,0x47,temp);
8432 SiS_Chrontel701xOff(struct SiS_Private *SiS_Pr)
8437 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
8438 if(SiS_Pr->ChipType == SIS_740) {
8439 SiS_LongDelay(SiS_Pr, 1);
8440 SiS_GenericDelay(SiS_Pr, 5887);
8441 SiS_SetCH701x(SiS_Pr,0x76,0xac);
8442 SiS_SetCH701x(SiS_Pr,0x66,0x00);
8444 SiS_LongDelay(SiS_Pr, 2);
8445 temp = SiS_GetCH701x(SiS_Pr,0x76);
8447 SiS_SetCH701x(SiS_Pr,0x76,temp);
8448 SiS_SetCH701x(SiS_Pr,0x66,0x00);
8454 SiS_ChrontelResetDB(struct SiS_Private *SiS_Pr)
8458 if(SiS_Pr->ChipType == SIS_740) {
8460 temp = SiS_GetCH701x(SiS_Pr,0x4a); /* Version ID */
8464 if(SiS_WeHaveBacklightCtrl(SiS_Pr)) {
8465 temp = SiS_GetCH701x(SiS_Pr,0x49);
8466 SiS_SetCH701x(SiS_Pr,0x49,0x3e);
8470 SiS_SetCH701x(SiS_Pr,0x48,0x10);
8471 SiS_LongDelay(SiS_Pr, 1);
8472 SiS_SetCH701x(SiS_Pr,0x48,0x18);
8474 if(SiS_WeHaveBacklightCtrl(SiS_Pr)) {
8475 SiS_ChrontelResetVSync(SiS_Pr);
8476 SiS_SetCH701x(SiS_Pr,0x49,temp);
8482 temp = SiS_GetCH701x(SiS_Pr,0x5c);
8484 SiS_SetCH701x(SiS_Pr,0x5c,temp);
8485 temp = SiS_GetCH701x(SiS_Pr,0x5c);
8487 SiS_SetCH701x(SiS_Pr,0x5c,temp);
8488 temp = SiS_GetCH701x(SiS_Pr,0x5c);
8490 SiS_SetCH701x(SiS_Pr,0x5c,temp);
8491 temp = SiS_GetCH701x(SiS_Pr,0x61);
8493 SiS_SetCH701xForLCD(SiS_Pr);
8499 SiS_SetCH701x(SiS_Pr,0x48,0x10);
8500 SiS_LongDelay(SiS_Pr, 1);
8501 SiS_SetCH701x(SiS_Pr,0x48,0x18);
8506 SiS_ChrontelInitTVVSync(struct SiS_Private *SiS_Pr)
8510 if(SiS_Pr->ChipType == SIS_740) {
8512 if(SiS_WeHaveBacklightCtrl(SiS_Pr)) {
8513 SiS_ChrontelResetVSync(SiS_Pr);
8518 SiS_SetCH701x(SiS_Pr,0x76,0xaf); /* Power up LVDS block */
8519 temp = SiS_GetCH701x(SiS_Pr,0x49);
8522 temp = SiS_GetCH701x(SiS_Pr,0x47);
8524 SiS_SetCH701x(SiS_Pr,0x47,temp); /* enable VSYNC */
8525 SiS_LongDelay(SiS_Pr, 3);
8526 temp = SiS_GetCH701x(SiS_Pr,0x47);
8528 SiS_SetCH701x(SiS_Pr,0x47,temp); /* disable VSYNC */
8535 SiS_ChrontelDoSomething3(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
8539 if(SiS_Pr->ChipType == SIS_740) {
8541 temp = SiS_GetCH701x(SiS_Pr,0x61);
8544 SiS_SetCH701x(SiS_Pr,0x61,temp);
8546 SiS_SetCH701x(SiS_Pr,0x66,0x45); /* Panel power on */
8547 SiS_SetCH701x(SiS_Pr,0x76,0xaf); /* All power on */
8548 SiS_LongDelay(SiS_Pr, 1);
8549 SiS_GenericDelay(SiS_Pr, 5887);
8554 temp = SiS_GetCH701x(SiS_Pr,0x61);
8557 SiS_SetCH701x(SiS_Pr,0x61,temp);
8560 SiS_SetCH701x(SiS_Pr,0x76,0xac);
8561 temp = SiS_GetCH701x(SiS_Pr,0x66);
8563 SiS_SetCH701x(SiS_Pr,0x66,temp);
8565 if(SiS_WeHaveBacklightCtrl(SiS_Pr)) {
8566 SiS_GenericDelay(SiS_Pr, 1023);
8568 SiS_GenericDelay(SiS_Pr, 767);
8572 SiS_GenericDelay(SiS_Pr, 767);
8574 temp = SiS_GetCH701x(SiS_Pr,0x76);
8576 SiS_SetCH701x(SiS_Pr,0x76,temp);
8577 temp = SiS_GetCH701x(SiS_Pr,0x66);
8579 SiS_SetCH701x(SiS_Pr,0x66,temp);
8580 SiS_LongDelay(SiS_Pr, 1);
8586 SiS_ChrontelDoSomething2(struct SiS_Private *SiS_Pr)
8590 SiS_LongDelay(SiS_Pr, 1);
8595 temp = SiS_GetCH701x(SiS_Pr,0x66);
8599 if(SiS_Pr->ChipType == SIS_740) {
8601 SiS_SetCH701x(SiS_Pr,0x76,0xac);
8604 SiS_SetCH701xForLCD(SiS_Pr);
8608 SiS_ChrontelResetDB(SiS_Pr);
8613 temp = SiS_GetCH701x(SiS_Pr,0x76);
8615 SiS_SetCH701x(SiS_Pr,0x76,temp);
8616 SiS_LongDelay(SiS_Pr, 2);
8617 temp = SiS_GetCH701x(SiS_Pr,0x76);
8619 SiS_SetCH701x(SiS_Pr,0x76,temp);
8620 if(SiS_Pr->ChipType == SIS_740) {
8621 SiS_SetCH701x(SiS_Pr,0x78,0xe0); /* PLL loop filter */
8623 SiS_SetCH701x(SiS_Pr,0x78,0x60);
8625 SiS_LongDelay(SiS_Pr, 2);
8628 SiS_SetCH701x(SiS_Pr,0x77,0x00); /* MV? */
8632 SiS_ChrontelDoSomething1(struct SiS_Private *SiS_Pr)
8636 temp = SiS_GetCH701x(SiS_Pr,0x03);
8639 SiS_SetCH701x(SiS_Pr,0x03,temp);
8641 if(SiS_Pr->ChipType == SIS_740) {
8643 temp = SiS_GetCH701x(SiS_Pr,0x1c);
8645 SiS_SetCH701x(SiS_Pr,0x1c,temp);
8647 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x03);
8649 temp = SiS_GetCH701x(SiS_Pr,0x64);
8651 SiS_SetCH701x(SiS_Pr,0x64,temp);
8653 temp = SiS_GetCH701x(SiS_Pr,0x03);
8655 SiS_SetCH701x(SiS_Pr,0x03,temp);
8657 if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) {
8658 SiS_SetCH701x(SiS_Pr,0x63,0x40); /* LVDS off */
8659 SiS_LongDelay(SiS_Pr, 1);
8660 SiS_SetCH701x(SiS_Pr,0x63,0x00); /* LVDS on */
8661 SiS_ChrontelResetDB(SiS_Pr);
8662 SiS_ChrontelDoSomething2(SiS_Pr);
8663 SiS_ChrontelDoSomething3(SiS_Pr, 0);
8665 temp = SiS_GetCH701x(SiS_Pr,0x66);
8667 SiS_ChrontelResetDB(SiS_Pr);
8668 SiS_ChrontelDoSomething2(SiS_Pr);
8669 SiS_ChrontelDoSomething3(SiS_Pr, 0);
8675 SiS_ChrontelResetDB(SiS_Pr);
8676 SiS_ChrontelDoSomething2(SiS_Pr);
8677 temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x34);
8678 SiS_ChrontelDoSomething3(SiS_Pr,temp);
8679 SiS_SetCH701x(SiS_Pr,0x76,0xaf); /* All power on, LVDS normal operation */
8691 SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
8694 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
8698 SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
8700 if(!SiS_Pr->UseCustomMode) {
8701 SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex);
8707 SiS_Pr->SiS_SelectCRT2Rate = 4;
8709 SiS_UnLockCRT2(SiS_Pr);
8711 RefreshRateTableIndex = SiS_GetRatePtr(SiS_Pr, ModeNo, ModeIdIndex);
8713 SiS_SaveCRT2Info(SiS_Pr,ModeNo);
8715 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8716 SiS_DisableBridge(SiS_Pr);
8717 if((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->ChipType == SIS_730)) {
8718 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,0x80);
8720 SiS_SetCRT2ModeRegs(SiS_Pr, ModeNo, ModeIdIndex);
8723 if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
8724 SiS_LockCRT2(SiS_Pr);
8725 SiS_DisplayOn(SiS_Pr);
8729 SiS_GetCRT2Data(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8732 SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0;
8733 if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
8734 ((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ||
8735 ((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS30xBLV)) ) {
8736 SiS_GetLVDSDesData(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8741 xf86DrvMsg(0, X_INFO, "(init301: LCDHDES 0x%03x LCDVDES 0x%03x)\n", SiS_Pr->SiS_LCDHDES, SiS_Pr->SiS_LCDVDES);
8742 xf86DrvMsg(0, X_INFO, "(init301: HDE 0x%03x VDE 0x%03x)\n", SiS_Pr->SiS_HDE, SiS_Pr->SiS_VDE);
8743 xf86DrvMsg(0, X_INFO, "(init301: VGAHDE 0x%03x VGAVDE 0x%03x)\n", SiS_Pr->SiS_VGAHDE, SiS_Pr->SiS_VGAVDE);
8744 xf86DrvMsg(0, X_INFO, "(init301: HT 0x%03x VT 0x%03x)\n", SiS_Pr->SiS_HT, SiS_Pr->SiS_VT);
8745 xf86DrvMsg(0, X_INFO, "(init301: VGAHT 0x%03x VGAVT 0x%03x)\n", SiS_Pr->SiS_VGAHT, SiS_Pr->SiS_VGAVT);
8749 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8750 SiS_SetGroup1(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8753 if(SiS_Pr->SiS_VBType & VB_SISVB) {
8755 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8757 SiS_SetGroup2(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8759 SiS_SetGroup2_C_ELV(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8761 SiS_SetGroup3(SiS_Pr, ModeNo, ModeIdIndex);
8762 SiS_SetGroup4(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8764 SiS_SetGroup4_C_ELV(SiS_Pr, ModeNo, ModeIdIndex);
8766 SiS_SetGroup5(SiS_Pr, ModeNo, ModeIdIndex);
8768 SiS_SetCRT2Sync(SiS_Pr, ModeNo, RefreshRateTableIndex);
8771 if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
8773 if(!((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10)))) {
8774 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
8775 SiS_ModCRT1CRTC(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8778 SiS_SetCRT2ECLK(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8784 SiS_SetCRT2Sync(SiS_Pr, ModeNo, RefreshRateTableIndex);
8786 SiS_ModCRT1CRTC(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
8788 SiS_SetCRT2ECLK(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
8790 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8791 if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
8792 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
8793 if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
8795 SiS_SetCH701xForLCD(SiS_Pr);
8799 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
8800 SiS_SetCHTVReg(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
8808 if(SiS_Pr->ChipType < SIS_315H) {
8809 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8810 if(SiS_Pr->SiS_UseOEM) {
8811 if((SiS_Pr->SiS_UseROM) && (SiS_Pr->SiS_UseOEM == -1)) {
8813 SiS_OEM300Setting(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8816 SiS_OEM300Setting(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8819 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
8820 if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
8821 (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
8822 SetOEMLCDData2(SiS_Pr, ModeNo, ModeIdIndex,RefreshRateTableIndex);
8824 SiS_DisplayOn(SiS_Pr);
8831 if(SiS_Pr->ChipType >= SIS_315H) {
8832 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8833 if(SiS_Pr->ChipType < SIS_661) {
8834 SiS_FinalizeLCD(SiS_Pr, ModeNo, ModeIdIndex);
8835 SiS_OEM310Setting(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8837 SiS_OEM661Setting(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
8839 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x40);
8844 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8845 SiS_EnableBridge(SiS_Pr);
8848 SiS_DisplayOn(SiS_Pr);
8850 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
8851 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
8853 SiS_SetRegSR11ANDOR(SiS_Pr,0xFF,0x0C);
8856 SiS_SetCH70xxANDOR(SiS_Pr,0x0e,0x01,0xf8);
8860 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
8861 SiS_LockCRT2(SiS_Pr);
8873 SiS_SiS30xBLOn(struct SiS_Private *SiS_Pr)
8876 SiS_DDC2Delay(SiS_Pr,0xff00);
8877 if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
8878 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
8879 SiS_WaitVBRetrace(SiS_Pr);
8881 if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x01)) {
8882 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
8887 SiS_SiS30xBLOff(struct SiS_Private *SiS_Pr)
8890 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
8891 SiS_DDC2Delay(SiS_Pr,0xff00);
8899 SiS_SetupDDCN(struct SiS_Private *SiS_Pr)
8901 SiS_Pr->SiS_DDC_NData = ~SiS_Pr->SiS_DDC_Data;
8902 SiS_Pr->SiS_DDC_NClk = ~SiS_Pr->SiS_DDC_Clk;
8903 if((SiS_Pr->SiS_DDC_Index == 0x11) && (SiS_Pr->SiS_SensibleSR11)) {
8904 SiS_Pr->SiS_DDC_NData &= 0x0f;
8905 SiS_Pr->SiS_DDC_NClk &= 0x0f;
8911 SiS_SetTrumpBlockLoop(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
8922 SiS_SetStop(SiS_Pr);
8923 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT * 2);
8925 if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
8926 tempah = SiS_Pr->SiS_DDC_DeviceAddr;
8927 temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
8930 temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write register number */
8934 temp = SiS_WriteDDC2Data(SiS_Pr,tempah);/* Write DAB (S0=0=write) */
8938 if(SiS_SetStop(SiS_Pr)) continue;
8945 SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
8947 SiS_Pr->SiS_DDC_DeviceAddr = 0xF0; /* DAB (Device Address Byte) */
8948 SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
8949 SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
8950 SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
8951 SiS_SetupDDCN(SiS_Pr);
8953 SiS_SetSwitchDDC2(SiS_Pr);
8956 dataptr = SiS_SetTrumpBlockLoop(SiS_Pr, dataptr);
8976 SiS_SetChReg(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val, unsigned short myor)
8982 SiS_SetStop(SiS_Pr);
8983 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT * 4);
8985 if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
8986 temp = SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_DeviceAddr); /* Write DAB (S0=0=write) */
8988 temp = SiS_WriteDDC2Data(SiS_Pr, (reg | myor)); /* Write RAB (700x: set bit 7, see datasheet) */
8990 temp = SiS_WriteDDC2Data(SiS_Pr, val); /* Write data */
8992 if(SiS_SetStop(SiS_Pr)) continue; /* Set stop condition */
8993 SiS_Pr->SiS_ChrontelInit = 1;
9001 SiS_SetCH700x(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val)
9003 SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
9005 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
9007 if(!(SiS_Pr->SiS_ChrontelInit)) {
9008 SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
9009 SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
9010 SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
9011 SiS_SetupDDCN(SiS_Pr);
9014 if( (!(SiS_SetChReg(SiS_Pr, reg, val, 0x80))) &&
9015 (!(SiS_Pr->SiS_ChrontelInit)) ) {
9016 SiS_Pr->SiS_DDC_Index = 0x0a;
9017 SiS_Pr->SiS_DDC_Data = 0x80;
9018 SiS_Pr->SiS_DDC_Clk = 0x40;
9019 SiS_SetupDDCN(SiS_Pr);
9021 SiS_SetChReg(SiS_Pr, reg, val, 0x80);
9028 SiS_SetCH701x(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val)
9030 SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
9031 SiS_Pr->SiS_DDC_Data = 0x08; /* Bitmask in IndexReg for Data */
9032 SiS_Pr->SiS_DDC_Clk = 0x04; /* Bitmask in IndexReg for Clk */
9033 SiS_SetupDDCN(SiS_Pr);
9034 SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
9035 SiS_SetChReg(SiS_Pr, reg, val, 0);
9042 SiS_SetCH70xx(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val)
9044 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
9045 SiS_SetCH700x(SiS_Pr, reg, val);
9047 SiS_SetCH701x(SiS_Pr, reg, val);
9051 SiS_GetChReg(struct SiS_Private *SiS_Pr, unsigned short myor)
9057 SiS_SetStop(SiS_Pr);
9058 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT * 4);
9060 if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
9061 temp = SiS_WriteDDC2Data(SiS_Pr,SiS_Pr->SiS_DDC_DeviceAddr); /* Write DAB (S0=0=write) */
9063 temp = SiS_WriteDDC2Data(SiS_Pr,SiS_Pr->SiS_DDC_ReadAddr | myor); /* Write RAB (700x: | 0x80) */
9065 if (SiS_SetStart(SiS_Pr)) continue; /* Re-start */
9066 temp = SiS_WriteDDC2Data(SiS_Pr,SiS_Pr->SiS_DDC_DeviceAddr | 0x01);/* DAB (S0=1=read) */
9068 tempah = SiS_ReadDDC2Data(SiS_Pr); /* Read byte */
9069 if(SiS_SetStop(SiS_Pr)) continue; /* Stop condition */
9070 SiS_Pr->SiS_ChrontelInit = 1;
9079 SiS_GetCH700x(struct SiS_Private *SiS_Pr, unsigned short tempbx)
9083 SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB */
9085 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
9087 if(!(SiS_Pr->SiS_ChrontelInit)) {
9088 SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
9089 SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
9090 SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
9091 SiS_SetupDDCN(SiS_Pr);
9094 SiS_Pr->SiS_DDC_ReadAddr = tempbx;
9096 if( ((result = SiS_GetChReg(SiS_Pr,0x80)) == 0xFFFF) &&
9097 (!SiS_Pr->SiS_ChrontelInit) ) {
9099 SiS_Pr->SiS_DDC_Index = 0x0a;
9100 SiS_Pr->SiS_DDC_Data = 0x80;
9101 SiS_Pr->SiS_DDC_Clk = 0x40;
9102 SiS_SetupDDCN(SiS_Pr);
9104 result = SiS_GetChReg(SiS_Pr,0x80);
9112 SiS_GetCH701x(struct SiS_Private *SiS_Pr, unsigned short tempbx)
9114 SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
9115 SiS_Pr->SiS_DDC_Data = 0x08; /* Bitmask in IndexReg for Data */
9116 SiS_Pr->SiS_DDC_Clk = 0x04; /* Bitmask in IndexReg for Clk */
9117 SiS_SetupDDCN(SiS_Pr);
9118 SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB */
9120 SiS_Pr->SiS_DDC_ReadAddr = tempbx;
9122 return SiS_GetChReg(SiS_Pr,0);
9131 SiS_GetCH70xx(struct SiS_Private *SiS_Pr, unsigned short tempbx)
9133 if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
9134 return SiS_GetCH700x(SiS_Pr, tempbx);
9136 return SiS_GetCH701x(SiS_Pr, tempbx);
9140 SiS_SetCH70xxANDOR(struct SiS_Private *SiS_Pr, unsigned short reg,
9145 tempbl = (SiS_GetCH70xx(SiS_Pr, (reg & 0xFF)) & myand) | myor;
9146 SiS_SetCH70xx(SiS_Pr, reg, tempbl);
9154 SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
9169 SiS_Pr->SiS_ChrontelInit = 0; /* force re-detection! */
9171 SiS_Pr->SiS_DDC_SecAddr = 0;
9172 SiS_Pr->SiS_DDC_DeviceAddr = ddcdtype[DDCdatatype];
9173 SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_P3c4;
9174 SiS_Pr->SiS_DDC_Index = 0x11;
9177 cr32 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x32);
9200 SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
9201 SiS_Pr->SiS_DDC_Index = 0x0f;
9232 SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
9233 SiS_Pr->SiS_DDC_Index = 0x0f;
9255 SiS_Pr->SiS_DDC_Data = 0x02 << temp;
9256 SiS_Pr->SiS_DDC_Clk = 0x01 << temp;
9258 SiS_SetupDDCN(SiS_Pr);
9263 SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index, temp);
9270 SiS_WriteDABDDC(struct SiS_Private *SiS_Pr)
9272 if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
9273 if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_DeviceAddr)) {
9276 if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_SecAddr)) {
9283 SiS_PrepareReadDDC(struct SiS_Private *SiS_Pr)
9285 if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
9286 if(SiS_WriteDDC2Data(SiS_Pr, (SiS_Pr->SiS_DDC_DeviceAddr | 0x01))) {
9293 SiS_PrepareDDC(struct SiS_Private *SiS_Pr)
9295 if(SiS_WriteDABDDC(SiS_Pr)) SiS_WriteDABDDC(SiS_Pr);
9296 if(SiS_PrepareReadDDC(SiS_Pr)) return (SiS_PrepareReadDDC(SiS_Pr));
9301 SiS_SendACK(struct SiS_Private *SiS_Pr, unsigned short yesno)
9303 SiS_SetSCLKLow(SiS_Pr);
9305 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9306 SiS_Pr->SiS_DDC_Index,
9307 SiS_Pr->SiS_DDC_NData,
9308 SiS_Pr->SiS_DDC_Data);
9310 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9311 SiS_Pr->SiS_DDC_Index,
9312 SiS_Pr->SiS_DDC_NData,
9315 SiS_SetSCLKHigh(SiS_Pr);
9319 SiS_DoProbeDDC(struct SiS_Private *SiS_Pr)
9325 SiS_SetSwitchDDC2(SiS_Pr);
9326 if(SiS_PrepareDDC(SiS_Pr)) {
9327 SiS_SetStop(SiS_Pr);
9337 if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
9338 temp = (unsigned char)SiS_ReadDDC2Data(SiS_Pr);
9339 SiS_SendACK(SiS_Pr, 0);
9354 temp = (unsigned char)SiS_ReadDDC2Data(SiS_Pr);
9355 SiS_SendACK(SiS_Pr, 1);
9365 if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
9370 SiS_SetStop(SiS_Pr);
9378 SiS_ProbeDDC(struct SiS_Private *SiS_Pr)
9383 SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
9384 if(!(SiS_DoProbeDDC(SiS_Pr))) flag |= 0x02;
9385 SiS_Pr->SiS_DDC_DeviceAddr = 0xa2;
9386 if(!(SiS_DoProbeDDC(SiS_Pr))) flag |= 0x08;
9387 SiS_Pr->SiS_DDC_DeviceAddr = 0xa6;
9388 if(!(SiS_DoProbeDDC(SiS_Pr))) flag |= 0x10;
9397 SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype, unsigned char *buffer)
9405 SiS_SetSwitchDDC2(SiS_Pr);
9406 if(!(SiS_PrepareDDC(SiS_Pr))) {
9412 buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr);
9415 SiS_SendACK(SiS_Pr, 0);
9417 buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr);
9419 SiS_SendACK(SiS_Pr, 1);
9425 SiS_SetStop(SiS_Pr);
9435 we use our pre-detected pSiS-values instead of SiS_Pr as
9451 SiS_HandleDDC(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
9467 if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, FALSE, VBFlags2) == 0xFFFF)
9470 sr1f = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1f);
9471 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1f,0x3f,0x04);
9473 cr17 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x17) & 0x80;
9475 SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x17,0x80);
9476 SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x01);
9477 SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x03);
9481 SiS_WaitRetrace1(SiS_Pr);
9482 SiS_WaitRetrace1(SiS_Pr);
9483 SiS_WaitRetrace1(SiS_Pr);
9484 SiS_WaitRetrace1(SiS_Pr);
9488 result = SiS_ProbeDDC(SiS_Pr);
9490 result = SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer);
9497 if(!SiS_Pr->DDCPortMixup) {
9507 SiS_SetReg(SiS_Pr->SiS_P3c4,0x1f,sr1f);
9509 SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x17,0x7f,cr17);
9517 SiS_SetSwitchDDC2(struct SiS_Private *SiS_Pr)
9519 SiS_SetSCLKHigh(SiS_Pr);
9520 SiS_WaitRetrace1(SiS_Pr);
9522 SiS_SetSCLKLow(SiS_Pr);
9523 SiS_WaitRetrace1(SiS_Pr);
9527 SiS_ReadDDC1Bit(struct SiS_Private *SiS_Pr)
9529 SiS_WaitRetrace1(SiS_Pr);
9530 return ((SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x02) >> 1);
9536 SiS_SetStart(struct SiS_Private *SiS_Pr)
9538 if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF; /* (SC->low) */
9539 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9540 SiS_Pr->SiS_DDC_Index,
9541 SiS_Pr->SiS_DDC_NData,
9542 SiS_Pr->SiS_DDC_Data); /* SD->high */
9543 if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* SC->high */
9544 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9545 SiS_Pr->SiS_DDC_Index,
9546 SiS_Pr->SiS_DDC_NData,
9548 if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* (SC->low) */
9555 SiS_SetStop(struct SiS_Private *SiS_Pr)
9557 if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF; /* (SC->low) */
9558 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9559 SiS_Pr->SiS_DDC_Index,
9560 SiS_Pr->SiS_DDC_NData,
9562 if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* SC->high */
9563 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9564 SiS_Pr->SiS_DDC_Index,
9565 SiS_Pr->SiS_DDC_NData,
9566 SiS_Pr->SiS_DDC_Data); /* SD->high = stop condition */
9567 if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* (SC->high) */
9573 SiS_WriteDDC2Data(struct SiS_Private *SiS_Pr, unsigned short tempax)
9579 SiS_SetSCLKLow(SiS_Pr); /* SC->low */
9581 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9582 SiS_Pr->SiS_DDC_Index,
9583 SiS_Pr->SiS_DDC_NData,
9584 SiS_Pr->SiS_DDC_Data); /* Write bit (1) to SD */
9586 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9587 SiS_Pr->SiS_DDC_Index,
9588 SiS_Pr->SiS_DDC_NData,
9591 SiS_SetSCLKHigh(SiS_Pr); /* SC->high */
9594 temp = SiS_CheckACK(SiS_Pr); /* Check acknowledge */
9599 SiS_ReadDDC2Data(struct SiS_Private *SiS_Pr)
9606 SiS_SetSCLKLow(SiS_Pr);
9607 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9608 SiS_Pr->SiS_DDC_Index,
9609 SiS_Pr->SiS_DDC_NData,
9610 SiS_Pr->SiS_DDC_Data);
9611 SiS_SetSCLKHigh(SiS_Pr);
9612 temp = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
9613 if(temp & SiS_Pr->SiS_DDC_Data) getdata |= 0x01;
9619 SiS_SetSCLKLow(struct SiS_Private *SiS_Pr)
9621 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9622 SiS_Pr->SiS_DDC_Index,
9623 SiS_Pr->SiS_DDC_NClk,
9625 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
9630 SiS_SetSCLKHigh(struct SiS_Private *SiS_Pr)
9634 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9635 SiS_Pr->SiS_DDC_Index,
9636 SiS_Pr->SiS_DDC_NClk,
9637 SiS_Pr->SiS_DDC_Clk); /* SetSCLKHigh() */
9639 temp = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
9640 } while((!(temp & SiS_Pr->SiS_DDC_Clk)) && --watchdog);
9649 SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
9656 SiS_CheckACK(struct SiS_Private *SiS_Pr)
9660 SiS_SetSCLKLow(SiS_Pr); /* (SC->low) */
9661 SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
9662 SiS_Pr->SiS_DDC_Index,
9663 SiS_Pr->SiS_DDC_NData,
9664 SiS_Pr->SiS_DDC_Data); /* (SD->high) */
9665 SiS_SetSCLKHigh(SiS_Pr); /* SC->high = clock impulse for ack */
9666 tempah = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index); /* Read SD */
9667 SiS_SetSCLKLow(SiS_Pr); /* SC->low = end of clock impulse */
9668 if(tempah & SiS_Pr->SiS_DDC_Data) return 1; /* Ack OK if bit = 0 */
9680 GetRAMDACromptr(struct SiS_Private *SiS_Pr)
9682 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
9685 if(SiS_Pr->ChipType < SIS_330) {
9687 if(SiS_Pr->SiS_VBType & VB_SIS30xB)
9691 if(SiS_Pr->SiS_VBType & VB_SIS30xB)
9698 GetLCDromptr(struct SiS_Private *SiS_Pr)
9700 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
9703 if(SiS_Pr->ChipType < SIS_330) {
9705 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV)
9709 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV)
9716 GetTVromptr(struct SiS_Private *SiS_Pr)
9718 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
9721 if(SiS_Pr->ChipType < SIS_330) {
9723 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV)
9727 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV)
9734 GetLCDPtrIndexBIOS(struct SiS_Private *SiS_Pr)
9738 if((IS_SIS650) && (SiS_Pr->SiS_VBType & VB_SISLVDS)) {
9739 if(!(SiS_IsNotM650orLater(SiS_Pr))) {
9740 if((index = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xf0)) {
9743 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
9744 else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
9750 index = SiS_GetBIOSLCDResInfo(SiS_Pr) & 0x0F;
9751 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) index -= 5;
9752 if(SiS_Pr->SiS_VBType & VB_SIS301C) { /* 1.15.20 and later (not VB specific) */
9753 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) index -= 5;
9754 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768) index -= 5;
9756 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) index -= 6;
9760 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
9761 else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
9766 GetLCDPtrIndex(struct SiS_Private *SiS_Pr)
9770 index = ((SiS_GetBIOSLCDResInfo(SiS_Pr) & 0x0F) - 1) * 3;
9771 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
9772 else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
9777 GetTVPtrIndex(struct SiS_Private *SiS_Pr)
9782 if(SiS_Pr->SiS_TVMode & TVSetPALTiming) index = 1;
9783 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) index = 2;
9787 if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) &&
9788 (SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
9796 GetOEMTVPtr661_2_GEN(struct SiS_Private *SiS_Pr, int addme)
9800 if(SiS_Pr->SiS_TVMode & TVSetPAL) index = 1;
9801 if(SiS_Pr->SiS_TVMode & TVSetPALM) index = 2;
9802 if(SiS_Pr->SiS_TVMode & TVSetPALN) index = 3;
9803 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) index = 6;
9804 if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
9806 if(SiS_Pr->SiS_TVMode & TVSetPALM) index++;
9807 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) index = 7;
9810 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
9811 if((!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
9812 (SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
9822 GetOEMTVPtr661_2_OLD(struct SiS_Private *SiS_Pr)
9824 return (GetOEMTVPtr661_2_GEN(SiS_Pr, 8));
9829 GetOEMTVPtr661_2_NEW(struct SiS_Private *SiS_Pr)
9831 return (GetOEMTVPtr661_2_GEN(SiS_Pr, 6));
9836 GetOEMTVPtr661(struct SiS_Private *SiS_Pr)
9840 if(SiS_Pr->SiS_TVMode & (TVSetYPbPr625i | TVSetYPbPr625p))
9843 if(SiS_Pr->SiS_TVMode & TVSetPAL) index = 2;
9844 if(SiS_Pr->SiS_ROMNew) {
9845 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) index = 4;
9846 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) index = 6;
9847 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) index = 8;
9848 if(SiS_Pr->SiS_TVMode & TVSetHiVision) index = 10;
9850 if(SiS_Pr->SiS_TVMode & TVSetHiVision) index = 4;
9851 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) index = 6;
9852 if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) index = 8;
9853 if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) index = 10;
9856 if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) index++;
9862 SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
9864 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
9868 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
9869 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x20,0xbf);
9871 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x35,0x7f);
9876 if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) { /* ------------ VGA */
9878 if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
9879 romptr = GetRAMDACromptr(SiS_Pr);
9884 if(SiS_Pr->SiS_VBType & VB_SIS30xB) {
9889 } else if(SiS_Pr->ChipType < SIS_330) {
9894 } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
9899 } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD|SetCRT2ToLCDA)) { /* ---------- LCD/LCDA */
9905 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
9906 if(SiS_Pr->PDC != -1) {
9907 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((SiS_Pr->PDC >> 1) & 0x0f));
9908 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((SiS_Pr->PDC & 0x01) << 7));
9912 if(SiS_Pr->PDCA != -1) {
9913 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((SiS_Pr->PDCA << 3) & 0xf0));
9914 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((SiS_Pr->PDCA & 0x01) << 6));
9921 if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) {
9922 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
9924 if((SiS_Pr->PanelXRes <= 1280) && (SiS_Pr->PanelYRes <= 1024)) {
9927 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,delay);
9930 if(SiS_Pr->SiS_VBType & VB_SIS301C) {
9932 if((SiS_Pr->PanelXRes > 1280) && (SiS_Pr->PanelYRes > 1024)) {
9935 } else if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
9939 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,delay);
9949 switch(SiS_Pr->SiS_CustomT) {
9952 if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
9966 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
9970 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2D,delay);
9980 index = GetLCDPtrIndexBIOS(SiS_Pr);
9981 myindex = GetLCDPtrIndex(SiS_Pr);
9983 if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SISLVDS)) {
9985 if(SiS_IsNotM650orLater(SiS_Pr)) {
9987 if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
9991 /* if(SiS_Pr->SiS_VBType & VB_SIS302LV) */
10002 if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV))
10007 } else if(SiS_Pr->SiS_UseROM &&
10008 (!(SiS_Pr->SiS_ROMNew)) &&
10009 (SiS_Pr->SiS_LCDResInfo != Panel_1280x1024) &&
10010 (SiS_Pr->SiS_LCDResInfo != Panel_1280x768) &&
10011 (SiS_Pr->SiS_LCDResInfo != Panel_1280x960) &&
10012 (SiS_Pr->SiS_LCDResInfo != Panel_1600x1200) &&
10013 ((romptr = GetLCDromptr(SiS_Pr)))) {
10019 } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
10027 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
10029 else if(SiS_Pr->ChipType <= SIS_315PRO) delay = SiS310_LCDDelayCompensation_3xx301LV[myindex];
10031 } else if(SiS_Pr->SiS_VBType & VB_SIS301C) {
10034 if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) delay = 0x00; /* experience */
10035 } else if(SiS_Pr->SiS_VBType & VB_SIS30xB) {
10044 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
10045 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,((delay << 4) & 0xf0));
10049 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* ------------ TV */
10051 index = GetTVPtrIndex(SiS_Pr);
10053 if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SISLVDS)) {
10055 if(SiS_IsNotM650orLater(SiS_Pr)) {
10057 if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
10061 /* if(SiS_Pr->SiS_VBType & VB_SIS302LV) */
10074 switch(SiS_Pr->SiS_CustomT) {
10089 if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
10095 } else if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
10097 romptr = GetTVromptr(SiS_Pr);
10101 } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
10108 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
10114 if(SiS_Pr->SiS_VBType & VB_SIS301C) delay = 0x02;
10120 if(SiS_LCDAEnabled(SiS_Pr)) {
10129 if(SiS_Pr->SiS_VBType & VB_SISVB) {
10131 if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SISLVDS) && dochiptest) {
10133 temp = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4;
10143 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2D,delay);
10147 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
10153 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
10154 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
10156 if(IS_SIS650 && (SiS_Pr->SiS_IF_DEF_CH70xx != 0)) {
10158 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,delay);
10160 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
10169 SetAntiFlicker(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
10171 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10174 if(SiS_Pr->SiS_TVMode & TVSetYPbPrProg) return;
10177 index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
10179 index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
10181 temp = GetTVPtrIndex(SiS_Pr);
10185 if(SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
10186 if(SiS_Pr->ChipType >= SIS_661) {
10187 temp1 = GetOEMTVPtr661(SiS_Pr);
10191 if(SiS_Pr->ChipType >= SIS_760) {
10195 } else if(SiS_Pr->ChipType >= SIS_330) {
10210 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0A,0x8f,temp); /* index 0A D[6:4] */
10214 SetEdgeEnhance(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex)
10216 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10219 temp = temp1 = GetTVPtrIndex(SiS_Pr) >> 1; /* 0: NTSC/YPbPr525, 1: PAL/YPbPr625, 2: HiTV */
10222 index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
10224 index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
10226 if(SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
10227 if(SiS_Pr->ChipType >= SIS_661) {
10228 temp1 = GetOEMTVPtr661(SiS_Pr);
10232 if(SiS_Pr->ChipType >= SIS_760) {
10236 } else if(SiS_Pr->ChipType >= SIS_330) {
10250 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x3A,0x1F,temp); /* index 0A D[7:5] */
10254 SetYFilter(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex)
10259 index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
10261 index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
10264 temp = GetTVPtrIndex(SiS_Pr) >> 1; /* 0: NTSC/YPbPr, 1: PAL, 2: HiTV */
10266 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) temp = 1; /* NTSC-J uses PAL */
10267 else if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 3; /* PAL-M */
10268 else if(SiS_Pr->SiS_TVMode & TVSetPALN) temp = 4; /* PAL-N */
10269 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) temp = 1; /* HiVision uses PAL */
10271 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
10273 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
10276 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
10280 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter1[temp][index][j]);
10286 SetPhaseIncr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
10288 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10292 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;
10295 if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) return;
10297 if((SiS_Pr->ChipType >= SIS_661) || SiS_Pr->SiS_ROMNew) {
10298 lindex = GetOEMTVPtr661_2_OLD(SiS_Pr) & 0xffff;
10301 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS_TVPhase[lindex + j]);
10307 if(SiS_Pr->SiS_TVMode & (TVSetPALM | TVSetPALN)) return;
10310 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
10312 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
10315 temp = GetTVPtrIndex(SiS_Pr);
10319 if(SiS_Pr->SiS_UseROM) {
10321 if(SiS_Pr->ChipType >= SIS_330) {
10324 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
10326 if(SiS_Pr->ChipType >= SIS_330) {
10329 if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode))) {
10331 if(SiS_Pr->ChipType >= SIS_330) {
10340 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
10346 if(!(SiS_Pr->SiS_VBType & VB_SIS30xBLV))
10347 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
10348 else if((!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_TVMode & TVSetTVSimuMode))
10349 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr2[temp][index][j]);
10351 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
10355 if((SiS_Pr->SiS_VBType & VB_SIS30xBLV) && (!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision))) {
10356 if((!(SiS_Pr->SiS_TVMode & (TVSetPAL | TVSetYPbPrProg))) && (ModeNo > 0x13)) {
10359 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x31,0x21);
10360 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x32,0xf0);
10361 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x33,0xf5);
10362 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x34,0x7f);
10364 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x31,0x1e);
10365 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x32,0x8b);
10366 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x33,0xfb);
10367 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x34,0x7b);
10374 SetDelayComp661(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
10378 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10380 if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToRAMDAC)))
10386 if(SiS_Pr->SiS_ROMNew) {
10387 if((SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) ||
10388 ((SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
10389 (SiS_Pr->SiS_LCDInfo & LCDPass11))) {
10391 if(SiS_Pr->UseCustomMode) {
10392 index = SiS_Pr->CSRClock;
10394 index = SiS_GetVCLK2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RTI);
10395 index = SiS_Pr->SiS_VCLKData[index].CLOCK;
10399 if((ROMAddr[0x5b] & 0x80) || (SiS_Pr->SiS_VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD))) {
10404 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD)) {
10405 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((delay >> 1) & 0x0f));
10406 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((delay & 0x01) << 7));
10408 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((delay << 3) & 0xf0));
10409 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((delay & 0x01) << 6));
10417 if(SiS_Pr->UseCustomMode) delay = 0x04;
10419 else delay = (SiS_Pr->SiS_RefIndex[RTI].Ext_PDC >> 4);
10422 if(SiS_Pr->ChipType >= XGI_20) {
10426 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
10428 if(SiS_Pr->SiS_XGIROM) {
10429 index = GetTVPtrIndex(SiS_Pr);
10436 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
10437 if(SiS_Pr->ChipType == XGI_40 && SiS_Pr->ChipRevision == 0x02) {
10443 } else if(SiS_Pr->ChipType >= SIS_340) {
10446 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
10451 } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
10455 index = GetOEMTVPtr661(SiS_Pr);
10456 if((SiS_Pr->SiS_ROMNew) && (index != 0xffff)) {
10458 if(SiS_Pr->SiS_VBType & VB_UMC) romptr += 12;
10465 } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10469 if( (SiS_Pr->SiS_LCDResInfo != Panel_Custom) &&
10470 ((romptr = GetLCDStructPtr661_2(SiS_Pr))) ) {
10472 lcdpdcindex = (SiS_Pr->SiS_VBType & VB_UMC) ? 14 : 12;
10482 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
10483 switch(SiS_Pr->SiS_LCDResInfo) {
10496 if((SiS_Pr->PanelXRes <= 1024) && (SiS_Pr->PanelYRes <= 768)) {
10498 } else if((SiS_Pr->PanelXRes == 1280) && (SiS_Pr->PanelYRes == 1024)) {
10500 } else if((SiS_Pr->PanelXRes <= 1400) && (SiS_Pr->PanelYRes <= 1050)) {
10502 } else if((SiS_Pr->PanelXRes <= 1600) && (SiS_Pr->PanelYRes <= 1200)) {
10512 if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->PDC != -1)) {
10513 delay = SiS_Pr->PDC & 0x1f;
10515 if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) && (SiS_Pr->PDCA != -1)) {
10516 delay = (SiS_Pr->PDCA & 0x1f) << 8;
10523 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
10525 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((delay << 3) & 0xf0));
10526 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((delay & 0x01) << 6));
10528 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((delay >> 1) & 0x0f));
10529 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((delay & 0x01) << 7));
10534 SetCRT2SyncDither661(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short RTI)
10539 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10542 infoflag = SiS_GetRegByte(SiS_Pr->SiS_P3ca+2);
10543 } else if(SiS_Pr->UseCustomMode) {
10544 infoflag = SiS_Pr->CInfoFlag;
10546 infoflag = SiS_Pr->SiS_RefIndex[RTI].Ext_InfoFlag;
10549 if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
10550 infoflag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37); /* No longer check D5 */
10555 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
10557 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
10559 if(SiS_Pr->SiS_ModeType >= Mode24Bpp) temp |= 0x10;
10561 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xe0,temp);
10564 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp = 0x20;
10566 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0f,temp);
10568 if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
10569 if(SiS_Pr->SiS_ModeType >= Mode24Bpp) temp |= 0x80;
10571 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1a,0x7f,temp);
10578 SetPanelParms661(struct SiS_Private *SiS_Pr)
10580 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10583 if(SiS_Pr->SiS_VBType & (VB_SISLVDS | VB_SIS30xC)) {
10584 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x24,0x0f);
10587 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
10588 if(SiS_Pr->LVDSHL != -1) {
10589 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,SiS_Pr->LVDSHL);
10593 if(SiS_Pr->SiS_ROMNew) {
10595 if((romptr = GetLCDStructPtr661_2(SiS_Pr))) {
10596 if(SiS_Pr->SiS_VBType & VB_SISLVDS) {
10599 if(SiS_Pr->LVDSHL != -1) {
10603 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,temp2,temp1);
10605 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
10607 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0d,0xbf,temp1);
10615 SiS_OEM310Setting(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RRTI)
10617 if((SiS_Pr->SiS_ROMNew) && (SiS_Pr->SiS_VBType & VB_SISLVDS)) {
10618 SetDelayComp661(SiS_Pr, ModeNo, ModeIdIndex, RRTI);
10619 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10620 SetCRT2SyncDither661(SiS_Pr, ModeNo, RRTI);
10621 SetPanelParms661(SiS_Pr);
10624 SetDelayComp(SiS_Pr,ModeNo);
10627 if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
10628 SetAntiFlicker(SiS_Pr,ModeNo,ModeIdIndex);
10629 SetPhaseIncr(SiS_Pr,ModeNo,ModeIdIndex);
10630 SetYFilter(SiS_Pr,ModeNo,ModeIdIndex);
10631 if(SiS_Pr->SiS_VBType & VB_SIS301) {
10632 SetEdgeEnhance(SiS_Pr,ModeNo,ModeIdIndex);
10638 SiS_OEM661Setting(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
10641 if(SiS_Pr->SiS_VBType & VB_SISVB) {
10643 SetDelayComp661(SiS_Pr, ModeNo, ModeIdIndex, RRTI);
10645 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10646 SetCRT2SyncDither661(SiS_Pr, ModeNo, RRTI);
10647 SetPanelParms661(SiS_Pr);
10650 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
10651 SetPhaseIncr(SiS_Pr, ModeNo, ModeIdIndex);
10652 SetYFilter(SiS_Pr, ModeNo, ModeIdIndex);
10653 SetAntiFlicker(SiS_Pr, ModeNo, ModeIdIndex);
10654 if(SiS_Pr->SiS_VBType & VB_SIS301) {
10655 SetEdgeEnhance(SiS_Pr, ModeNo, ModeIdIndex);
10669 SiS_FinalizeLCD(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
10674 if(!(SiS_Pr->SiS_VBType & VB_SISLVDS)) return;
10675 if(SiS_Pr->SiS_ROMNew) return;
10677 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10678 if(SiS_Pr->LVDSHL != -1) {
10679 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,SiS_Pr->LVDSHL);
10683 if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) return;
10684 if(SiS_Pr->UseCustomMode) return;
10686 switch(SiS_Pr->SiS_CustomT) {
10695 resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
10696 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
10698 resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
10699 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
10703 if(!(SiS_GetReg(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) {
10704 if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
10705 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x02);
10707 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03);
10712 if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
10713 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10715 if(SiS_Pr->LVDSHL == -1) {
10716 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
10722 if(SiS_Pr->SiS_CustomT == CUT_CLEVO10242) {
10723 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10724 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10725 if(SiS_Pr->LVDSHL == -1) {
10727 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
10729 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
10730 tempch = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
10732 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
10733 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x25);
10734 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x00);
10735 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
10743 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
10744 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10745 if(SiS_Pr->SiS_VBType & VB_SISEMI) {
10746 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00);
10748 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
10750 SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
10752 } else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
10753 if(SiS_Pr->LVDSHL == -1) {
10755 SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
10758 tempch = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
10759 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
10760 if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) {
10761 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1f,0x76);
10762 } else if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10764 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
10765 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x25);
10766 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x00);
10767 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
10769 if((SiS_Pr->Backup == TRUE) && (SiS_Pr->Backup_Mode == ModeNo)) {
10770 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
10771 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
10772 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,SiS_Pr->Backup_16);
10773 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,SiS_Pr->Backup_17);
10774 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,SiS_Pr->Backup_18);
10775 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,SiS_Pr->Backup_19);
10776 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1a,SiS_Pr->Backup_1a);
10777 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,SiS_Pr->Backup_1b);
10778 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,SiS_Pr->Backup_1c);
10779 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,SiS_Pr->Backup_1d);
10780 } else if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) { /* 1.10.8w */
10781 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,0x90);
10783 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x11);
10785 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x18);
10788 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
10790 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02); /* 1.10.7u */
10795 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,temp);
10797 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1d,0xf8,temp);
10802 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x70);
10803 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xff);
10804 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x48);
10805 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x12);
10808 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,0x20);
10809 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,0x1a);
10810 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,0x28);
10811 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,0x00);
10812 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x4c);
10813 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xdc);
10817 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x95);
10818 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xdc);
10819 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1a,0x10);
10820 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x95);
10821 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x48);
10822 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x12);
10825 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x95);
10826 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x48);
10829 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x95);
10837 tempcl = tempbh = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x01);
10841 tempbl = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x04);
10843 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10844 if((resinfo == SIS_RI_1024x768) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
10845 if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
10849 if(SiS_Pr->SiS_VGAVDE < 600) {
10850 tempax = 768 - SiS_Pr->SiS_VGAVDE;
10852 if(SiS_Pr->SiS_VGAVDE <= 480) tempax >>= 4; /* 1.10.7w; 1.10.6s: < 480; >>=1; */
10859 SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,temp);
10861 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,temp);
10873 SetOEMLCDData2(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex,
10881 modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
10882 crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
10884 modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
10885 crt2crtc = SiS_Pr->SiS_RefIndex[RefTabIndex].Ext_CRT2CRTC;
10890 if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
10891 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xdf);
10894 if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
10897 if(SiS_Pr->SiS_SetFlag & LowModeTests) {
10900 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,
10907 temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
10909 temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x18);
10911 SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp);
10917 GetOEMLCDPtr(struct SiS_Private *SiS_Pr, int Flag)
10919 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10930 if(SiS_Pr->ChipType == SIS_300) {
10932 tempbx = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0x0f;
10933 if(SiS_Pr->SiS_VBType & VB_SIS301) tempbx &= 0x07;
10935 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 4;
10936 if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
10937 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 3;
10939 if(SiS_Pr->SiS_UseROM) {
10941 tempbx = SiS_Pr->SiS_LCDTypeInfo;
10944 if(romptr) tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
10945 else tempbx = customtable300[SiS_Pr->SiS_LCDTypeInfo];
10949 if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx++;
10956 if(SiS_Pr->SiS_UseROM) {
10958 if(romptr) tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
10961 tempbx = customtable630[SiS_Pr->SiS_LCDTypeInfo];
10965 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempbx += 2;
10966 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
10969 tempbx = SiS_Pr->SiS_LCDTypeInfo << 2;
10970 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempbx += 2;
10971 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
10979 SetOEMLCDDelay(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex)
10981 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
10984 if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) return;
10986 if(SiS_Pr->SiS_UseROM) {
10999 if(SiS_Pr->PDC != -1) return;
11001 temp = GetOEMLCDPtr(SiS_Pr, 0);
11003 if(SiS_Pr->UseCustomMode)
11006 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
11008 if(SiS_Pr->ChipType != SIS_300) {
11015 if(SiS_Pr->SiS_VBType & VB_SISVB) {
11022 if(SiS_Pr->SiS_UseROM && (ROMAddr[0x235] & 0x80)) {
11032 if(SiS_Pr->SiS_UseROM) {
11048 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp); /* index 0A D[6:4] */
11052 SetOEMLCDData(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
11055 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
11058 if((SiS_Pr->SiS_UseROM) {
11064 temp = GetOEMLCDPtr(SiS_Pr, 1);
11067 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDHIndex;
11069 SiS_SetReg(SiS_Pr->SiS_Part1Port,i,SiS300_LCDHData[temp][index][j]);
11073 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDVIndex;
11078 SiS_SetReg(SiS_Pr->SiS_Part1Port,i,SiS300_LCDVData[temp][index][j]);
11084 GetOEMTVPtr(struct SiS_Private *SiS_Pr)
11089 if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) index += 4;
11090 if(SiS_Pr->SiS_VBType & VB_SISVB) {
11091 if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) index += 2;
11092 else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) index += 3;
11093 else if(SiS_Pr->SiS_TVMode & TVSetPAL) index += 1;
11095 if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) index += 2;
11096 if(SiS_Pr->SiS_TVMode & TVSetPAL) index += 1;
11102 SetOEMTVDelay(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
11104 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
11107 if(SiS_Pr->SiS_UseROM) {
11113 temp = GetOEMTVPtr(SiS_Pr);
11115 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVDelayIndex;
11122 if(SiS_Pr->SiS_VBType & VB_SISVB) {
11129 SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp);
11133 SetOEMAntiFlicker(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
11135 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
11138 if(SiS_Pr->SiS_UseROM) {
11144 temp = GetOEMTVPtr(SiS_Pr);
11146 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVFlickerIndex;
11157 SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0A,0x8F,temp);
11161 SetOEMPhaseIncr(struct SiS_Private *SiS_Pr, unsigned short ModeNo,unsigned short ModeIdIndex)
11163 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
11166 if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) return;
11168 if(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 | TVSetNTSCJ | TVSetPALM | TVSetPALN)) return;
11170 if(SiS_Pr->SiS_UseROM) {
11176 temp = GetOEMTVPtr(SiS_Pr);
11178 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVPhaseIndex;
11180 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
11182 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Phase2[temp][index][j]);
11190 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
11194 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Phase1[temp][index][j]);
11201 SetOEMYFilter(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
11203 unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
11206 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSCART | SetCRT2ToHiVision | SetCRT2ToYPbPr525750)) return;
11208 if(SiS_Pr->SiS_UseROM) {
11214 temp = GetOEMTVPtr(SiS_Pr);
11216 if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 8;
11217 else if(SiS_Pr->SiS_TVMode & TVSetPALN) temp = 9;
11220 index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVYFilterIndex;
11222 if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
11224 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
11227 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
11230 if((romptr) && (!(SiS_Pr->SiS_TVMode & (TVSetPALM|TVSetPALN)))) {
11235 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
11239 SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter1[temp][index][j]);
11246 SiS_SearchVBModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo)
11249 unsigned char VGAINFO = SiS_Pr->SiS_VGAINFO;
11254 if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == *ModeNo) break;
11255 if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == 0xFF) return 0;
11270 SiS_OEM300Setting(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
11275 if(!SiS_Pr->UseCustomMode) {
11276 OEMModeIdIndex = SiS_SearchVBModeID(SiS_Pr,&ModeNo);
11280 if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
11281 SetOEMLCDDelay(SiS_Pr, ModeNo, OEMModeIdIndex);
11282 if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
11283 SetOEMLCDData(SiS_Pr, ModeNo, OEMModeIdIndex);
11286 if(SiS_Pr->UseCustomMode) return;
11287 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
11288 SetOEMTVDelay(SiS_Pr, ModeNo,OEMModeIdIndex);
11289 if(SiS_Pr->SiS_VBType & VB_SISVB) {
11290 SetOEMAntiFlicker(SiS_Pr, ModeNo, OEMModeIdIndex);
11291 SetOEMPhaseIncr(SiS_Pr, ModeNo, OEMModeIdIndex);
11292 SetOEMYFilter(SiS_Pr, ModeNo, OEMModeIdIndex);