extractedLnx/linux-2.6.7/drivers/video/sis/init301.c_SiS_SetGroup1_LVDS.c
static void
SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
PSIS_HW_INFO HwInfo, USHORT RefreshRateTableIndex)
{
USHORT modeflag, resinfo;
USHORT push1, push2, tempax, tempbx, tempcx, temp;
#ifdef SIS315H
USHORT pushcx;
#endif
ULONG tempeax=0, tempebx, tempecx, tempvcfact=0;
/* This is not supported on LVDS */
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
if(SiS_Pr->UseCustomMode) return;
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
} else {
modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
/* Set up Panel Link */
/* 1. Horizontal setup */
tempax = SiS_Pr->SiS_LCDHDES;
if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
tempax -= 8;
}
}
tempcx = SiS_Pr->SiS_HT; /* Horiz. Total */
tempbx = SiS_Pr->SiS_HDE; /* Horiz. Display End */
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
tempbx >>= 1;
}
if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
tempbx = SiS_Pr->PanelXRes;
} else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
tempbx = SiS_Pr->PanelXRes;
if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
tempbx = 800;
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
tempbx = 1024;
}
}
}
}
}
tempcx = (tempcx - tempbx) >> 2; /* HT-HDE / 4 */
push1 = tempax;
tempax += tempbx;
if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
push2 = tempax;
if((!SiS_Pr->SiS_IF_DEF_FSTN) &&
(!SiS_Pr->SiS_IF_DEF_DSTN) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
(SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0028;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0018;
else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) ) {
if(HwInfo->jChipType < SIS_315H) {
if(SiS_Pr->SiS_VBType & VB_SISVB) {
tempcx = 0x0017; /* A901; sometimes 0x0018; */
} else {
tempcx = 0x0017;
#ifdef TWNEWPANEL
tempcx = 0x0018;
#endif
}
} else {
tempcx = 0x0018;
}
}
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0028;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
}
}
}
}
tempcx += tempax; /* lcdhrs */
if(tempcx >= SiS_Pr->SiS_HT) tempcx -= SiS_Pr->SiS_HT;
tempax = tempcx >> 3; /* BPLHRS */
temp = tempax & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,temp); /* Part1_14h; Panel Link Horizontal Retrace Start */
if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
temp = (tempax & 0x00FF) + 2;
} else {
temp = (tempax & 0x00FF) + 10;
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
if((!SiS_Pr->SiS_IF_DEF_DSTN) &&
(!SiS_Pr->SiS_IF_DEF_FSTN) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
(SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
temp += 6;
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
temp++;
if(HwInfo->jChipType >= SIS_315H) {
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1024x768) {
temp += 7;
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
temp -= 0x14;
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x768) {
temp -= 10;
}
}
}
}
}
}
}
}
}
temp &= 0x1F;
temp |= ((tempcx & 0x0007) << 5);
#if 0
if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20; /* WRONG? BIOS loads cl, not ah */
#endif
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,temp); /* Part1_15h; Panel Link Horizontal Retrace End/Skew */
tempbx = push2;
tempcx = push1; /* lcdhdes */
temp = (tempcx & 0x0007); /* BPLHDESKEW */
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1A,temp); /* Part1_1Ah; Panel Link Vertical Retrace Start (2:0) */
tempcx >>= 3; /* BPLHDES */
temp = (tempcx & 0x00FF);
#if 0 /* Not 550 FSTN */
if(HwInfo->jChipType >= SIS_315H) {
if(ModeNo == 0x5b) temp--; */
}
#endif
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,temp); /* Part1_16h; Panel Link Horizontal Display Enable Start */
if((HwInfo->jChipType < SIS_315H) ||
(SiS_Pr->SiS_IF_DEF_FSTN) ||
(SiS_Pr->SiS_IF_DEF_DSTN)) {
if(tempbx & 0x07) tempbx += 8;
}
tempbx >>= 3; /* BPLHDEE */
temp = tempbx & 0x00FF;
#if 0 /* Not 550 FSTN */
if(HwInfo->jChipType >= SIS_315H) {
if(ModeNo == 0x5b) temp--;
}
#endif
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,temp); /* Part1_17h; Panel Link Horizontal Display Enable End */
/* 2. Vertical setup */
if(HwInfo->jChipType < SIS_315H) {
tempcx = SiS_Pr->SiS_VGAVT;
tempbx = SiS_Pr->SiS_VGAVDE;
if((SiS_Pr->SiS_CustomT != CUT_BARCO1366) && (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
tempbx = SiS_Pr->PanelYRes;
}
}
}
tempcx -= tempbx;
} else {
tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE; /* VGAVT-VGAVDE */
}
tempbx = SiS_Pr->SiS_LCDVDES; /* VGAVDES */
push1 = tempbx;
tempax = SiS_Pr->SiS_VGAVDE;
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
tempax = 600;
if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
tempax = 768;
}
}
} else if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0) &&
(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
((SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ||
(SiS_Pr->SiS_IF_DEF_FSTN) ||
(SiS_Pr->SiS_IF_DEF_DSTN)) ) {
tempax = SiS_Pr->PanelYRes;
}
}
tempbx += tempax;
if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
push2 = tempbx;
tempcx >>= 1;
if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
(SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
tempcx = 0x0017;
} else if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0003;
else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)) tempcx = 0x0003;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0001;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0001;
else tempcx = 0x0057;
} else {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0001;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0001;
else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)) {
if(HwInfo->jChipType < SIS_315H) {
if(SiS_Pr->SiS_VBType & VB_SISVB) {
tempcx = 0x0002; /* A901; sometimes 0x0003; */
} else {
tempcx = 0x0002;
#ifdef TWNEWPANEL
tempcx = 0x0003;
#endif
}
} else tempcx = 0x0003;
}
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0003;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0001;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0001;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0001;
else tempcx = 0x0057;
}
}
}
tempbx += tempcx; /* BPLVRS */
if((HwInfo->jChipType < SIS_315H) ||
(SiS_Pr->SiS_IF_DEF_FSTN) ||
(SiS_Pr->SiS_IF_DEF_DSTN)) {
tempbx++;
}
if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
temp = tempbx & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp); /* Part1_18h; Panel Link Vertical Retrace Start */
tempcx >>= 3;
if((!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
(SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
(SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
if( (HwInfo->jChipType < SIS_315H) &&
(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) ) tempcx = 0x0001;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) tempcx = 0x0002;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempcx = 0x0002;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0003;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0005;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) tempcx = 0x0005;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0011;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0005;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0002;
else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0011;
else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
if(HwInfo->jChipType < SIS_315H) {
if(SiS_Pr->SiS_VBType & VB_SISVB) {
tempcx = 0x0004; /* A901; Other BIOS sets 0x0005; */
} else {
tempcx = 0x0004;
#ifdef TWNEWPANEL
tempcx = 0x0005;
#endif
}
} else {
tempcx = 0x0005;
}
}
}
}
tempcx = tempcx + tempbx + 1; /* BPLVRE */
temp = tempcx & 0x000F;
if(SiS_Pr->SiS_IF_DEF_FSTN ||
SiS_Pr->SiS_IF_DEF_DSTN ||
(SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
(SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
(SiS_Pr->SiS_CustomT == CUT_PANEL848)) {
temp |= 0x30;
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; Panel Link Vertical Retrace End (3:0); Misc. */
temp = ((tempbx & 0x0700) >> 8) << 3; /* BPLDESKEW =0 */
if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
if(SiS_Pr->SiS_HDE != 640) {
if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
}
} else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) temp |= 0x40;
if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
if(HwInfo->jChipType >= SIS_315H) {
if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
temp |= 0x80;
}
} else {
if( (HwInfo->jChipType == SIS_630) ||
(HwInfo->jChipType == SIS_730) ) {
if(HwInfo->jChipRevision >= 0x30) {
temp |= 0x80;
}
}
}
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp); /* Part1_1Ah; Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
if (HwInfo->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
tempeax = SiS_Pr->SiS_VGAVDE << 6;
temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
tempeax = tempeax / (ULONG)SiS_Pr->SiS_VDE;
if(temp != 0) tempeax++;
tempebx = tempeax; /* BPLVCFACT */
if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
tempebx = 0x003F;
}
temp = (USHORT)(tempebx & 0x00FF);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1E,temp); /* Part1_1Eh; Panel Link Vertical Scaling Factor */
#endif /* SIS300 */
} else {
#ifdef SIS315H /* 315 series */
if(HwInfo->jChipType == SIS_740) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
} else {
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1E,0x23);
}
tempeax = SiS_Pr->SiS_VGAVDE << 18;
temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
tempeax = tempeax / SiS_Pr->SiS_VDE;
if(temp != 0) tempeax++;
tempebx = tempeax; /* BPLVCFACT */
tempvcfact = tempeax;
temp = (USHORT)(tempebx & 0x00FF);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,temp); /* Part1_37h; Panel Link Vertical Scaling Factor */
temp = (USHORT)((tempebx & 0x00FF00) >> 8);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,temp); /* Part1_36h; Panel Link Vertical Scaling Factor */
temp = (USHORT)((tempebx & 0x00030000) >> 16);
temp &= 0x03;
if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,temp); /* Part1_35h; Panel Link Vertical Scaling Factor */
#endif /* SIS315H */
}
tempbx = push2; /* BPLVDEE */
tempcx = push1;
push1 = temp;
if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN) {
if(HwInfo->jChipType < SIS_315H) {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
if(resinfo == SIS_RI_1024x600) tempcx++;
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
if(resinfo == SIS_RI_800x600) tempcx++;
}
} else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
if(resinfo == SIS_RI_800x600) tempcx++;
if(resinfo == SIS_RI_1024x768) tempcx++; /* Doesnt make sense anyway... */
} else if(resinfo == SIS_RI_1024x768) tempcx++;
} else {
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
if(resinfo == SIS_RI_800x600) tempcx++;
}
}
}
}
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
tempcx = SiS_Pr->SiS_VGAVDE;
tempbx = SiS_Pr->SiS_VGAVDE - 1;
}
}
temp = ((tempbx & 0x0700) >> 8) << 3;
temp |= ((tempcx & 0x0700) >> 8);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1D,temp); /* Part1_1Dh; Vertical Display Overflow; Control Signal */
temp = tempbx & 0x00FF;
/* if(SiS_Pr->SiS_IF_DEF_FSTN) temp++; */
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1C,temp); /* Part1_1Ch; Panel Link Vertical Display Enable End */
temp = tempcx & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1B,temp); /* Part1_1Bh; Panel Link Vertical Display Enable Start */
/* 3. Additional horizontal setup (scaling, etc) */
tempecx = SiS_Pr->SiS_VGAHDE;
if(HwInfo->jChipType >= SIS_315H) {
if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
if(modeflag & HalfDCLK) tempecx >>= 1;
}
}
tempebx = SiS_Pr->SiS_HDE;
if(tempecx == tempebx) tempeax = 0xFFFF;
else {
tempeax = tempecx;
tempeax <<= 16;
temp = (USHORT)(tempeax % tempebx);
tempeax = tempeax / tempebx;
if(HwInfo->jChipType >= SIS_315H) {
if(temp) tempeax++;
}
}
tempecx = tempeax;
if(HwInfo->jChipType >= SIS_315H) {
tempeax = SiS_Pr->SiS_VGAHDE;
if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
if(modeflag & HalfDCLK) tempeax >>= 1;
}
tempeax <<= 16;
tempeax = (tempeax / tempecx) - 1;
} else {
tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
}
tempecx <<= 16;
tempecx |= (tempeax & 0xFFFF);
temp = (USHORT)(tempecx & 0x00FF);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1F,temp); /* Part1_1Fh; Panel Link DDA Operational Number in each horiz. line */
tempbx = SiS_Pr->SiS_VDE;
if(HwInfo->jChipType >= SIS_315H) {
tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
tempbx = (USHORT)(tempeax & 0x0FFFF);
} else {
tempeax = SiS_Pr->SiS_VGAVDE << 6;
tempbx = push1 & 0x3f;
if(tempbx == 0) tempbx = 64;
tempeax /= tempbx;
tempbx = (USHORT)(tempeax & 0x0FFFF);
}
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx--;
if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempbx = 1;
}
temp = ((tempbx & 0xFF00) >> 8) << 3;
temp |= (USHORT)((tempecx & 0x0700) >> 8);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x20,temp); /* Part1_20h; Overflow register */
temp = tempbx & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x21,temp); /* Part1_21h; Panel Link Vertical Accumulator Register */
tempecx >>= 16; /* BPLHCFACT */
if((HwInfo->jChipType < SIS_315H) || (SiS_Pr->SiS_IF_DEF_FSTN) || (SiS_Pr->SiS_IF_DEF_DSTN)) {
if(modeflag & HalfDCLK) tempecx >>= 1;
}
temp = (USHORT)((tempecx & 0xFF00) >> 8);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x22,temp); /* Part1_22h; Panel Link Horizontal Scaling Factor High */
temp = (USHORT)(tempecx & 0x00FF);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x23,temp); /* Part1_22h; Panel Link Horizontal Scaling Factor Low */
/* 630/301B and 630/LVDS do something for 640x480 panels here */
#ifdef SIS315H
if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x25,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x26,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x27,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x28,0x87);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x29,0x5A);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
tempax = SiS_Pr->SiS_HDE; /* Blps = lcdhdee(lcdhdes+HDE) + 64 */
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
tempax += 64;
temp = tempax & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,temp);
temp = ((tempax & 0xFF00) >> 8) << 3;
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
tempax += 32; /* Blpe=lBlps+32 */
temp = tempax & 0x00FF;
if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,temp);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3A,0x00); /* Bflml=0 */
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
tempax = SiS_Pr->SiS_VDE;
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
tempax >>= 1;
temp = tempax & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3B,temp);
temp = ((tempax & 0xFF00) >> 8) << 3;
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
tempeax = SiS_Pr->SiS_HDE;
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempeax >>= 1;
tempeax <<= 2; /* BDxFIFOSTOP = (HDE*4)/128 */
tempebx = 128;
temp = (USHORT)(tempeax % tempebx);
tempeax = tempeax / tempebx;
if(temp) tempeax++;
temp = (USHORT)(tempeax & 0x003F);
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3F,0x00); /* BDxWadrst0 */
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3E,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3D,0x10);
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
tempax = SiS_Pr->SiS_HDE;
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
tempax >>= 4; /* BDxWadroff = HDE*4/8/8 */
pushcx = tempax;
temp = tempax & 0x00FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,temp);
temp = ((tempax & 0xFF00) >> 8) << 3;
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
tempax = SiS_Pr->SiS_VDE; /* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
tempeax = (tempax * pushcx);
tempebx = 0x00100000 + tempeax;
temp = (USHORT)tempebx & 0x000000FF;
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,temp);
temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,temp);
temp = (USHORT)((tempebx & 0x00FF0000) >> 16);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,temp);
temp = (USHORT)(((tempebx & 0x01000000) >> 24) << 7);
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x03);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,0x50);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x04,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x01);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0x38);
if(SiS_Pr->SiS_IF_DEF_FSTN) {
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2b,0x02);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2c,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,0x0c);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,0x80);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,0xA0);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3a,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3c,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3d,0x10);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3e,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3f,0x00);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,0x10);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,0x25);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,0x80);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,0x14);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x44,0x03);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x45,0x0a);
}
}
#endif /* SIS315H */
}
Generated by GNU enscript 1.6.4.