init301.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:149k
- /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2000/12/02 01:16:16 dawes Exp $ */
- #include "init301.h"
- #ifdef CONFIG_FB_SIS_300
- #include "oem300.h"
- #endif
- #ifdef CONFIG_FB_SIS_315
- #include "oem310.h"
- #endif
- BOOLEAN
- SiS_SetCRT2Group301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT ModeIdIndex;
- USHORT RefreshRateTableIndex;
- SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
- SiS_SearchModeID (ROMAddr, ModeNo, &ModeIdIndex);
- SiS_SelectCRT2Rate = 4;
- RefreshRateTableIndex =
- SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, ModeIdIndex);
- SiS_SaveCRT2Info (ModeNo);
- SiS_DisableBridge (HwDeviceExtension, BaseAddr);
- SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
- SiS_SetCRT2ModeRegs (BaseAddr, ModeNo, HwDeviceExtension);
- if (SiS_VBInfo & DisableCRT2Display) {
- SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
- SiS_DisplayOn ();
- return (FALSE);
- }
- /* SetDefCRT2ExtRegs(BaseAddr); */
- SiS_GetCRT2Data (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- }
- /*end 301b */
- if (SiS_IF_DEF_LVDS == 1) {
- SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- }
- SiS_SetGroup1 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- HwDeviceExtension, RefreshRateTableIndex);
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA) && (SiS_IF_DEF_LVDS == 0)) {
- } else if (SiS_IF_DEF_LVDS == 0 && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
- SiS_SetGroup2 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- SiS_SetGroup3 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- HwDeviceExtension);
- SiS_SetGroup4 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- SiS_SetGroup5 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex);
- } else {
- if (SiS_IF_DEF_CH7005 == 1) {
- SiS_SetCHTVReg (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- }
- SiS_ModCRT1CRTC (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- SiS_SetCRT2ECLK (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- }
- #ifdef CONFIG_FB_SIS_300
- if ((HwDeviceExtension->jChipType == SIS_540) ||
- (HwDeviceExtension->jChipType == SIS_630) ||
- (HwDeviceExtension->jChipType == SIS_730) ||
- (HwDeviceExtension->jChipType == SIS_300))
- SiS_OEM300Setting (HwDeviceExtension, BaseAddr, ROMAddr,
- ModeNo);
- #endif
- #ifdef CONFIG_FB_SIS_315
- if ((HwDeviceExtension->jChipType == SIS_315H) || /* 05/02/01 ynlai for sis550 */
- (HwDeviceExtension->jChipType == SIS_315PRO) ||
- (HwDeviceExtension->jChipType == SIS_550) || /* 05/02/01 ynlai for 550 */
- (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
- (HwDeviceExtension->jChipType == SIS_740)) { /* 09/03/01 chiawen for 640/740 */
- SiS_OEM310Setting (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
- ModeIdIndex);
- SiS_CRT2AutoThreshold (BaseAddr);
- }
- #endif
- SiS_EnableBridge (HwDeviceExtension, BaseAddr);
- SiS_DisplayOn ();
- SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
- return 1;
- }
- void
- SiS_SetGroup1 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
- USHORT RefreshRateTableIndex)
- {
- USHORT temp = 0, tempax = 0, tempbx = 0, tempcx = 0;
- USHORT pushbx = 0, CRT1Index = 0;
- USHORT modeflag, resinfo = 0;
- if (ModeNo <= 0x13) {
- } else {
- CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
- CRT1Index = CRT1Index & 0x3F;
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- } else {
- SiS_SetCRT2Offset (SiS_Part1Port, ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- if (HwDeviceExtension->jChipType < SIS_315H) /* 300 series */
- SiS_SetCRT2FIFO (SiS_Part1Port, ROMAddr, ModeNo,
- HwDeviceExtension);
- else /* 310 series */
- SiS_SetCRT2FIFO2 (SiS_Part1Port, ROMAddr, ModeNo,
- HwDeviceExtension);
- SiS_SetCRT2Sync (BaseAddr, ROMAddr, ModeNo,
- RefreshRateTableIndex);
- }
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- SiS_SetGroup1_LCDA (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- HwDeviceExtension, RefreshRateTableIndex);
- }
- /*end 301b */
- else if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
- temp = (SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
- SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
- temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
- SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
- temp = (SiS_VGAHDE + 12) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
- SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
- pushbx = SiS_VGAHDE + 12; /* bx BTVGA@HRS 0x0B,0x0C */
- tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2; /* cx */
- tempbx = pushbx + tempcx;
- tempcx = tempcx << 1;
- tempcx = tempcx + tempbx;
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- tempbx = SiS_CRT1Table[CRT1Index].CR[4];
- tempbx =
- tempbx |
- ((SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) <<
- 2);
- tempbx = (tempbx - 1) << 3;
- tempcx = SiS_CRT1Table[CRT1Index].CR[5];
- tempcx = tempcx & 0x1F;
- temp = SiS_CRT1Table[CRT1Index].CR[15];
- temp = (temp & 0x04) << (6 - 2);
- tempcx = ((tempcx | temp) - 1) << 3;
- }
- }
- /*add for hardware request */
- if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
- if (SiS_VBInfo & SetPALTV) {
- tempbx = 1040;
- tempcx = 1042;
- } else {
- tempbx = 1040;
- tempcx = 1042;
- }
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
- } else { /* 310 series */
- if (modeflag & HalfDCLK) { /* for low resolution mode */
- temp = (SiS_VGAHT / 2 - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
- SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
- temp = (((SiS_VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
- SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
- temp = (SiS_VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
- SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
- pushbx = SiS_VGAHDE / 2 + 16;
- tempcx = ((SiS_VGAHT - SiS_VGAHDE) / 2) >> 2; /* cx */
- tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
- tempcx = tempcx + tempbx;
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- tempbx = SiS_CRT1Table[CRT1Index].CR[4];
- tempbx =
- tempbx |
- ((SiS_CRT1Table
- [CRT1Index].CR[14] & 0xC0) << 2);
- tempbx = (tempbx - 3) << 3; /*(VGAHRS-3)*8 */
- tempcx = SiS_CRT1Table[CRT1Index].CR[5];
- tempcx = tempcx & 0x1F;
- temp = SiS_CRT1Table[CRT1Index].CR[15];
- temp = (temp & 0x04) << (5 - 2); /*VGAHRE D[5] */
- tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
- }
- }
- tempbx += 4;
- tempcx += 4;
- if (tempcx > (SiS_VGAHT / 2))
- tempcx = SiS_VGAHT / 2;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
- } else {
- temp = (SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
- SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
- temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
- SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
- temp = (SiS_VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
- SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
- pushbx = SiS_VGAHDE + 16;
- tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2; /* cx */
- tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
- tempcx = tempcx + tempbx;
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- tempbx = SiS_CRT1Table[CRT1Index].CR[4];
- tempbx =
- tempbx |
- ((SiS_CRT1Table
- [CRT1Index].CR[14] & 0xC0) << 2);
- tempbx = (tempbx - 3) << 3; /*(VGAHRS-3)*8 */
- tempcx = SiS_CRT1Table[CRT1Index].CR[5];
- tempcx = tempcx & 0x1F;
- temp = SiS_CRT1Table[CRT1Index].CR[15];
- temp = (temp & 0x04) << (5 - 2); /*VGAHRE D[5] */
- tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
- tempbx += 16;
- tempcx += 16;
- }
- }
- if (tempcx > SiS_VGAHT)
- tempcx = SiS_VGAHT;
- /*add for hardware request */
- if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
- if (SiS_VBInfo & SetPALTV) {
- tempbx = 1040;
- tempcx = 1042;
- } else {
- tempbx = 1040;
- tempcx = 1042;
- }
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
- }
- }
- tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
- tempbx = pushbx;
- tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
- tempax = tempax | (tempbx & 0xFF00);
- temp = (tempax & 0xFF00) >> 8;
- SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
- temp = tempcx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0D, temp);
- tempcx = (SiS_VGAVT - 1);
- temp = tempcx & 0x00FF;
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & 0x0C) {
- temp--;
- }
- }
- SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
- tempbx = SiS_VGAVDE - 1;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0F, temp);
- temp = ((tempbx & 0xFF00) << 3) >> 8;
- temp = temp | ((tempcx & 0xFF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x12, temp);
- tempax = SiS_VGAVDE;
- tempbx = SiS_VGAVDE;
- tempcx = SiS_VGAVT;
- tempbx = (SiS_VGAVT + SiS_VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */
- tempcx = ((SiS_VGAVT - SiS_VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- tempbx = SiS_CRT1Table[CRT1Index].CR[8];
- temp = SiS_CRT1Table[CRT1Index].CR[7];
- if (temp & 0x04)
- tempbx = tempbx | 0x0100;
- if (temp & 0x080)
- tempbx = tempbx | 0x0200;
- temp = SiS_CRT1Table[CRT1Index].CR[13];
- if (temp & 0x08)
- tempbx = tempbx | 0x0400;
- temp = SiS_CRT1Table[CRT1Index].CR[9];
- tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
- }
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
- temp = ((tempbx & 0xFF00) >> 8) << 4;
- temp = ((tempcx & 0x000F) | (temp));
- SiS_SetReg1 (SiS_Part1Port, 0x11, temp);
- if (SiS_IF_DEF_LVDS == 0) {
- temp = 0x20;
- if (SiS_LCDResInfo == Panel1280x1024)
- temp = 0x20;
- if (SiS_LCDResInfo == Panel1280x960)
- temp = 0x24;
- if (SiS_VBInfo & SetCRT2ToTV)
- temp = 0x08;
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- if (SiS_VBInfo & SetInSlaveMode)
- temp = 0x2c;
- else
- temp = 0x20;
- }
- } else {
- temp = 0x20;
- }
- if (HwDeviceExtension->jChipType < SIS_315H) /* 300 series */
- SiS_SetRegANDOR (SiS_Part1Port, 0x13, ~0x03C, temp);
- else { /* 310 series */
- temp >>= 2;
- temp = 0x11; /* ynlai 05/30/2001 for delay compenation */
- SiS_SetReg1 (SiS_Part1Port, 0x2D, temp);
- /*SiS_SetRegANDOR(SiS_Part1Port,0x2D,~0x00F,temp); */
- SiS_SetRegAND (SiS_Part1Port, 0x13, 0xEF); /* BDirectLCD=0 for lcd ?? */
- tempax = 0;
- if (modeflag & DoubleScanMode)
- tempax |= 0x80;
- if (modeflag & HalfDCLK)
- tempax |= 0x40;
- SiS_SetRegANDOR (SiS_Part1Port, 0x2C, ~0x0C0, tempax);
- }
- if (SiS_IF_DEF_LVDS == 0) { /* 301 */
- SiS_SetGroup1_301 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- HwDeviceExtension, RefreshRateTableIndex);
- } else { /* LVDS */
- SiS_SetGroup1_LVDS (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
- HwDeviceExtension, RefreshRateTableIndex);
- }
- }
- void
- SiS_SetGroup1_301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
- USHORT RefreshRateTableIndex)
- {
- USHORT push1, push2;
- USHORT tempax, tempbx, tempcx, temp;
- USHORT resinfo, modeflag;
- USHORT CRT1Index;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
- resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
- CRT1Index = CRT1Index & 0x3F;
- }
- if (!(SiS_VBInfo & SetInSlaveMode)) {
- return;
- }
- tempax = 0xFFFF;
- if (!(SiS_VBInfo & SetCRT2ToTV)) {
- tempax = SiS_GetVGAHT2 ();
- }
- if (modeflag & Charx8Dot)
- tempcx = 0x08;
- else
- tempcx = 0x09;
- if (tempax >= SiS_VGAHT) {
- tempax = SiS_VGAHT;
- }
- if (modeflag & HalfDCLK) {
- tempax = tempax >> 1;
- }
- tempax = (tempax / tempcx) - 5;
- tempbx = tempax;
- temp = 0xFF; /* set MAX HT */
- SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
- tempax = SiS_VGAHDE; /* 0x04 Horizontal Display End */
- if (modeflag & HalfDCLK)
- tempax = tempax >> 1;
- tempax = (tempax / tempcx) - 1;
- tempbx = tempbx | ((tempax & 0x00FF) << 8);
- temp = tempax & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x04, temp);
- temp = (tempbx & 0xFF00) >> 8;
- if (SiS_VBInfo & SetCRT2ToTV) {
- temp = temp + 2;
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- if (resinfo == 7)
- temp = temp - 2;
- }
- }
- SiS_SetReg1 (SiS_Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */
- SiS_SetReg1 (SiS_Part1Port, 0x06, 0x03); /* 0x06 Horizontal Blank end */
- /* 0x07 horizontal Retrace Start */
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- temp = (tempbx & 0x00FF) - 1;
- if (!(modeflag & HalfDCLK)) {
- temp = temp - 6;
- if (SiS_SetFlag & TVSimuMode) {
- temp = temp - 4;
- if (ModeNo > 0x13)
- temp = temp - 10;
- }
- }
- } else {
- tempcx = tempbx & 0x00FF;
- tempbx = (tempbx & 0xFF00) >> 8;
- tempcx = (tempcx + tempbx) >> 1;
- temp = (tempcx & 0x00FF) + 2;
- if (SiS_VBInfo & SetCRT2ToTV) {
- temp = temp - 1;
- if (!(modeflag & HalfDCLK)) {
- if ((modeflag & Charx8Dot)) {
- temp = temp + 4;
- if (SiS_VGAHDE >= 800) {
- temp = temp - 6;
- }
- }
- }
- } else {
- if (!(modeflag & HalfDCLK)) {
- temp = temp - 4;
- if (SiS_LCDResInfo != Panel1280x960) {
- if (SiS_VGAHDE >= 800) {
- temp = temp - 7;
- if (SiS_ModeType == ModeEGA) {
- if (SiS_VGAVDE == 1024) {
- temp =
- temp + 15;
- if
- (SiS_LCDResInfo
- !=
- Panel1280x1024)
- {
- temp =
- temp
- + 7;
- }
- }
- }
- if (SiS_VGAHDE >= 1280) {
- if (SiS_LCDResInfo !=
- Panel1280x960) {
- if (SiS_LCDInfo
- &
- LCDNonExpanding)
- {
- temp =
- temp
- +
- 28;
- }
- }
- }
- }
- }
- }
- }
- }
- SiS_SetReg1 (SiS_Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0); /* 0x08 Horizontal Retrace End */
- if (SiS_VBInfo & SetCRT2ToTV) {
- if (SiS_SetFlag & TVSimuMode) {
- if ((ModeNo == 0x06) || (ModeNo == 0x10)
- || (ModeNo == 0x11) || (ModeNo == 0x13)
- || (ModeNo == 0x0F)) {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x5b);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
- }
- if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
- if (SiS_VBInfo & SetNTSCTV) {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x61);
- } else {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x41);
- SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
- }
- }
- if ((ModeNo == 0x02) || (ModeNo == 0x03)
- || (ModeNo == 0x07)) {
- if (SiS_VBInfo & SetNTSCTV) {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x54);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
- } else {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x55);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
- }
- }
- if ((ModeNo == 0x04) || (ModeNo == 0x05)
- || (ModeNo == 0x0D) || (ModeNo == 0x50)) {
- if (SiS_VBInfo & SetNTSCTV) {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x30);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
- } else {
- SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2f);
- SiS_SetReg1 (SiS_Part1Port, 0x08, 0x02);
- }
- }
- }
- }
- SiS_SetReg1 (SiS_Part1Port, 0x18, 0x03); /* 0x18 SR08 */
- SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0xF0, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
- tempbx = SiS_VGAVT;
- push1 = tempbx;
- tempcx = 0x121;
- tempbx = SiS_VGAVDE; /* 0x0E Virtical Display End */
- if (tempbx == 357)
- tempbx = 350;
- if (tempbx == 360)
- tempbx = 350;
- if (tempbx == 375)
- tempbx = 350;
- if (tempbx == 405)
- tempbx = 400;
- if (tempbx == 420)
- tempbx = 400;
- if (tempbx == 525)
- tempbx = 480;
- push2 = tempbx;
- if (SiS_VBInfo & SetCRT2ToLCD) {
- if (SiS_LCDResInfo == Panel1024x768) {
- if (!(SiS_SetFlag & LCDVESATiming)) {
- if (tempbx == 350)
- tempbx = tempbx + 5;
- if (tempbx == 480)
- tempbx = tempbx + 5;
- }
- }
- }
- tempbx--;
- temp = tempbx & 0x00FF;
- tempbx--;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */
- tempbx = push2;
- tempbx--;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
- if (tempbx & 0x0100) {
- tempcx = tempcx | 0x0002;
- }
- tempax = 0x000B;
- if (modeflag & DoubleScanMode) {
- tempax = tempax | 0x08000;
- }
- if (tempbx & 0x0200) {
- tempcx = tempcx | 0x0040;
- }
- temp = (tempax & 0xFF00) >> 8;
- SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
- if (tempbx & 0x0400) {
- tempcx = tempcx | 0x0600;
- }
- SiS_SetReg1 (SiS_Part1Port, 0x11, 0x00); /* 0x11 Vertival Blank End */
- tempax = push1;
- tempax = tempax - tempbx; /* 0x0C Vertical Retrace Start */
- tempax = tempax >> 2;
- push1 = tempax; /* push ax */
- if (resinfo != 0x09) {
- tempax = tempax << 1;
- tempbx = tempax + tempbx;
- }
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- tempbx = tempbx - 10;
- } else {
- if (SiS_SetFlag & TVSimuMode) {
- if (SiS_VBInfo & SetPALTV) {
- tempbx = tempbx + 40;
- }
- }
- }
- tempax = push1;
- tempax = tempax >> 2;
- tempax++;
- tempax = tempax + tempbx;
- push1 = tempax; /* push ax */
- if ((SiS_VBInfo & SetPALTV)) {
- if (tempbx <= 513) {
- if (tempax >= 513) {
- tempbx = 513;
- }
- }
- }
- temp = (tempbx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
- tempbx--;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
- if (tempbx & 0x0100) {
- tempcx = tempcx | 0x0008;
- }
- if (tempbx & 0x0200) {
- SiS_SetRegANDOR (SiS_Part1Port, 0x0B, 0x0FF, 0x20);
- }
- tempbx++;
- if (tempbx & 0x0100) {
- tempcx = tempcx | 0x0004;
- }
- if (tempbx & 0x0200) {
- tempcx = tempcx | 0x0080;
- }
- if (tempbx & 0x0400) {
- tempcx = tempcx | 0x0C00;
- }
- tempbx = push1; /* pop ax */
- temp = tempbx & 0x00FF;
- temp = temp & 0x0F;
- SiS_SetReg1 (SiS_Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */
- if (tempbx & 0x0010) {
- tempcx = tempcx | 0x2000;
- }
- temp = tempcx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x0A, temp); /* 0x0A CR07 */
- temp = (tempcx & 0x0FF00) >> 8;
- SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* 0x17 SR0A */
- tempax = modeflag;
- temp = (tempax & 0xFF00) >> 8;
- temp = (temp >> 1) & 0x09;
- SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* 0x16 SR01 */
- SiS_SetReg1 (SiS_Part1Port, 0x0F, 0); /* 0x0F CR14 */
- SiS_SetReg1 (SiS_Part1Port, 0x12, 0); /* 0x12 CR17 */
- if (SiS_LCDInfo & LCDRGB18Bit)
- temp = 0x80;
- else
- temp = 0x00;
- SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* 0x1A SR0E */
- return;
- }
- void
- SiS_SetGroup1_LVDS (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
- USHORT RefreshRateTableIndex)
- {
- USHORT modeflag, resinfo;
- USHORT push1, push2, tempax, tempbx, tempcx, temp, pushcx;
- ULONG tempeax = 0, tempebx, tempecx, tempvcfact = 0;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
- resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
- tempax = SiS_LCDHDES;
- tempbx = SiS_HDE;
- tempcx = SiS_HT;
- tempcx = tempcx - tempbx; /* HT-HDE */
- if (SiS_LCDInfo & LCDNonExpanding) {
- if (SiS_LCDResInfo == Panel800x600)
- tempbx = 800;
- if (SiS_LCDResInfo == Panel1024x768)
- tempbx = 1024;
- }
- push1 = tempax;
- tempax = tempax + tempbx; /* lcdhdee */
- tempbx = SiS_HT;
- if (tempax >= tempbx) {
- tempax = tempax - tempbx;
- }
- push2 = tempax;
- /* push ax lcdhdee */
- tempcx = tempcx >> 2; /* temp */
- tempcx = tempcx + tempax; /* lcdhrs */
- if (tempcx >= tempbx) {
- tempcx = tempcx - tempbx;
- }
- /* v ah,cl */
- tempax = tempcx;
- tempax = tempax >> 3; /* BPLHRS */
- temp = tempax & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x14, temp); /* Part1_14h */
- temp = (tempax & 0x00FF) + 10;
- temp = temp & 0x01F;
- temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
- SiS_SetReg1 (SiS_Part1Port, 0x15, temp); /* Part1_15h */
- tempbx = push2; /* lcdhdee */
- tempcx = push1; /* lcdhdes */
- temp = (tempcx & 0x00FF);
- temp = temp & 0x07; /* BPLHDESKEW */
- SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* Part1_1Ah */
- tempcx = tempcx >> 3; /* BPLHDES */
- temp = (tempcx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* Part1_16h */
- if (tempbx & 0x07)
- tempbx = tempbx + 8;
- tempbx = tempbx >> 3; /* BPLHDEE */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* Part1_17h */
- tempcx = SiS_VGAVT;
- tempbx = SiS_VGAVDE;
- tempcx = tempcx - tempbx; /* GAVT-VGAVDE */
- tempbx = SiS_LCDVDES; /* VGAVDES */
- push1 = tempbx; /* push bx temppush1 */
- if (SiS_IF_DEF_TRUMPION == 0) {
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & SetCRT2ToTV) {
- tempax = SiS_VGAVDE;
- }
- }
- if (SiS_VBInfo & SetCRT2ToLCD) {
- if (SiS_LCDResInfo == Panel800x600)
- tempax = 600;
- if (SiS_LCDResInfo == Panel1024x768)
- tempax = 768;
- }
- } else
- tempax = SiS_VGAVDE;
- tempbx = tempbx + tempax;
- tempax = SiS_VT; /* VT */
- if (tempbx >= SiS_VT) {
- tempbx = tempbx - tempax;
- }
- push2 = tempbx; /* push bx temppush2 */
- tempcx = tempcx >> 1;
- tempbx = tempbx + tempcx;
- tempbx++; /* BPLVRS */
- if (tempbx >= tempax) {
- tempbx = tempbx - tempax;
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x18, temp); /* Part1_18h */
- tempcx = tempcx >> 3;
- tempcx = tempcx + tempbx;
- tempcx++; /* BPLVRE */
- temp = tempcx & 0x00FF;
- temp = temp & 0x0F;
- SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp); /* Part1_19h */
- temp = (tempbx & 0xFF00) >> 8;
- temp = temp & 0x07;
- temp = temp << 3; /* BPLDESKEW =0 */
- tempbx = SiS_VGAVDE;
- if (tempbx != SiS_VDE) {
- temp = temp | 0x40;
- }
- if (SiS_SetFlag & EnableLVDSDDA) {
- temp = temp | 0x40;
- }
- if (SiS_LCDInfo & LCDRGB18Bit) {
- temp = temp | 0x80;
- }
- SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp); /* Part1_1Ah */
- tempecx = SiS_VGAVT;
- tempebx = SiS_VDE;
- tempeax = SiS_VGAVDE;
- tempecx = tempecx - tempeax; /* VGAVT-VGAVDE */
- tempeax = tempeax << 6;
- temp = (USHORT) (tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if (temp != 0) {
- tempeax++;
- }
- tempebx = tempeax; /* BPLVCFACT */
- if (SiS_SetFlag & EnableLVDSDDA) {
- tempebx = tempebx & 0x003F;
- }
- temp = (USHORT) (tempebx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x1E, temp); /* Part1_1Eh */
- /*add for 301b different 301 */
- if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
- tempecx = SiS_VGAVT;
- tempebx = SiS_VDE;
- tempeax = SiS_VGAVDE;
- tempecx = tempecx - tempeax; /* VGAVT-VGAVDE */
- tempeax = tempeax << 18;
- temp = (USHORT) (tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if (temp != 0) {
- tempeax++;
- }
- tempebx = tempeax; /* BPLVCFACT */
- tempvcfact = tempeax; /*301b */
- temp = (USHORT) (tempebx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
- temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
- temp = (USHORT) ((tempebx & 0x00030000) >> 16);
- if (SiS_VDE == SiS_VGAVDE) {
- temp = temp | 0x04;
- }
- SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
- }
- /*end for 301b */
- tempbx = push2; /* p bx temppush2 BPLVDEE */
- tempcx = push1; /* pop cx temppush1 NPLVDES */
- push1 = (USHORT) (tempeax & 0xFFFF);
- if (!(SiS_VBInfo & SetInSlaveMode)) {
- if (SiS_LCDResInfo == Panel800x600) {
- if (resinfo == 7)
- tempcx++;
- } else {
- if (SiS_LCDResInfo == Panel1024x768) {
- if (resinfo == 8)
- tempcx++;
- }
- }
- }
- temp = (tempbx & 0xFF00) >> 8;
- temp = temp & 0x07;
- temp = temp << 3;
- temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
- SiS_SetReg1 (SiS_Part1Port, 0x1D, temp); /* Part1_1Dh */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x1C, temp); /* Part1_1Ch */
- temp = tempcx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x1B, temp); /* Part1_1Bh */
- tempecx = SiS_VGAHDE;
- tempebx = SiS_HDE;
- tempeax = tempecx;
- tempeax = tempeax << 6;
- tempeax = tempeax << 10;
- tempeax = tempeax / tempebx;
- if (tempebx == tempecx) {
- tempeax = 65535;
- }
- tempecx = tempeax;
- tempeax = SiS_VGAHDE; /*change VGAHT->VGAHDE */
- tempeax = tempeax << 6;
- tempeax = tempeax << 10;
- tempeax = tempeax / tempecx;
- tempecx = tempecx << 16;
- tempeax = tempeax - 1;
- tempecx = tempecx | (tempeax & 0x00FFFF);
- temp = (USHORT) (tempecx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x1F, temp); /* Part1_1Fh */
- tempeax = SiS_VGAVDE;
- tempeax = tempeax << 18; /*301b */
- tempeax = tempeax / tempvcfact;
- tempbx = (USHORT) (tempeax & 0x0FFFF);
- if (SiS_LCDResInfo == Panel1024x768)
- tempbx--;
- if (SiS_SetFlag & EnableLVDSDDA) {
- tempbx = 1;
- }
- temp = ((tempbx & 0xFF00) >> 8) << 3;
- temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
- SiS_SetReg1 (SiS_Part1Port, 0x20, temp); /* Part1_20h */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x21, temp); /* Part1_21h */
- tempecx = tempecx >> 16; /* BPLHCFACT */
- if (modeflag & HalfDCLK) {
- tempecx = tempecx >> 1;
- }
- temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x22, temp); /* Part1_22h */
- temp = (USHORT) (tempecx & 0x000000FF);
- SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
- /*add dstn new register */
- if (SiS_IF_DEF_DSTN) {
- SiS_SetReg1 (SiS_Part1Port, 0x1E, 0x01);
- SiS_SetReg1 (SiS_Part1Port, 0x25, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x26, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x27, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x28, 0x87);
- SiS_SetReg1 (SiS_Part1Port, 0x29, 0x5A);
- SiS_SetReg1 (SiS_Part1Port, 0x2A, 0x4B);
- SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x007, 0x03);
- tempbx = SiS_HDE; /*Blps=lcdhdee(lcdhdes+HDE) +64 */
- tempbx = tempbx + 64;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x38, temp);
- temp = ((tempbx & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR (SiS_Part1Port, 0x35, ~0x078, temp);
- tempbx = tempbx + 32; /*Blpe=lBlps+32 */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x39, temp);
- SiS_SetReg1 (SiS_Part1Port, 0x3A, 0x00); /*Bflml=0 */
- SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x007, 0x00);
- tempbx = SiS_VDE;
- tempbx = tempbx / 2;
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x3B, temp);
- temp = ((tempbx & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x038, temp);
- tempeax = SiS_HDE; /* BDxFIFOSTOP= (HDE*4)/128 */
- tempeax = tempeax * 4;
- tempebx = 128;
- temp = (USHORT) (tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if (temp != 0) {
- tempeax++;
- }
- temp = (USHORT) (tempeax & 0x0000003F);
- SiS_SetRegANDOR (SiS_Part1Port, 0x45, ~0x0FF, temp);
- SiS_SetReg1 (SiS_Part1Port, 0x3F, 0x00); /*BDxWadrst0 */
- SiS_SetReg1 (SiS_Part1Port, 0x3E, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x3D, 0x10);
- SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x040, 0x00);
- tempax = SiS_HDE;
- tempax = tempax >> 4; /*BDxWadroff = HDE*4/8/8 */
- pushcx = tempax;
- temp = tempax & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x43, temp);
- temp = ((tempax & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x0F8, temp);
- tempax = SiS_VDE; /*BDxWadrst1 = BDxWadrst0+BDxWadroff*VDE */
- tempeax = (tempax * pushcx);
- tempebx = 0x00100000 + tempeax;
- temp = (USHORT) tempebx & 0x000000FF;
- SiS_SetReg1 (SiS_Part1Port, 0x42, temp);
- temp = (USHORT) ((tempebx & 0x0000FF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x41, temp);
- temp = (USHORT) ((tempebx & 0x00FF0000) >> 16);
- SiS_SetReg1 (SiS_Part1Port, 0x40, temp);
- temp = (USHORT) ((tempebx & 0x01000000) >> 24);
- temp = temp << 7;
- SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x080, temp);
- SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x03);
- SiS_SetReg1 (SiS_Part1Port, 0x03, 0x50);
- SiS_SetReg1 (SiS_Part1Port, 0x04, 0x00);
- SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x01);
- SiS_SetReg1 (SiS_Part1Port, 0x13, 0x00);
- SiS_SetReg1 (SiS_P3c4, 0x05, 0x86);
- SiS_SetReg1 (SiS_P3c4, 0x1e, 0x62);
- SiS_SetReg1 (SiS_Part1Port, 0x19, 0x38);
- SiS_SetReg1 (SiS_Part1Port, 0x1e, 0x7d);
- }
- /*end add dstn */
- return;
- }
- /*301b*/
- void
- SiS_SetGroup1_LCDA (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
- USHORT RefreshRateTableIndex)
- {
- USHORT modeflag, resinfo;
- USHORT push1, push2, tempax, tempbx, tempcx, temp;
- ULONG tempeax = 0, tempebx, tempecx, tempvcfact; /*301b */
- SiS_SetRegOR (SiS_Part1Port, 0x2D, 0x20);
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
- resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
- tempax = SiS_LCDHDES;
- tempbx = SiS_HDE;
- tempcx = SiS_HT;
- if (SiS_LCDInfo & LCDNonExpanding) {
- if (SiS_LCDResInfo == Panel1280x1024)
- tempbx = 1280;
- if (SiS_LCDResInfo == Panel1024x768)
- tempbx = 1024;
- }
- tempcx = tempcx - tempbx; /* HT-HDE */
- push1 = tempax;
- tempax = tempax + tempbx; /* lcdhdee */
- tempbx = SiS_HT;
- if (tempax >= tempbx) {
- tempax = tempax - tempbx;
- }
- push2 = tempax;
- /* push ax lcdhdee */
- tempcx = tempcx >> 2; /* temp */
- tempcx = tempcx + tempax; /* lcdhrs */
- if (tempcx >= tempbx) {
- tempcx = tempcx - tempbx;
- }
- /* v ah,cl */
- tempax = tempcx;
- tempax = tempax >> 3; /* BPLHRS */
- temp = tempax & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x14, temp); /* Part1_14h */
- temp = (tempax & 0x00FF) + 10;
- temp = temp & 0x01F;
- temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
- SiS_SetReg1 (SiS_Part1Port, 0x15, temp); /* Part1_15h */
- tempbx = push2; /* lcdhdee */
- tempcx = push1; /* lcdhdes */
- temp = (tempcx & 0x00FF);
- temp = temp & 0x07; /* BPLHDESKEW */
- SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* Part1_1Ah */
- tempcx = tempcx >> 3; /* BPLHDES */
- temp = (tempcx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* Part1_16h */
- if (tempbx & 0x07)
- tempbx = tempbx + 8;
- tempbx = tempbx >> 3; /* BPLHDEE */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* Part1_17h */
- tempcx = SiS_VGAVT;
- tempbx = SiS_VGAVDE;
- tempcx = tempcx - tempbx; /* GAVT-VGAVDE */
- tempbx = SiS_LCDVDES; /* VGAVDES */
- push1 = tempbx; /* push bx temppush1 */
- if (SiS_IF_DEF_TRUMPION == 0) {
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & SetCRT2ToTV) {
- tempax = SiS_VGAVDE;
- }
- }
- if (SiS_LCDResInfo == Panel1024x768)
- tempax = 768;
- if (SiS_LCDResInfo == Panel1280x1024)
- tempax = 1024;
- } else
- tempax = SiS_VGAVDE;
- tempbx = tempbx + tempax;
- tempax = SiS_VT; /* VT */
- if (tempbx >= SiS_VT) {
- tempbx = tempbx - tempax;
- }
- push2 = tempbx; /* push bx temppush2 */
- tempcx = tempcx >> 1;
- tempbx = tempbx + tempcx;
- tempbx++; /* BPLVRS */
- if (tempbx >= tempax) {
- tempbx = tempbx - tempax;
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x18, temp); /* Part1_18h */
- tempcx = tempcx >> 3;
- tempcx = tempcx + tempbx;
- tempcx++; /* BPLVRE */
- temp = tempcx & 0x00FF;
- temp = temp & 0x0F;
- SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp); /* Part1_19h */
- temp = (tempbx & 0xFF00) >> 8;
- temp = temp & 0x07;
- temp = temp << 3; /* BPLDESKEW =0 */
- tempbx = SiS_VGAVDE;
- if (tempbx != SiS_VDE) {
- temp = temp | 0x40;
- }
- if (SiS_SetFlag & EnableLVDSDDA) {
- temp = temp | 0x40;
- }
- if (SiS_LCDInfo & LCDRGB18Bit) {
- temp = temp | 0x80;
- }
- SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp); /* Part1_1Ah */
- tempbx = push2; /* p bx temppush2 BPLVDEE */
- tempcx = push1; /* pop cx temppush1 NPLVDES */
- push1 = (USHORT) (tempeax & 0xFFFF);
- if (!(SiS_VBInfo & SetInSlaveMode)) {
- if (SiS_LCDResInfo == Panel800x600) {
- if (resinfo == 7)
- tempcx++;
- } else {
- if (SiS_LCDResInfo == Panel1024x768) {
- if (resinfo == 8)
- tempcx++;
- }
- }
- }
- temp = (tempbx & 0xFF00) >> 8;
- temp = temp & 0x07;
- temp = temp << 3;
- temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
- SiS_SetReg1 (SiS_Part1Port, 0x1D, temp); /* Part1_1Dh */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x1C, temp); /* Part1_1Ch */
- temp = tempcx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x1B, temp); /* Part1_1Bh */
- tempecx = SiS_VGAVT;
- tempebx = SiS_VDE;
- tempeax = SiS_VGAVDE;
- tempecx = tempecx - tempeax; /* VGAVT-VGAVDE */
- tempeax = tempeax << 18;
- temp = (USHORT) (tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if (temp != 0) {
- tempeax++;
- }
- tempebx = tempeax; /* BPLVCFACT */
- tempvcfact = tempeax; /*301b */
- temp = (USHORT) (tempebx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
- temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
- temp = (USHORT) ((tempebx & 0x00030000) >> 16);
- if (SiS_VDE == SiS_VGAVDE) {
- temp = temp | 0x04;
- }
- SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
- tempecx = SiS_VGAHDE;
- tempebx = SiS_HDE;
- tempeax = tempecx;
- tempeax = tempeax << 6;
- tempeax = tempeax << 10;
- tempeax = tempeax / tempebx;
- if (tempebx == tempecx) {
- tempeax = 65535;
- }
- tempecx = tempeax;
- tempeax = SiS_VGAHDE; /*301b to change HT->HDE */
- tempeax = tempeax << 6;
- tempeax = tempeax << 10;
- tempeax = tempeax / tempecx;
- tempecx = tempecx << 16;
- tempeax = tempeax - 1;
- tempecx = tempecx | (tempeax & 0x00FFFF);
- temp = (USHORT) (tempecx & 0x00FF);
- SiS_SetReg1 (SiS_Part1Port, 0x1F, temp); /* Part1_1Fh */
- tempeax = SiS_VGAVDE;
- tempeax = tempeax << 18; /*301b */
- tempeax = tempeax / tempvcfact;
- tempbx = (USHORT) (tempeax & 0x0FFFF);
- if (SiS_LCDResInfo == Panel1024x768)
- tempbx--;
- if (SiS_SetFlag & EnableLVDSDDA) {
- tempbx = 1;
- }
- temp = ((tempbx & 0xFF00) >> 8) << 3;
- temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
- SiS_SetReg1 (SiS_Part1Port, 0x20, temp); /* Part1_20h */
- temp = tempbx & 0x00FF;
- SiS_SetReg1 (SiS_Part1Port, 0x21, temp); /* Part1_21h */
- tempecx = tempecx >> 16; /* BPLHCFACT */
- temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x22, temp); /* Part1_22h */
- temp = (USHORT) (tempecx & 0x000000FF);
- SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
- return;
- }
- /*end 301b*/
- void
- SiS_SetTPData ()
- {
- return;
- }
- void
- SiS_SetCRT2Offset (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT offset;
- UCHAR temp;
- if (SiS_VBInfo & SetInSlaveMode) {
- return;
- }
- offset =
- SiS_GetOffset (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- HwDeviceExtension);
- temp = (UCHAR) (offset & 0xFF);
- SiS_SetReg1 (SiS_Part1Port, 0x07, temp);
- temp = (UCHAR) ((offset & 0xFF00) >> 8);
- SiS_SetReg1 (SiS_Part1Port, 0x09, temp);
- temp = (UCHAR) (((offset >> 3) & 0xFF) + 1);
- SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
- }
- USHORT
- SiS_GetOffset (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT temp, colordepth;
- USHORT modeinfo, index, infoflag;
- USHORT ColorDepth[] = { 0x01, 0x02, 0x04 };
- modeinfo = SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
- infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
- if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
- index = (modeinfo >> 4) & 0xFF;
- } else { /* 310 series */
- index = (modeinfo >> 8) & 0xFF;
- }
- temp = SiS_ScreenOffset[index];
- if (infoflag & InterlaceMode) {
- temp = temp << 1;
- }
- colordepth = SiS_GetColorDepth (ROMAddr, ModeNo, ModeIdIndex);
- if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
- temp = ModeNo - 0x7C;
- colordepth = ColorDepth[temp];
- temp = 0x6B;
- if (infoflag & InterlaceMode) {
- temp = temp << 1;
- }
- return (temp * colordepth);
- } else
- return (temp * colordepth);
- }
- USHORT
- SiS_GetColorDepth (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
- {
- USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
- SHORT index;
- USHORT modeflag;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- index = (modeflag & ModeInfoFlag) - ModeEGA;
- if (index < 0)
- index = 0;
- return (ColorDepth[index]);
- }
- void
- SiS_SetCRT2Sync (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT RefreshRateTableIndex)
- {
- USHORT tempah = 0, infoflag, flag;
- flag = 0;
- infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
- if (SiS_IF_DEF_LVDS == 1) {
- if (SiS_VBInfo & SetCRT2ToLCD) {
- tempah = SiS_LCDInfo;
- if (tempah & LCDSync) {
- flag = 1;
- }
- }
- }
- if (flag != 1)
- tempah = infoflag >> 8;
- tempah = tempah & 0xC0;
- tempah = tempah | 0x20;
- if (!(SiS_LCDInfo & LCDRGB18Bit))
- tempah = tempah | 0x10;
- if (SiS_IF_DEF_CH7005 == 1)
- tempah = tempah | 0xC0;
- SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0x3F, tempah);
- }
- void
- SiS_SetCRT2FIFO (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT temp, index;
- USHORT modeidindex, refreshratetableindex;
- USHORT VCLK, MCLK, colorth = 0, data, data2;
- ULONG eax;
- UCHAR LatencyFactor[] = { 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */
- 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */
- 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */
- 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */
- 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */
- 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */
- 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */
- 00, 68, 66, 59, 57, 37
- }; /*; 128 bit BQ=1 */
- SiS_SearchModeID (ROMAddr, ModeNo, &modeidindex);
- SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
- SiS_SelectCRT2Rate = 0;
- refreshratetableindex = SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, modeidindex); /* 11.GetRatePtr */
- if (ModeNo >= 0x13) {
- index = SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
- index = index & 0x3F;
- VCLK = SiS_VCLKData[index].CLOCK; /* Get VCLK */
- index = SiS_GetReg1 (SiS_P3c4, 0x1A);
- index = index & 07;
- MCLK = SiS_MCLKData[index].CLOCK; /* Get MCLK */
- data2 = SiS_ModeType - 0x02;
- switch (data2) {
- case 0:
- colorth = 1;
- break;
- case 1:
- colorth = 1;
- break;
- case 2:
- colorth = 2;
- break;
- case 3:
- colorth = 2;
- break;
- case 4:
- colorth = 3;
- break;
- case 5:
- colorth = 4;
- break;
- }
- data2 = (data2 * VCLK) / MCLK; /* bx */
- temp = SiS_GetReg1 (SiS_P3c4, 0x14);
- temp = ((temp & 0x00FF) >> 6) << 1;
- if (temp == 0)
- temp = 1;
- temp = temp << 2;
- data2 = temp - data2;
- if (data2 % (28 * 16)) {
- data2 = data2 / (28 * 16);
- data2++;
- } else {
- data2 = data2 / (28 * 16);
- }
- index = 0;
- temp = SiS_GetReg1 (SiS_P3c4, 0x14);
- if (temp & 0x0080)
- index = index + 12;
- SiS_SetReg4 (0xcf8, 0x800000A0);
- eax = SiS_GetReg3 (0xcfc);
- temp = (USHORT) (eax >> 24);
- if (!(temp & 0x01))
- index = index + 24;
- SiS_SetReg4 (0xcf8, 0x80000050);
- eax = SiS_GetReg3 (0xcfc);
- temp = (USHORT) (eax >> 24);
- if (temp & 0x01)
- index = index + 6;
- temp = (temp & 0x0F) >> 1;
- index = index + temp;
- data = LatencyFactor[index];
- data = data + 15;
- temp = SiS_GetReg1 (SiS_P3c4, 0x14);
- if (!(temp & 0x80))
- data = data + 5;
- data = data + data2;
- SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
- data = data * VCLK * colorth;
- if (data % (MCLK << 4)) {
- data = data / (MCLK << 4);
- data++;
- } else {
- data = data / (MCLK << 4);
- }
- temp = 0x16;
- /* Revision ID */
- temp = 0x13;
- /* Revision ID */
- SiS_SetRegANDOR (SiS_Part1Port, 0x01, ~0x01F, temp);
- SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x01F, temp);
- }
- }
- void
- SiS_SetCRT2FIFO2 (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- #ifdef CONFIG_FB_SIS_315
- UCHAR CombCode[] = { 1, 1, 1, 4, 3, 1, 3, 4, 4, 1, 4, 4, 5, 1, 5, 4 };
- UCHAR CRT2ThLow[] =
- { 39, 63, 55, 79, 78, 102, 90, 114, 55, 87, 84, 116, 103, 135, 119,
- 151 };
- #endif
- USHORT temp, temp1, temp2, temp3;
- USHORT index;
- USHORT CRT1ModeNo, CRT2ModeNo;
- USHORT ModeIdIndex;
- USHORT RefreshRateTableIndex;
- SiS_SetReg1 (SiS_Part1Port, 0x1, 0x3B);
- /* CRT1ModeNo=(UCHAR)SiS_GetReg1(SiS_P3d4,0x34); *//* get CRT1 ModeNo */
- CRT1ModeNo = SiS_CRT1Mode;
- /* CRT1ModeNo =ModeNo; */
- SiS_SearchModeID (ROMAddr, CRT1ModeNo, &ModeIdIndex); /* Get ModeID Table */
- SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
- RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex); /* Set REFIndex-> for crt1 refreshrate */
- index =
- SiS_GetVCLK2Ptr (ROMAddr, CRT1ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- temp1 = SiS_VCLKData[index].CLOCK; /* Get VCLK */
- temp2 = SiS_GetColorDepth (ROMAddr, CRT1ModeNo, ModeIdIndex);
- #ifdef CONFIG_FB_SIS_315
- index = SiS_Get310DRAMType (ROMAddr);
- #endif
- temp3 = SiS_MCLKData[index].CLOCK; /* Get MCLK */
- temp = SiS_GetReg1 (SiS_P3c4, 0x14);
- if (temp & 0x02)
- temp = 16;
- else
- temp = 8;
- temp = temp - temp1 * temp2 / temp3; /* 16-DRamBus - DCLK*BytePerPixel/MCLK */
- if ((52 * 16 % temp) == 0)
- temp = 52 * 16 / temp + 40;
- else
- temp = 52 * 16 / temp + 40 + 1;
- /* get DRAM latency */
- temp1 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 3) & 0x7; /* SR17[5:3] DRAM Queue depth */
- temp2 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 6) & 0x3; /* SR17[7:6] DRAM Grant length */
- #ifdef CONFIG_FB_SIS_315
- if (SiS_Get310DRAMType (ROMAddr) < 2) {
- for (temp3 = 0; temp3 < 16; temp3 += 2) {
- if ((CombCode[temp3] == temp1)
- && (CombCode[temp3 + 1] == temp2)) {
- temp3 = CRT2ThLow[temp3 >> 1];
- }
- }
- } else {
- for (temp3 = 0; temp3 < 16; temp3 += 2) {
- if ((CombCode[temp3] == temp1)
- && (CombCode[temp3 + 1] == temp2)) {
- temp3 = CRT2ThLow[8 + (temp3 >> 1)];
- }
- }
- }
- #endif
- temp += temp3; /* CRT1 Request Period */
- CRT2ModeNo = ModeNo; /* get CRT2 ModeNo */
- SiS_SearchModeID (ROMAddr, CRT2ModeNo, &ModeIdIndex); /* Get ModeID Table */
- SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
- RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex); /* Set REFIndex-> for crt1 refreshrate */
- index =
- SiS_GetVCLK2Ptr (ROMAddr, CRT2ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwDeviceExtension);
- temp1 = SiS_VCLKData[index].CLOCK; /* Get VCLK */
- temp2 = SiS_GetColorDepth (ROMAddr, CRT2ModeNo, ModeIdIndex);
- #ifdef CONFIG_FB_SIS_315
- index = SiS_Get310DRAMType (ROMAddr);
- #endif
- temp3 = SiS_MCLKData[index].CLOCK; /* Get MCLK */
- if ((temp * temp1 * temp2) % (16 * temp3) == 0)
- temp = temp * temp1 * temp2 / (16 * temp3); /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
- else
- temp = temp * temp1 * temp2 / (16 * temp3) + 1; /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
- if (temp > 0x37)
- temp = 0x37;
- SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x3F, temp);
- }
- void
- SiS_GetLVDSDesData (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex)
- {
- USHORT modeflag;
- USHORT PanelIndex, ResIndex;
- SiS_LVDSDesStruct *PanelDesPtr = NULL;
- if ((SiS_IF_DEF_LVDS == 0)
- && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) { /*301b *//*for test */
- SiS_GetLVDSDesPtrA (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &PanelIndex,
- &ResIndex);
- switch (PanelIndex) {
- case 0:
- PanelDesPtr = LVDS1024x768Des_1;
- break;
- case 1:
- PanelDesPtr = LVDS1280x1024Des_1;
- break;
- case 2:
- PanelDesPtr = LVDS1280x960Des_1;
- break;
- case 3:
- PanelDesPtr = LVDS1024x768Des_2;
- break;
- case 4:
- PanelDesPtr = LVDS1280x1024Des_2;
- break;
- case 5:
- PanelDesPtr = LVDS1280x960Des_2;
- break;
- }
- } else {
- SiS_GetLVDSDesPtr (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &PanelIndex,
- &ResIndex);
- switch (PanelIndex) {
- case 0:
- PanelDesPtr = SiS_PanelType00_1;
- break;
- case 1:
- PanelDesPtr = SiS_PanelType01_1;
- break;
- case 2:
- PanelDesPtr = SiS_PanelType02_1;
- break;
- case 3:
- PanelDesPtr = SiS_PanelType03_1;
- break;
- case 4:
- PanelDesPtr = SiS_PanelType04_1;
- break;
- case 5:
- PanelDesPtr = SiS_PanelType05_1;
- break;
- case 6:
- PanelDesPtr = SiS_PanelType06_1;
- break;
- case 7:
- PanelDesPtr = SiS_PanelType07_1;
- break;
- case 8:
- PanelDesPtr = SiS_PanelType08_1;
- break;
- case 9:
- PanelDesPtr = SiS_PanelType09_1;
- break;
- case 10:
- PanelDesPtr = SiS_PanelType0a_1;
- break;
- case 11:
- PanelDesPtr = SiS_PanelType0b_1;
- break;
- case 12:
- PanelDesPtr = SiS_PanelType0c_1;
- break;
- case 13:
- PanelDesPtr = SiS_PanelType0d_1;
- break;
- case 14:
- PanelDesPtr = SiS_PanelType0e_1;
- break;
- case 15:
- PanelDesPtr = SiS_PanelType0f_1;
- break;
- case 16:
- PanelDesPtr = SiS_PanelType00_2;
- break;
- case 17:
- PanelDesPtr = SiS_PanelType01_2;
- break;
- case 18:
- PanelDesPtr = SiS_PanelType02_2;
- break;
- case 19:
- PanelDesPtr = SiS_PanelType03_2;
- break;
- case 20:
- PanelDesPtr = SiS_PanelType04_2;
- break;
- case 21:
- PanelDesPtr = SiS_PanelType05_2;
- break;
- case 22:
- PanelDesPtr = SiS_PanelType06_2;
- break;
- case 23:
- PanelDesPtr = SiS_PanelType07_2;
- break;
- case 24:
- PanelDesPtr = SiS_PanelType08_2;
- break;
- case 25:
- PanelDesPtr = SiS_PanelType09_2;
- break;
- case 26:
- PanelDesPtr = SiS_PanelType0a_2;
- break;
- case 27:
- PanelDesPtr = SiS_PanelType0b_2;
- break;
- case 28:
- PanelDesPtr = SiS_PanelType0c_2;
- break;
- case 29:
- PanelDesPtr = SiS_PanelType0d_2;
- break;
- case 30:
- PanelDesPtr = SiS_PanelType0e_2;
- break;
- case 31:
- PanelDesPtr = SiS_PanelType0f_2;
- break;
- case 32:
- PanelDesPtr = SiS_CHTVUNTSCDesData;
- break;
- case 33:
- PanelDesPtr = SiS_CHTVONTSCDesData;
- break;
- case 34:
- PanelDesPtr = SiS_CHTVUPALDesData;
- break;
- case 35:
- PanelDesPtr = SiS_CHTVOPALDesData;
- break;
- }
- }
- SiS_LCDHDES = (PanelDesPtr + ResIndex)->LCDHDES;
- SiS_LCDVDES = (PanelDesPtr + ResIndex)->LCDVDES;
- if (SiS_LCDInfo & LCDNonExpanding) {
- if (SiS_LCDResInfo >= Panel1024x768) {
- if (ModeNo <= 0x13) {
- modeflag =
- SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- if (!(modeflag & HalfDCLK)) {
- SiS_LCDHDES = 320;
- }
- }
- }
- }
- return;
- }
- void
- SiS_GetLVDSDesPtr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT * PanelIndex,
- USHORT * ResIndex)
- {
- USHORT tempbx, tempal;
- tempbx = 0;
- if (SiS_IF_DEF_CH7005 == 1) {
- if (!(SiS_VBInfo & SetCRT2ToLCD)) {
- tempbx = 32;
- if (SiS_VBInfo & SetPALTV)
- tempbx = tempbx + 2;
- if (SiS_VBInfo & SetCHTVOverScan)
- tempbx = tempbx + 1;
- }
- }
- if (SiS_VBInfo & SetCRT2ToLCD) {
- tempbx = SiS_LCDTypeInfo;
- if (SiS_LCDInfo & LCDNonExpanding) {
- tempbx = tempbx + 16;
- }
- }
- if (ModeNo <= 0x13) {
- tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
- tempal = tempal & 0x1F;
- *PanelIndex = tempbx;
- *ResIndex = tempal;
- }
- /*301b*/
- void
- SiS_GetLVDSDesPtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT * PanelIndex,
- USHORT * ResIndex)
- {
- USHORT tempbx, tempal;
- tempbx = 0;
- tempbx = SiS_LCDResInfo;
- tempbx = tempbx - Panel1024x768;
- if (SiS_LCDInfo & LCDNonExpanding) {
- tempbx = tempbx + 3;
- }
- if (ModeNo <= 0x13) {
- tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
- tempal = tempal & 0x1F;
- *PanelIndex = tempbx;
- *ResIndex = tempal;
- }
- /*end 301b*/
- void
- SiS_SetCRT2ModeRegs (USHORT BaseAddr, USHORT ModeNo,
- PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT i, j;
- USHORT tempcl, tempah;
- /*301b*/
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- SiS_SetRegANDOR (SiS_Part1Port, 0x00, ~0x050, 0x40);
- SiS_SetRegAND (SiS_Part1Port, 0x2E, 0xF7);
- SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x04);
- SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x30);
- SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0xC0);
- SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0x7F, 0x00);
- }
- /*end 301b */
- else {
- for (i = 0, j = 4; i < 3; i++, j++)
- SiS_SetReg1 (SiS_Part1Port, j, 0);
- tempcl = SiS_ModeType;
- if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
- if (ModeNo > 0x13) {
- tempcl = tempcl - ModeVGA;
- if ((tempcl > 0) || (tempcl == 0)) {
- tempah = ((0x010 >> tempcl) | 0x080);
- }
- } else {
- tempah = 0x080;
- }
- if (SiS_VBInfo & SetInSlaveMode) {
- tempah = (tempah ^ 0x0A0);
- }
- } else { /* 310 series */
- if (ModeNo > 0x13) {
- tempcl = tempcl - ModeVGA;
- if ((tempcl > 0) || (tempcl == 0)) {
- tempah = (0x008 >> tempcl);
- if (tempah == 0)
- tempah = 1;
- tempah |= 0x040;
- }
- } else {
- tempah = 0x040;
- }
- if (SiS_VBInfo & SetInSlaveMode) {
- tempah = (tempah ^ 0x050);
- }
- }
- if (SiS_VBInfo & CRT2DisplayFlag) {
- tempah = 0;
- }
- SiS_SetReg1 (SiS_Part1Port, 0x00, tempah);
- if (SiS_IF_DEF_LVDS == 0) { /* ifdef 301 */
- tempah = 0x01;
- if (!(SiS_VBInfo & SetInSlaveMode)) {
- tempah = (tempah | 0x02);
- }
- if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
- tempah = (tempah ^ 0x05);
- if (!(SiS_VBInfo & SetCRT2ToLCD)) {
- tempah = (tempah ^ 0x01);
- }
- }
- tempcl = tempah; /* 05/03/01 ynlai for TV display bug */
- if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
- tempah = (tempah << 5) & 0xFF;
- if (SiS_VBInfo & CRT2DisplayFlag) {
- tempah = 0;
- }
- SiS_SetReg1 (SiS_Part1Port, 0x01, tempah);
- tempah = tempah >> 5;
- } else { /* 310 series */
- if (SiS_VBInfo & CRT2DisplayFlag) {
- tempah = 0;
- }
- tempah =
- (SiS_GetReg1 (SiS_Part1Port, 0x2E) & 0xF8) |
- tempah;
- SiS_SetReg1 (SiS_Part1Port, 0x2E, tempah);
- tempah = tempcl;
- }
- if ((SiS_ModeType == ModeVGA)
- && (!(SiS_VBInfo & SetInSlaveMode))) {
- tempah = tempah | 0x010;
- }
- if (SiS_LCDResInfo == Panel1024x768)
- tempah = tempah | 0x080;
- if ((SiS_LCDResInfo == Panel1280x1024)
- || (SiS_LCDResInfo == Panel1280x960)) {
- tempah = tempah | 0x080;
- }
- if (SiS_VBInfo & SetCRT2ToTV) {
- if (SiS_VBInfo & SetInSlaveMode) {
- if (
- ((SiS_VBType & VB_SIS301B)
- || (SiS_VBType & VB_SIS302B))) { /*301b */
- if (SiS_SetFlag & TVSimuMode)
- tempah = tempah | 0x020;
- } else
- tempah = tempah | 0x020;
- }
- }
- SiS_SetRegANDOR (SiS_Part4Port, 0x0D, ~0x0BF, tempah);
- tempah = 0;
- if (SiS_VBInfo & SetCRT2ToTV) {
- if (SiS_VBInfo & SetInSlaveMode) {
- if (
- ((SiS_VBType & VB_SIS301B)
- || (SiS_VBType & VB_SIS302B))) { /*301b */
- {
- SiS_SetFlag =
- SiS_SetFlag |
- RPLLDIV2XO;
- tempah = tempah | 0x40;
- }
- } else {
- if (!(SiS_SetFlag & TVSimuMode)) {
- if (!
- (SiS_VBInfo &
- SetCRT2ToHiVisionTV))
- {
- SiS_SetFlag =
- SiS_SetFlag
- |
- RPLLDIV2XO;
- tempah =
- tempah |
- 0x40;
- }
- }
- }
- } else {
- SiS_SetFlag = SiS_SetFlag | RPLLDIV2XO;
- tempah = tempah | 0x40;
- }
- }
- if (SiS_LCDResInfo == Panel1280x1024)
- tempah = tempah | 0x80;
- if (SiS_LCDResInfo == Panel1280x960)
- tempah = tempah | 0x80;
- SiS_SetReg1 (SiS_Part4Port, 0x0C, tempah);
- } else {
- /*LVDS*/ tempah = 0;
- if (!(SiS_VBInfo & SetInSlaveMode)) {
- tempah = tempah | 0x02;
- }
- SiS_SetRegANDOR (SiS_Part1Port, 0x2e, 0xF0, tempah);
- }
- }
- /*301b*/
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
- if (SiS_IsDualEdge (BaseAddr))
- SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x00);
- else
- SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFF, 0x00);
- if (SiS_IsDualEdge (BaseAddr))
- SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x00);
- else
- SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xFF, 0x00);
- if (SiS_IsDualEdge (BaseAddr))
- SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0x00);
- else
- SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0xFF, 0x00);
- if (SiS_IsDualEdge (BaseAddr))
- SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x80);
- else
- SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x00);
- }
- /*end 301b*/
- }
- void
- SiS_GetCRT2Data (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex)
- {
- if (SiS_IF_DEF_LVDS == 0) { /*301 */
- if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
- if (SiS_VBInfo & SetCRT2ToLCDA)
- SiS_GetCRT2DataLVDS (ROMAddr, ModeNo,
- ModeIdIndex,
- RefreshRateTableIndex);
- else
- SiS_GetCRT2Data301 (ROMAddr, ModeNo,
- ModeIdIndex,
- RefreshRateTableIndex);
- } else
- SiS_GetCRT2Data301 (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- return;
- } else { /*LVDS */
- SiS_GetCRT2DataLVDS (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- return;
- }
- }
- void
- SiS_GetCRT2DataLVDS (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex)
- {
- USHORT tempax, tempbx;
- USHORT CRT2Index, ResIndex;
- SiS_LVDSDataStruct *LVDSData = NULL;
- SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- SiS_GetCRT2PtrA (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &CRT2Index, &ResIndex);
- switch (CRT2Index) {
- case 0:
- LVDSData = SiS_LVDS1024x768Data_1;
- break;
- case 1:
- LVDSData = SiS_LVDS1280x1024Data_1;
- break;
- case 2:
- LVDSData = SiS_LVDS1280x1024Data_1;
- break;
- /* case 2: LVDSData=SiS_LVDS1280x960Data_1; break; */
- case 3:
- LVDSData = SiS_LVDS1024x768Data_2;
- break;
- case 4:
- LVDSData = SiS_LVDS1280x1024Data_2;
- break;
- case 5:
- LVDSData = SiS_LVDS1280x1024Data_2;
- break;
- /* case 5: LVDSData=SiS_LVDS1280x960Data_2; break; */
- }
- }
- else {
- SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &CRT2Index, &ResIndex);
- switch (CRT2Index) {
- case 0:
- LVDSData = SiS_LVDS800x600Data_1;
- break;
- case 1:
- LVDSData = SiS_LVDS1024x768Data_1;
- break;
- case 2:
- LVDSData = SiS_LVDS1280x1024Data_1;
- break;
- case 3:
- LVDSData = SiS_LVDS800x600Data_2;
- break;
- case 4:
- LVDSData = SiS_LVDS1024x768Data_2;
- break;
- case 5:
- LVDSData = SiS_LVDS1280x1024Data_2;
- break;
- case 6:
- LVDSData = SiS_LVDS640x480Data_1;
- break;
- case 7:
- LVDSData = SiS_CHTVUNTSCData;
- break;
- case 8:
- LVDSData = SiS_CHTVONTSCData;
- break;
- case 9:
- LVDSData = SiS_CHTVUPALData;
- break;
- case 10:
- LVDSData = SiS_CHTVOPALData;
- break;
- }
- }
- SiS_VGAHT = (LVDSData + ResIndex)->VGAHT;
- SiS_VGAVT = (LVDSData + ResIndex)->VGAVT;
- SiS_HT = (LVDSData + ResIndex)->LCDHT;
- SiS_VT = (LVDSData + ResIndex)->LCDVT;
- /*301b*/
- if ((SiS_IF_DEF_LVDS == 0)
- && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) { /*for test */
- if (!(SiS_LCDInfo & LCDNonExpanding)) {
- if (SiS_LCDResInfo == Panel1024x768) {
- tempax = 1024;
- tempbx = 768;
- } else {
- tempax = 1280;
- tempbx = 1024;
- }
- SiS_HDE = tempax;
- SiS_VDE = tempbx;
- }
- } else {
- if (SiS_IF_DEF_TRUMPION == 0) {
- if (SiS_VBInfo & SetCRT2ToLCD) {
- if (!(SiS_LCDInfo & LCDNonExpanding)) {
- if (SiS_LCDResInfo == Panel800x600) {
- tempax = 800;
- tempbx = 600;
- } else if (SiS_LCDResInfo ==
- Panel1024x768) {
- tempax = 1024;
- tempbx = 768;
- } else {
- tempax = 1280;
- tempbx = 1024;
- }
- SiS_HDE = tempax;
- SiS_VDE = tempbx;
- }
- }
- }
- }
- return;
- }
- void
- SiS_GetCRT2Data301 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex)
- {
- USHORT tempax, tempbx, modeflag;
- USHORT resinfo;
- USHORT CRT2Index, ResIndex;
- SiS_LCDDataStruct *LCDPtr = NULL;
- SiS_TVDataStruct *TVPtr = NULL;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
- resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
- SiS_NewFlickerMode = 0;
- SiS_RVBHRS = 50;
- SiS_RY1COE = 0;
- SiS_RY2COE = 0;
- SiS_RY3COE = 0;
- SiS_RY4COE = 0;
- SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- SiS_GetRAMDAC2DATA (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex);
- return;
- }
- if (SiS_VBInfo & SetCRT2ToTV) {
- SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &CRT2Index, &ResIndex);
- switch (CRT2Index) {
- case 2:
- TVPtr = SiS_ExtHiTVData;
- break;
- case 3:
- TVPtr = SiS_ExtPALData;
- break;
- case 4:
- TVPtr = SiS_ExtNTSCData;
- break;
- case 7:
- TVPtr = SiS_St1HiTVData;
- break;
- case 8:
- TVPtr = SiS_StPALData;
- break;
- case 9:
- TVPtr = SiS_StNTSCData;
- break;
- case 12:
- TVPtr = SiS_St2HiTVData;
- break;
- }
- SiS_RVBHCMAX = (TVPtr + ResIndex)->RVBHCMAX;
- SiS_RVBHCFACT = (TVPtr + ResIndex)->RVBHCFACT;
- SiS_VGAHT = (TVPtr + ResIndex)->VGAHT;
- SiS_VGAVT = (TVPtr + ResIndex)->VGAVT;
- SiS_HDE = (TVPtr + ResIndex)->TVHDE;
- SiS_VDE = (TVPtr + ResIndex)->TVVDE;
- SiS_RVBHRS = (TVPtr + ResIndex)->RVBHRS;
- SiS_NewFlickerMode = (TVPtr + ResIndex)->FlickerMode;
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- if (resinfo == 0x08)
- SiS_NewFlickerMode = 0x40;
- if (resinfo == 0x09)
- SiS_NewFlickerMode = 0x40;
- if (resinfo == 0x10)
- SiS_NewFlickerMode = 0x40;
- }
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
- if (SiS_VGAVDE == 350)
- SiS_SetFlag = SiS_SetFlag | TVSimuMode;
- tempax = ExtHiTVHT;
- tempbx = ExtHiTVVT;
- if (SiS_VBInfo & SetInSlaveMode) {
- if (SiS_SetFlag & TVSimuMode) {
- tempax = StHiTVHT;
- tempbx = StHiTVVT;
- if (!(modeflag & Charx8Dot)) {
- tempax = StHiTextTVHT;
- tempbx = StHiTextTVVT;
- }
- }
- }
- }
- if (!(SiS_VBInfo & SetCRT2ToHiVisionTV)) {
- SiS_RY1COE = (TVPtr + ResIndex)->RY1COE;
- SiS_RY2COE = (TVPtr + ResIndex)->RY2COE;
- if (modeflag & HalfDCLK) {
- SiS_RY1COE = 0x00;
- SiS_RY2COE = 0xf4;
- }
- SiS_RY3COE = (TVPtr + ResIndex)->RY3COE;
- SiS_RY4COE = (TVPtr + ResIndex)->RY4COE;
- if (modeflag & HalfDCLK) {
- SiS_RY3COE = 0x10;
- SiS_RY4COE = 0x38;
- }
- if (!(SiS_VBInfo & SetPALTV)) {
- tempax = NTSCHT;
- tempbx = NTSCVT;
- } else {
- tempax = PALHT;
- tempbx = PALVT;
- }
- }
- SiS_HT = tempax;
- SiS_VT = tempbx;
- return;
- }
- if (SiS_VBInfo & SetCRT2ToLCD) {
- SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &CRT2Index, &ResIndex);
- switch (CRT2Index) {
- case 0:
- LCDPtr = SiS_ExtLCD1024x768Data;
- break;
- case 1:
- LCDPtr = SiS_ExtLCD1280x1024Data;
- break;
- case 5:
- LCDPtr = SiS_StLCD1024x768Data;
- break;
- case 6:
- LCDPtr = SiS_StLCD1280x1024Data;
- break;
- case 10:
- LCDPtr = SiS_St2LCD1024x768Data;
- break;
- case 11:
- LCDPtr = SiS_St2LCD1280x1024Data;
- break;
- case 13:
- LCDPtr = SiS_NoScaleData;
- break;
- case 14:
- LCDPtr = SiS_LCD1280x960Data;
- break;
- }
- SiS_RVBHCMAX = (LCDPtr + ResIndex)->RVBHCMAX;
- SiS_RVBHCFACT = (LCDPtr + ResIndex)->RVBHCFACT;
- SiS_VGAHT = (LCDPtr + ResIndex)->VGAHT;
- SiS_VGAVT = (LCDPtr + ResIndex)->VGAVT;
- SiS_HT = (LCDPtr + ResIndex)->LCDHT;
- SiS_VT = (LCDPtr + ResIndex)->LCDVT;
- tempax = 1024;
- if (SiS_SetFlag & LCDVESATiming) {
- if (SiS_VGAVDE == 350)
- tempbx = 560;
- else if (SiS_VGAVDE == 400)
- tempbx = 640;
- else
- tempbx = 768;
- } else {
- if (SiS_VGAVDE == 357)
- tempbx = 527;
- else if (SiS_VGAVDE == 420)
- tempbx = 620;
- else if (SiS_VGAVDE == 525)
- tempbx = 775;
- else if (SiS_VGAVDE == 600)
- tempbx = 775;
- else if (SiS_VGAVDE == 350)
- tempbx = 560;
- else if (SiS_VGAVDE == 400)
- tempbx = 640;
- else
- tempbx = 768;
- }
- if (SiS_LCDResInfo == Panel1280x1024) {
- tempax = 1280;
- if (SiS_VGAVDE == 360)
- tempbx = 768;
- else if (SiS_VGAVDE == 375)
- tempbx = 800;
- else if (SiS_VGAVDE == 405)
- tempbx = 864;
- else
- tempbx = 1024;
- }
- if (SiS_LCDResInfo == Panel1280x960) {
- tempax = 1280;
- if (SiS_VGAVDE == 350)
- tempbx = 700;
- else if (SiS_VGAVDE == 400)
- tempbx = 800;
- else if (SiS_VGAVDE == 1024)
- tempbx = 960;
- else
- tempbx = 960;
- }
- if (SiS_LCDInfo & LCDNonExpanding) {
- tempax = SiS_VGAHDE;
- tempbx = SiS_VGAVDE;
- }
- SiS_HDE = tempax;
- SiS_VDE = tempbx;
- return;
- }
- }
- USHORT
- SiS_GetResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
- {
- USHORT resindex;
- if (ModeNo <= 0x13) {
- resindex = SiS_SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
- } else {
- resindex = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
- }
- return (resindex);
- }
- void
- SiS_GetCRT2ResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
- {
- USHORT xres, yres, modeflag, resindex;
- resindex = SiS_GetResInfo (ROMAddr, ModeNo, ModeIdIndex);
- if (ModeNo <= 0x13) {
- xres = SiS_StResInfo[resindex].HTotal;
- yres = SiS_StResInfo[resindex].VTotal;
- } else {
- xres = SiS_ModeResInfo[resindex].HTotal; /* xres->ax */
- yres = SiS_ModeResInfo[resindex].VTotal; /* yres->bx */
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
- if (modeflag & HalfDCLK) {
- xres = xres * 2;
- }
- if (modeflag & DoubleScanMode) {
- yres = yres * 2;
- }
- }
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_LCDResInfo == Panel1280x1024) {
- if (yres == 400)
- yres = 405;
- if (yres == 350)
- yres = 360;
- if (SiS_SetFlag & LCDVESATiming) {
- if (yres == 360)
- yres = 375;
- }
- }
- if (SiS_LCDResInfo == Panel1024x768) {
- if (!(SiS_SetFlag & LCDVESATiming)) {
- if (!(SiS_LCDInfo & LCDNonExpanding)) {
- if (yres == 350)
- yres = 357;
- if (yres == 400)
- yres = 420;
- /* if(!OldBios) */
- if (yres == 480)
- yres = 525;
- }
- }
- }
- } else {
- if (xres == 720)
- xres = 640;
- }
- SiS_VGAHDE = xres;
- SiS_HDE = xres;
- SiS_VGAVDE = yres;
- SiS_VDE = yres;
- }
- void
- SiS_GetCRT2Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT * CRT2Index,
- USHORT * ResIndex)
- {
- USHORT tempbx, tempal;
- USHORT Flag;
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
- tempbx = SiS_LCDResInfo;
- tempbx = tempbx - Panel1024x768;
- if (!(SiS_SetFlag & LCDVESATiming)) {
- tempbx += 5;
- /* GetRevisionID(); */
- tempbx += 5;
- }
- } else {
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) { /* TV */
- if (SiS_VGAVDE > 480)
- SiS_SetFlag =
- SiS_SetFlag & (!TVSimuMode);
- tempbx = 2;
- if (SiS_VBInfo & SetInSlaveMode) {
- if (!(SiS_SetFlag & TVSimuMode))
- tempbx = 10;
- }
- } else {
- if (SiS_VBInfo & SetPALTV) {
- tempbx = 3;
- } else {
- tempbx = 4;
- }
- if (SiS_SetFlag & TVSimuMode) {
- tempbx = tempbx + 5;
- }
- }
- }
- if (ModeNo <= 0x13) {
- tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal =
- SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
- tempal = tempal & 0x3F;
- /*301b */
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToTV)) {
- /*look */
- if (tempal == 0x06)
- tempal = 0x07;
- }
- /*end 301b */
- if ((0x31 <= ModeNo) && (ModeNo <= 0x35))
- tempal = 6;
- if (SiS_LCDInfo & LCDNonExpanding)
- tempbx = 0x0D;
- if (SiS_LCDResInfo == Panel1280x960)
- tempbx = 0x0E;
- *CRT2Index = tempbx;
- *ResIndex = tempal;
- } else { /* LVDS */
- Flag = 1;
- tempbx = 0;
- if (SiS_IF_DEF_CH7005 == 1) {
- if (!(SiS_VBInfo & SetCRT2ToLCD)) {
- Flag = 0;
- tempbx = 7;
- if (SiS_VBInfo & SetPALTV)
- tempbx = tempbx + 2;
- if (SiS_VBInfo & SetCHTVOverScan)
- tempbx = tempbx + 1;
- }
- }
- if (Flag == 1) {
- tempbx = SiS_LCDResInfo - Panel800x600;
- if (SiS_LCDInfo & LCDNonExpanding) {
- tempbx = tempbx + 3;
- }
- }
- if (ModeNo <= 0x13) {
- tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal =
- SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
- tempal = tempal & 0x1F;
- *CRT2Index = tempbx;
- *ResIndex = tempal;
- }
- }
- void
- SiS_GetCRT2PtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT * CRT2Index,
- USHORT * ResIndex)
- {
- USHORT tempbx, tempal;
- tempbx = SiS_LCDResInfo - Panel1024x768;
- if (SiS_LCDInfo & LCDNonExpanding) {
- tempbx = tempbx + 3;
- }
- if (ModeNo <= 0x13) {
- tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
- tempal = tempal & 0x1F;
- *CRT2Index = tempbx;
- *ResIndex = tempal;
- }
- /*end 301b*/
- USHORT
- SiS_GetRatePtrCRT2 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
- {
- SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 };
- SHORT LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01 };
- USHORT RefreshRateTableIndex, i;
- USHORT modeflag, index, temp;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & SetCRT2ToTV) {
- if (modeflag & HalfDCLK)
- return (0);
- }
- }
- if (ModeNo < 0x14)
- return (0xFFFF);
- index = SiS_GetReg1 (SiS_P3d4, 0x33);
- index = index >> SiS_SelectCRT2Rate;
- index = index & 0x0F;
- if (SiS_LCDInfo & LCDNonExpanding)
- index = 0;
- if (index > 0)
- index--;
- if (SiS_SetFlag & ProgrammingCRT2) {
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & SetCRT2ToTV) {
- index = 0;
- }
- }
- if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if (SiS_IF_DEF_LVDS == 0) {
- if ((SiS_VBType & VB_SIS301B)
- || (SiS_VBType & VB_SIS302B)) temp =
- LCDARefreshIndex[SiS_LCDResInfo]; /*301b */
- else
- temp = LCDRefreshIndex[SiS_LCDResInfo];
- if (index > temp) {
- index = temp;
- }
- } else {
- index = 0;
- }
- }
- }
- RefreshRateTableIndex = SiS_EModeIDTable[ModeIdIndex].REFindex;
- ModeNo = SiS_RefIndex[RefreshRateTableIndex].ModeID;
- i = 0;
- do {
- if (SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo)
- break;
- temp = SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
- temp = temp & ModeInfoFlag;
- if (temp < SiS_ModeType)
- break;
- i++;
- index--;
- } while (index != 0xFFFF);
- if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
- if (SiS_VBInfo & SetInSlaveMode) {
- temp =
- SiS_RefIndex[RefreshRateTableIndex + i -
- 1].Ext_InfoFlag;
- if (temp & InterlaceMode) {
- i++;
- }
- }
- }
- i--;
- if ((SiS_SetFlag & ProgrammingCRT2)) {
- temp =
- SiS_AjustCRT2Rate (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &i);
- }
- return (RefreshRateTableIndex + i); /*return(0x01|(temp1<<1)); */
- }
- BOOLEAN
- SiS_AjustCRT2Rate (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT * i)
- {
- USHORT tempax, tempbx, resinfo;
- USHORT modeflag, infoflag;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- tempbx = SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
- tempax = 0;
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_VBInfo & SetCRT2ToRAMDAC) {
- tempax = tempax | SupportRAMDAC2;
- }
- if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b */
- tempax = tempax | SupportLCD;
- if (SiS_LCDResInfo != Panel1280x1024) {
- if (SiS_LCDResInfo != Panel1280x960) {
- if (SiS_LCDInfo & LCDNonExpanding) {
- if (resinfo >= 9) {
- tempax = 0;
- return (0);
- }
- }
- }
- }
- }
- if (SiS_VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
- tempax = tempax | SupportHiVisionTV;
- if (SiS_VBInfo & SetInSlaveMode) {
- if (resinfo == 4)
- return (0);
- if (resinfo == 3) {
- if (SiS_SetFlag & TVSimuMode)
- return (0);
- }
- if (resinfo > 7)
- return (0);
- }
- } else {
- if (SiS_VBInfo &
- (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO |
- SetCRT2ToSCART)) {
- tempax = tempax | SupportTV;
- /*301b */
- if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) { /*301b */
- tempax = tempax | SupportTV1024;
- }
- /*end 301b */
- if (!(SiS_VBInfo & SetPALTV)) {
- if (modeflag & NoSupportSimuTV) {
- if (SiS_VBInfo & SetInSlaveMode) {
- if (!
- (SiS_VBInfo &
- SetNotSimuMode)) {
- return 0;
- }
- }
- }
- }
- }
- }
- } else { /* for LVDS */
- if (SiS_IF_DEF_CH7005 == 1) {
- if (SiS_VBInfo & SetCRT2ToTV) {
- tempax = tempax | SupportCHTV;
- }
- }
- if (SiS_VBInfo & SetCRT2ToLCD) {
- tempax = tempax | SupportLCD;
- if (resinfo > 0x08)
- return (0); /*1024x768 */
- if (SiS_LCDResInfo < Panel1024x768) {
- if (resinfo > 0x07)
- return (0); /*800x600 */
- if (resinfo == 0x04)
- return (0); /*512x384 */
- }
- }
- }
- for (; SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID == tempbx;
- (*i)--) {
- infoflag =
- SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
- if (infoflag & tempax) {
- return (1);
- }
- if ((*i) == 0)
- break;
- }
- for ((*i) = 0;; (*i)++) {
- infoflag =
- SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
- if (SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) {
- return (0);
- }
- if (infoflag & tempax) {
- return (1);
- }
- }
- return (1);
- }
- void
- SiS_SaveCRT2Info (USHORT ModeNo)
- {
- USHORT temp1, temp2;
- SiS_SetReg1 (SiS_P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */
- temp1 = (SiS_VBInfo & SetInSlaveMode) >> 8;
- temp2 = ~(SetInSlaveMode >> 8);
- SiS_SetRegANDOR (SiS_P3d4, 0x31, temp2, temp1);
- }
- void
- SiS_GetVBInfo301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
- USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
- {
- USHORT tempax, tempbx, temp;
- USHORT modeflag;
- UCHAR OutputSelect = *pSiS_OutputSelect;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- SiS_SetFlag = 0;
- SiS_ModeType = modeflag & ModeInfoFlag;
- tempbx = 0;
- if (SiS_BridgeIsOn (BaseAddr)) {
- temp = SiS_GetReg1 (SiS_P3d4, 0x30);
- tempbx = tempbx | temp;
- temp = SiS_GetReg1 (SiS_P3d4, 0x31);
- tempax = temp << 8;
- tempbx = tempbx | tempax;
- temp = SetCHTVOverScan | SetInSlaveMode | DisableCRT2Display; /* ynlai */
- temp = 0xFFFF ^ temp;
- tempbx = tempbx & temp;
- #ifdef CONFIG_FB_SIS_315
- /*301b */
- if ((SiS_VBType & VB_SIS302B)) {
- temp = SiS_GetReg1 (SiS_P3d4, 0x38);
- if (temp == 0x03)
- tempbx = tempbx | (SetCRT2ToLCDA);
- }
- /*end301b */
- #endif
- if (SiS_IF_DEF_LVDS == 0) {
- if (SiS_IF_DEF_HiVision)
- temp = 0x80FC;
- else
- temp = 0x807C;
- } else {
- if (SiS_IF_DEF_CH7005 == 1) {
- temp = SetCRT2ToTV | SetCRT2ToLCD;
- } else {
- temp = SetCRT2ToLCD;
- }
- }
- if (!(tempbx & temp)) {
- tempax = tempax | DisableCRT2Display;
- tempbx = 0;
- }
- if (SiS_IF_DEF_LVDS == 0) {
- if (tempbx & SetCRT2ToLCDA) { /*301b */
- tempbx =
- tempbx & (0xFF00 | SwitchToCRT2 |
- SetSimuScanMode);
- } else if (tempbx & SetCRT2ToRAMDAC) {
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToRAMDAC |
- SwitchToCRT2 | SetSimuScanMode);
- } else if ((tempbx & SetCRT2ToLCD) && (!(SiS_VBType & VB_NoLCD))) { /*301dlvds */
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToLCD |
- SwitchToCRT2 | SetSimuScanMode);
- } else if (tempbx & SetCRT2ToSCART) {
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToSCART |
- SwitchToCRT2 | SetSimuScanMode);
- tempbx = tempbx | SetPALTV;
- } else if (tempbx & SetCRT2ToHiVisionTV) {
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToHiVisionTV |
- SwitchToCRT2 | SetSimuScanMode);
- /* ynlai begin */
- tempbx = tempbx | SetPALTV;
- /* ynlai end */
- }
- } else {
- if (SiS_IF_DEF_CH7005 == 1) {
- if (tempbx & SetCRT2ToTV)
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToTV |
- SwitchToCRT2 |
- SetSimuScanMode);
- }
- if (tempbx & SetCRT2ToLCD)
- tempbx =
- tempbx & (0xFF00 | SetCRT2ToLCD |
- SwitchToCRT2 | SetSimuScanMode);
- }
- if (tempax & DisableCRT2Display) {
- if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
- tempbx = SetSimuScanMode | DisableCRT2Display;
- }
- }
- if (!(tempbx & DriverMode)) {
- tempbx = tempbx | SetSimuScanMode;
- }
- if (!(tempbx & SetSimuScanMode)) {
- if (tempbx & SwitchToCRT2) {
- if (!(modeflag & CRT2Mode)) {
- tempbx = tempbx | SetSimuScanMode;
- }
- } else {
- if (!
- (SiS_BridgeIsEnable
- (BaseAddr, HwDeviceExtension))) {
- if (!(tempbx & DriverMode)) {
- if (SiS_BridgeInSlave ()) {
- tempbx =
- tempbx |
- SetInSlaveMode;
- }
- }
- }
- }
- }
- if (!(tempbx & DisableCRT2Display)) {
- if (tempbx & DriverMode) {
- if (tempbx & SetSimuScanMode) {
- if (!(modeflag & CRT2Mode)) {
- tempbx =
- tempbx | SetInSlaveMode;
- if (SiS_IF_DEF_LVDS == 0) {
- if (tempbx &
- SetCRT2ToTV) {
- if (!
- (tempbx &
- SetNotSimuMode))
- SiS_SetFlag =
- SiS_SetFlag
- |
- TVSimuMode;
- }
- }
- }
- }
- } else {
- tempbx = tempbx | SetInSlaveMode;
- if (SiS_IF_DEF_LVDS == 0) {
- if (tempbx & SetCRT2ToTV) {
- if (!(tempbx & SetNotSimuMode))
- SiS_SetFlag =
- SiS_SetFlag |
- TVSimuMode;
- }
- }
- }
- }
- if (SiS_IF_DEF_CH7005 == 1) {
- temp = SiS_GetReg1 (SiS_P3d4, 0x35);
- if (temp & TVOverScan)
- tempbx = tempbx | SetCHTVOverScan;
- }
- }
- #ifdef CONFIG_FB_SIS_300
- /*add PALMN */
- if (SiS_IF_DEF_LVDS == 0) {
- if ((HwDeviceExtension->jChipType == SIS_630) ||
- (HwDeviceExtension->jChipType == SIS_730)) {
- if (!(OutputSelect & EnablePALMN))
- SiS_SetRegAND (SiS_P3d4, 0x35, 0x3F);
- if (tempbx & SetCRT2ToTV) {
- if (tempbx & SetPALTV) {
- temp = SiS_GetReg1 (SiS_P3d4, 0x35);
- temp = temp & 0xC0;
- if (temp == 0x40)
- tempbx = tempbx & (~SetPALTV);
- }
- }
- }
- }
- /*end add */
- #endif
- #ifdef CONFIG_FB_SIS_315
- /*add PALMN */
- if (SiS_IF_DEF_LVDS == 0) {
- if (!(OutputSelect & EnablePALMN))
- SiS_SetRegAND (SiS_P3d4, 0x38, 0x3F);
- if (tempbx & SetCRT2ToTV) {
- if (tempbx & SetPALTV) {
- temp = SiS_GetReg1 (SiS_P3d4, 0x38);
- temp = temp & 0xC0;
- if (temp == 0x40)
- tempbx = tempbx & (~SetPALTV);
- }
- }
- }
- /*end add */
- #endif
- SiS_VBInfo = tempbx;
- }
- void
- SiS_GetRAMDAC2DATA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex)
- {
- USHORT tempax, tempbx, temp;
- USHORT temp1, temp2, modeflag = 0, tempcx;
- USHORT StandTableIndex, CRT1Index;
- USHORT ResInfo, DisplayType;
- SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
- SiS_RVBHCMAX = 1;
- SiS_RVBHCFACT = 1;
- if (ModeNo <= 0x13) {
- modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- StandTableIndex = SiS_GetModePtr (ROMAddr, ModeNo, ModeIdIndex);
- tempax = SiS_StandTable[StandTableIndex].CRTC[0];
- tempbx = SiS_StandTable[StandTableIndex].CRTC[6];
- temp1 = SiS_StandTable[StandTableIndex].CRTC[7];
- } else {
- if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
- && (SiS_VBInfo & SetCRT2ToLCDA)) {
- /*add crt1ptr */
- temp =
- SiS_GetLVDSCRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, &ResInfo,
- &DisplayType);
- if (temp == 0) {
- return;
- }
- switch (DisplayType) {
- case 0:
- LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;
- break;
- case 1:
- LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;
- break;
- case 2:
- LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;
- break;
- case 3:
- LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;
- break;
- case 4:
- LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;
- break;
- case 5:
- LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;
- break;
- case 6:
- LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;
- break;
- case 7:
- LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;
- break;
- case 8:
- LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;
- break;
- case 9:
- LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;
- break;
- case 10:
- LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;
- break;
- case 11:
- LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;
- break;
- case 12:
- LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;
- break;
- case 13:
- LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;
- break;
- case 14:
- LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;
- break;
- case 15:
- LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;
- break;
- }
- temp1 = (LVDSCRT1Ptr + ResInfo)->CR[0];
- temp2 = (LVDSCRT1Ptr + ResInfo)->CR[14];
- tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
- tempbx = (LVDSCRT1Ptr + ResInfo)->CR[6];
- tempcx = (LVDSCRT1Ptr + ResInfo)->CR[13] << 8;
- tempcx = tempcx & 0x0100;
- tempcx = tempcx << 2;
- tempbx = tempbx | tempcx;
- temp1 = (LVDSCRT1Ptr + ResInfo)->CR[7];
- } /*add 301b */
- else {
- modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- CRT1Index =
- SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
- CRT1Index = CRT1Index & 0x3F;
- temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[0];
- temp2 = (USHORT) SiS_CRT1Table[CRT1Index].CR[14];
- tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
- tempbx = (USHORT) SiS_CRT1Table[CRT1Index].CR[6];
- tempcx = (USHORT) SiS_CRT1Table[CRT1Index].CR[13] << 8;
- tempcx = tempcx & 0x0100;
- tempcx = tempcx << 2;
- tempbx = tempbx | tempcx;
- temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[7];
- }
- }
- if (temp1 & 0x01)
- tempbx = tempbx | 0x0100;
- if (temp1 & 0x20)
- tempbx = tempbx | 0x0200;
- tempax = tempax + 5;
- if (modeflag & Charx8Dot)
- tempax = tempax * 8;
- else
- tempax = tempax * 9;
- SiS_VGAHT = tempax;
- SiS_HT = tempax;
- tempbx++;
- SiS_VGAVT = tempbx;
- SiS_VT = tempbx;
- }
- void
- SiS_UnLockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
- {
- if (HwDeviceExtension->jChipType >= SIS_315H) {
- SiS_SetRegANDOR (SiS_Part1Port, 0x2f, 0xFF, 0x01);
- } else {
- SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFF, 0x01);
- }
- }
- void
- SiS_LockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
- {
- if (HwDeviceExtension->jChipType >= SIS_315H) {
- SiS_SetRegANDOR (SiS_Part1Port, 0x2F, 0xFE, 0x00);
- } else {
- SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFE, 0x00);
- }
- }
- void
- SiS_EnableCRT2 ()
- {