|
@@ -340,9 +340,7 @@ SiSInitPtr(struct SiS_Private *SiS_Pr)
|
|
|
/* HELPER: Get ModeID */
|
|
|
/*********************************************/
|
|
|
|
|
|
-#ifndef SIS_XORG_XF86
|
|
|
static
|
|
|
-#endif
|
|
|
unsigned short
|
|
|
SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
|
|
|
int Depth, bool FSTN, int LCDwidth, int LCDheight)
|
|
@@ -2999,11 +2997,6 @@ SiS_SetCRT1Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned sho
|
|
|
SiS_Pr->SiS_SelectCRT2Rate = 0;
|
|
|
SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- xf86DrvMsgVerb(0, X_PROBED, 4, "(init: VBType=0x%04x, VBInfo=0x%04x)\n",
|
|
|
- SiS_Pr->SiS_VBType, SiS_Pr->SiS_VBInfo);
|
|
|
-#endif
|
|
|
-
|
|
|
if(SiS_Pr->SiS_VBInfo & SetSimuScanMode) {
|
|
|
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
|
|
|
SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
|
|
@@ -3202,74 +3195,12 @@ SiS_Handle760(struct SiS_Private *SiS_Pr)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-/*********************************************/
|
|
|
-/* X.org/XFree86: SET SCREEN PITCH */
|
|
|
-/*********************************************/
|
|
|
-
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
-static void
|
|
|
-SiS_SetPitchCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
|
|
|
-{
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
- unsigned short HDisplay = pSiS->scrnPitch >> 3;
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x13,(HDisplay & 0xFF));
|
|
|
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0xF0,(HDisplay >> 8));
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-SiS_SetPitchCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
|
|
|
-{
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
- unsigned short HDisplay = pSiS->scrnPitch2 >> 3;
|
|
|
-
|
|
|
- /* Unlock CRT2 */
|
|
|
- if(pSiS->VGAEngine == SIS_315_VGA)
|
|
|
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2F, 0x01);
|
|
|
- else
|
|
|
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24, 0x01);
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x07,(HDisplay & 0xFF));
|
|
|
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0xF0,(HDisplay >> 8));
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-SiS_SetPitch(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
|
|
|
-{
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
- bool isslavemode = false;
|
|
|
-
|
|
|
- if( (pSiS->VBFlags2 & VB2_VIDEOBRIDGE) &&
|
|
|
- ( ((pSiS->VGAEngine == SIS_300_VGA) &&
|
|
|
- (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
|
|
|
- ((pSiS->VGAEngine == SIS_315_VGA) &&
|
|
|
- (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
|
|
|
- isslavemode = true;
|
|
|
- }
|
|
|
-
|
|
|
- /* We need to set pitch for CRT1 if bridge is in slave mode, too */
|
|
|
- if((pSiS->VBFlags & DISPTYPE_DISP1) || (isslavemode)) {
|
|
|
- SiS_SetPitchCRT1(SiS_Pr, pScrn);
|
|
|
- }
|
|
|
- /* We must not set the pitch for CRT2 if bridge is in slave mode */
|
|
|
- if((pSiS->VBFlags & DISPTYPE_DISP2) && (!isslavemode)) {
|
|
|
- SiS_SetPitchCRT2(SiS_Pr, pScrn);
|
|
|
- }
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
/*********************************************/
|
|
|
/* SiSSetMode() */
|
|
|
/*********************************************/
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
-/* We need pScrn for setting the pitch correctly */
|
|
|
-bool
|
|
|
-SiSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, unsigned short ModeNo, bool dosetpitch)
|
|
|
-#else
|
|
|
bool
|
|
|
SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
|
|
|
-#endif
|
|
|
{
|
|
|
SISIOADDRESS BaseAddr = SiS_Pr->IOAddress;
|
|
|
unsigned short RealModeNo, ModeIdIndex;
|
|
@@ -3301,9 +3232,6 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
|
|
|
SiS_GetSysFlags(SiS_Pr);
|
|
|
|
|
|
SiS_Pr->SiS_VGAINFO = 0x11;
|
|
|
-#if defined(SIS_XORG_XF86) && (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__) || defined(__amd64__) || defined(__x86_64__))
|
|
|
- if(pScrn) SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
|
|
|
-#endif
|
|
|
|
|
|
#ifdef SIS_LINUX_KERNEL
|
|
|
KeepLockReg = SiS_GetReg(SiS_Pr->SiS_P3c4,0x05);
|
|
@@ -3424,18 +3352,6 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- if(pScrn) {
|
|
|
- /* SetPitch: Adapt to virtual size & position */
|
|
|
- if((ModeNo > 0x13) && (dosetpitch)) {
|
|
|
- SiS_SetPitch(SiS_Pr, pScrn);
|
|
|
- }
|
|
|
-
|
|
|
- /* Backup/Set ModeNo in BIOS scratch area */
|
|
|
- SiS_GetSetModeID(pScrn, ModeNo);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
SiS_CloseCRTC(SiS_Pr);
|
|
|
|
|
|
SiS_Handle760(SiS_Pr);
|
|
@@ -3448,400 +3364,6 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-/*********************************************/
|
|
|
-/* X.org/XFree86: SiSBIOSSetMode() */
|
|
|
-/* for non-Dual-Head mode */
|
|
|
-/*********************************************/
|
|
|
-
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
-bool
|
|
|
-SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
|
|
|
- DisplayModePtr mode, bool IsCustom)
|
|
|
-{
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
- unsigned short ModeNo = 0;
|
|
|
-
|
|
|
- SiS_Pr->UseCustomMode = false;
|
|
|
-
|
|
|
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n",
|
|
|
- SiS_Pr->CHDisplay,
|
|
|
- (mode->Flags & V_INTERLACE ? SiS_Pr->CVDisplay * 2 :
|
|
|
- (mode->Flags & V_DBLSCAN ? SiS_Pr->CVDisplay / 2 :
|
|
|
- SiS_Pr->CVDisplay)));
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- /* Don't need vbflags here; checks done earlier */
|
|
|
- ModeNo = SiS_GetModeNumber(pScrn, mode, pSiS->VBFlags);
|
|
|
- if(!ModeNo) return false;
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return(SiSSetMode(SiS_Pr, pScrn, ModeNo, true));
|
|
|
-}
|
|
|
-
|
|
|
-/*********************************************/
|
|
|
-/* X.org/XFree86: SiSBIOSSetModeCRT2() */
|
|
|
-/* for Dual-Head modes */
|
|
|
-/*********************************************/
|
|
|
-
|
|
|
-bool
|
|
|
-SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
|
|
|
- DisplayModePtr mode, bool IsCustom)
|
|
|
-{
|
|
|
- SISIOADDRESS BaseAddr = SiS_Pr->IOAddress;
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
-#ifdef SISDUALHEAD
|
|
|
- SISEntPtr pSiSEnt = pSiS->entityPrivate;
|
|
|
-#endif
|
|
|
- unsigned short ModeIdIndex;
|
|
|
- unsigned short ModeNo = 0;
|
|
|
- unsigned char backupreg = 0;
|
|
|
-
|
|
|
- SiS_Pr->UseCustomMode = false;
|
|
|
-
|
|
|
- /* Remember: Custom modes for CRT2 are ONLY supported
|
|
|
- * -) on the 30x/B/C, and
|
|
|
- * -) if CRT2 is LCD or VGA, or CRT1 is LCDA
|
|
|
- */
|
|
|
-
|
|
|
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
|
|
|
-
|
|
|
- ModeNo = 0xfe;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- ModeNo = SiS_GetModeNumber(pScrn, mode, pSiS->VBFlags);
|
|
|
- if(!ModeNo) return false;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- SiSRegInit(SiS_Pr, BaseAddr);
|
|
|
- SiSInitPtr(SiS_Pr);
|
|
|
- SiS_GetSysFlags(SiS_Pr);
|
|
|
-#if defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__) || defined(__amd64__) || defined(__x86_64__)
|
|
|
- SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
|
|
|
-#else
|
|
|
- SiS_Pr->SiS_VGAINFO = 0x11;
|
|
|
-#endif
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
|
|
|
-
|
|
|
- SiSInitPCIetc(SiS_Pr);
|
|
|
- SiSSetLVDSetc(SiS_Pr);
|
|
|
- SiSDetermineROMUsage(SiS_Pr);
|
|
|
-
|
|
|
- /* Save mode info so we can set it from within SetMode for CRT1 */
|
|
|
-#ifdef SISDUALHEAD
|
|
|
- if(pSiS->DualHeadMode) {
|
|
|
- pSiSEnt->CRT2ModeNo = ModeNo;
|
|
|
- pSiSEnt->CRT2DMode = mode;
|
|
|
- pSiSEnt->CRT2IsCustom = IsCustom;
|
|
|
- pSiSEnt->CRT2CR30 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
|
|
|
- pSiSEnt->CRT2CR31 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
|
|
|
- pSiSEnt->CRT2CR35 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
|
|
|
- pSiSEnt->CRT2CR38 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
|
|
|
-#if 0
|
|
|
- /* We can't set CRT2 mode before CRT1 mode is set - says who...? */
|
|
|
- if(pSiSEnt->CRT1ModeNo == -1) {
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "Setting CRT2 mode delayed until after setting CRT1 mode\n");
|
|
|
- return true;
|
|
|
- }
|
|
|
-#endif
|
|
|
- pSiSEnt->CRT2ModeSet = true;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- if(SiS_Pr->UseCustomMode) {
|
|
|
-
|
|
|
- unsigned short temptemp = SiS_Pr->CVDisplay;
|
|
|
-
|
|
|
- if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
|
|
|
- else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "Setting custom mode %dx%d on CRT2\n",
|
|
|
- SiS_Pr->CHDisplay, temptemp);
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "Setting standard mode 0x%x on CRT2\n", ModeNo);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- SiS_UnLockCRT2(SiS_Pr);
|
|
|
-
|
|
|
- if(!SiS_Pr->UseCustomMode) {
|
|
|
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
|
|
|
- } else {
|
|
|
- ModeIdIndex = 0;
|
|
|
- }
|
|
|
-
|
|
|
- SiS_GetVBType(SiS_Pr);
|
|
|
-
|
|
|
- SiS_InitVB(SiS_Pr);
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
|
|
|
- if(SiS_Pr->ChipType >= SIS_315H) {
|
|
|
- SiS_ResetVB(SiS_Pr);
|
|
|
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x32,0x10);
|
|
|
- SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x00,0x0c);
|
|
|
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
|
|
|
- } else {
|
|
|
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Get VB information (connectors, connected devices) */
|
|
|
- if(!SiS_Pr->UseCustomMode) {
|
|
|
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, 1);
|
|
|
- } else {
|
|
|
- /* If this is a custom mode, we don't check the modeflag for CRT2Mode */
|
|
|
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, 0);
|
|
|
- }
|
|
|
- SiS_SetYPbPr(SiS_Pr);
|
|
|
- SiS_SetTVMode(SiS_Pr, ModeNo, ModeIdIndex);
|
|
|
- SiS_GetLCDResInfo(SiS_Pr, ModeNo, ModeIdIndex);
|
|
|
- SiS_SetLowModeTest(SiS_Pr, ModeNo);
|
|
|
-
|
|
|
- SiS_ResetSegmentRegisters(SiS_Pr);
|
|
|
-
|
|
|
- /* Set mode on CRT2 */
|
|
|
- if( (SiS_Pr->SiS_VBType & VB_SISVB) ||
|
|
|
- (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
|
|
|
- (SiS_Pr->SiS_IF_DEF_CH70xx != 0) ||
|
|
|
- (SiS_Pr->SiS_IF_DEF_TRUMPION != 0) ) {
|
|
|
- SiS_SetCRT2Group(SiS_Pr, ModeNo);
|
|
|
- }
|
|
|
-
|
|
|
- SiS_StrangeStuff(SiS_Pr);
|
|
|
-
|
|
|
- SiS_DisplayOn(SiS_Pr);
|
|
|
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
|
|
|
-
|
|
|
- if(SiS_Pr->ChipType >= SIS_315H) {
|
|
|
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
|
|
|
- if(!(SiS_IsDualEdge(SiS_Pr))) {
|
|
|
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
|
|
|
- if(SiS_Pr->ChipType >= SIS_315H) {
|
|
|
- if(!SiS_Pr->SiS_ROMNew) {
|
|
|
- if(SiS_IsVAMode(SiS_Pr)) {
|
|
|
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
|
|
|
- } else {
|
|
|
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0xFE);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupreg);
|
|
|
-
|
|
|
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & SetCRT2ToLCD) {
|
|
|
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
|
|
|
- }
|
|
|
- } else if((SiS_Pr->ChipType == SIS_630) ||
|
|
|
- (SiS_Pr->ChipType == SIS_730)) {
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupreg);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* SetPitch: Adapt to virtual size & position */
|
|
|
- SiS_SetPitchCRT2(SiS_Pr, pScrn);
|
|
|
-
|
|
|
- SiS_Handle760(SiS_Pr);
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-/*********************************************/
|
|
|
-/* X.org/XFree86: SiSBIOSSetModeCRT1() */
|
|
|
-/* for Dual-Head modes */
|
|
|
-/*********************************************/
|
|
|
-
|
|
|
-bool
|
|
|
-SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
|
|
|
- DisplayModePtr mode, bool IsCustom)
|
|
|
-{
|
|
|
- SISIOADDRESS BaseAddr = SiS_Pr->IOAddress;
|
|
|
- SISPtr pSiS = SISPTR(pScrn);
|
|
|
- unsigned short ModeIdIndex, ModeNo = 0;
|
|
|
- unsigned char backupreg = 0;
|
|
|
-#ifdef SISDUALHEAD
|
|
|
- SISEntPtr pSiSEnt = pSiS->entityPrivate;
|
|
|
- unsigned char backupcr30, backupcr31, backupcr38, backupcr35, backupp40d=0;
|
|
|
- bool backupcustom;
|
|
|
-#endif
|
|
|
-
|
|
|
- SiS_Pr->UseCustomMode = false;
|
|
|
-
|
|
|
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
|
|
|
-
|
|
|
- unsigned short temptemp = SiS_Pr->CVDisplay;
|
|
|
-
|
|
|
- if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
|
|
|
- else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "Setting custom mode %dx%d on CRT1\n",
|
|
|
- SiS_Pr->CHDisplay, temptemp);
|
|
|
- ModeNo = 0xfe;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- ModeNo = SiS_GetModeNumber(pScrn, mode, 0); /* don't give VBFlags */
|
|
|
- if(!ModeNo) return false;
|
|
|
-
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "Setting standard mode 0x%x on CRT1\n", ModeNo);
|
|
|
- }
|
|
|
-
|
|
|
- SiSInitPtr(SiS_Pr);
|
|
|
- SiSRegInit(SiS_Pr, BaseAddr);
|
|
|
- SiS_GetSysFlags(SiS_Pr);
|
|
|
-#if defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__) || defined(__amd64__) || defined(__x86_64__)
|
|
|
- SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
|
|
|
-#else
|
|
|
- SiS_Pr->SiS_VGAINFO = 0x11;
|
|
|
-#endif
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
|
|
|
-
|
|
|
- SiSInitPCIetc(SiS_Pr);
|
|
|
- SiSSetLVDSetc(SiS_Pr);
|
|
|
- SiSDetermineROMUsage(SiS_Pr);
|
|
|
-
|
|
|
- SiS_UnLockCRT2(SiS_Pr);
|
|
|
-
|
|
|
- if(!SiS_Pr->UseCustomMode) {
|
|
|
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
|
|
|
- } else {
|
|
|
- ModeIdIndex = 0;
|
|
|
- }
|
|
|
-
|
|
|
- /* Determine VBType */
|
|
|
- SiS_GetVBType(SiS_Pr);
|
|
|
-
|
|
|
- SiS_InitVB(SiS_Pr);
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
|
|
|
- if(SiS_Pr->ChipType >= SIS_315H) {
|
|
|
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
|
|
|
- } else {
|
|
|
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Get VB information (connectors, connected devices) */
|
|
|
- /* (We don't care if the current mode is a CRT2 mode) */
|
|
|
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, 0);
|
|
|
- SiS_SetYPbPr(SiS_Pr);
|
|
|
- SiS_SetTVMode(SiS_Pr, ModeNo, ModeIdIndex);
|
|
|
- SiS_GetLCDResInfo(SiS_Pr, ModeNo, ModeIdIndex);
|
|
|
- SiS_SetLowModeTest(SiS_Pr, ModeNo);
|
|
|
-
|
|
|
- SiS_OpenCRTC(SiS_Pr);
|
|
|
-
|
|
|
- /* Set mode on CRT1 */
|
|
|
- SiS_SetCRT1Group(SiS_Pr, ModeNo, ModeIdIndex);
|
|
|
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
|
|
|
- SiS_SetCRT2Group(SiS_Pr, ModeNo);
|
|
|
- }
|
|
|
-
|
|
|
- /* SetPitch: Adapt to virtual size & position */
|
|
|
- SiS_SetPitchCRT1(SiS_Pr, pScrn);
|
|
|
-
|
|
|
- SiS_HandleCRT1(SiS_Pr);
|
|
|
-
|
|
|
- SiS_StrangeStuff(SiS_Pr);
|
|
|
-
|
|
|
- SiS_CloseCRTC(SiS_Pr);
|
|
|
-
|
|
|
-#ifdef SISDUALHEAD
|
|
|
- if(pSiS->DualHeadMode) {
|
|
|
- pSiSEnt->CRT1ModeNo = ModeNo;
|
|
|
- pSiSEnt->CRT1DMode = mode;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- if(SiS_Pr->UseCustomMode) {
|
|
|
- SiS_Pr->CRT1UsesCustomMode = true;
|
|
|
- SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
|
|
|
- SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
|
|
|
- } else {
|
|
|
- SiS_Pr->CRT1UsesCustomMode = false;
|
|
|
- }
|
|
|
-
|
|
|
- /* Reset CRT2 if changing mode on CRT1 */
|
|
|
-#ifdef SISDUALHEAD
|
|
|
- if(pSiS->DualHeadMode) {
|
|
|
- if(pSiSEnt->CRT2ModeNo != -1) {
|
|
|
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
|
|
|
- "(Re-)Setting mode for CRT2\n");
|
|
|
- backupcustom = SiS_Pr->UseCustomMode;
|
|
|
- backupcr30 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
|
|
|
- backupcr31 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
|
|
|
- backupcr35 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
|
|
|
- backupcr38 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
|
|
|
- /* Backup LUT-enable */
|
|
|
- if(pSiSEnt->CRT2ModeSet) {
|
|
|
- backupp40d = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x0d) & 0x08;
|
|
|
- }
|
|
|
- }
|
|
|
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x30,pSiSEnt->CRT2CR30);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x31,pSiSEnt->CRT2CR31);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,pSiSEnt->CRT2CR35);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,pSiSEnt->CRT2CR38);
|
|
|
- }
|
|
|
-
|
|
|
- SiSBIOSSetModeCRT2(SiS_Pr, pSiSEnt->pScrn_1,
|
|
|
- pSiSEnt->CRT2DMode, pSiSEnt->CRT2IsCustom);
|
|
|
-
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x30,backupcr30);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x31,backupcr31);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupcr35);
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupcr38);
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
|
|
|
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0d, ~0x08, backupp40d);
|
|
|
- }
|
|
|
- SiS_Pr->UseCustomMode = backupcustom;
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- /* Warning: From here, the custom mode entries in SiS_Pr are
|
|
|
- * possibly overwritten
|
|
|
- */
|
|
|
-
|
|
|
- SiS_DisplayOn(SiS_Pr);
|
|
|
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
|
|
|
-
|
|
|
- if(SiS_Pr->SiS_VBType & VB_SIS30xBLV) {
|
|
|
- if(SiS_Pr->ChipType >= SIS_315H) {
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupreg);
|
|
|
- } else if((SiS_Pr->ChipType == SIS_630) ||
|
|
|
- (SiS_Pr->ChipType == SIS_730)) {
|
|
|
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupreg);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- SiS_Handle760(SiS_Pr);
|
|
|
-
|
|
|
- /* Backup/Set ModeNo in BIOS scratch area */
|
|
|
- SiS_GetSetModeID(pScrn,ModeNo);
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-#endif /* Linux_XF86 */
|
|
|
-
|
|
|
#ifndef GETBITSTR
|
|
|
#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l))
|
|
|
#define GENMASK(mask) BITMASK(1?mask,0?mask)
|
|
@@ -4054,33 +3576,11 @@ SiS_CalcLCDACRT1Timing(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
|
|
|
if(modeflag & DoubleScanMode) tempax |= 0x80;
|
|
|
SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0x5F,tempax);
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
-#ifdef TWDEBUG
|
|
|
- xf86DrvMsg(0, X_INFO, "%d %d %d %d %d %d %d %d (%d %d %d %d)\n",
|
|
|
- SiS_Pr->CHDisplay, SiS_Pr->CHSyncStart, SiS_Pr->CHSyncEnd, SiS_Pr->CHTotal,
|
|
|
- SiS_Pr->CVDisplay, SiS_Pr->CVSyncStart, SiS_Pr->CVSyncEnd, SiS_Pr->CVTotal,
|
|
|
- SiS_Pr->CHBlankStart, SiS_Pr->CHBlankEnd, SiS_Pr->CVBlankStart, SiS_Pr->CVBlankEnd);
|
|
|
- xf86DrvMsg(0, X_INFO, " {{0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
|
|
|
- SiS_Pr->CCRT1CRTC[0], SiS_Pr->CCRT1CRTC[1],
|
|
|
- SiS_Pr->CCRT1CRTC[2], SiS_Pr->CCRT1CRTC[3],
|
|
|
- SiS_Pr->CCRT1CRTC[4], SiS_Pr->CCRT1CRTC[5],
|
|
|
- SiS_Pr->CCRT1CRTC[6], SiS_Pr->CCRT1CRTC[7]);
|
|
|
- xf86DrvMsg(0, X_INFO, " 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
|
|
|
- SiS_Pr->CCRT1CRTC[8], SiS_Pr->CCRT1CRTC[9],
|
|
|
- SiS_Pr->CCRT1CRTC[10], SiS_Pr->CCRT1CRTC[11],
|
|
|
- SiS_Pr->CCRT1CRTC[12], SiS_Pr->CCRT1CRTC[13],
|
|
|
- SiS_Pr->CCRT1CRTC[14], SiS_Pr->CCRT1CRTC[15]);
|
|
|
- xf86DrvMsg(0, X_INFO, " 0x%02x}},\n", SiS_Pr->CCRT1CRTC[16]);
|
|
|
-#endif
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
void
|
|
|
SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
|
|
|
int xres, int yres,
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- DisplayModePtr current
|
|
|
-#endif
|
|
|
#ifdef SIS_LINUX_KERNEL
|
|
|
struct fb_var_screeninfo *var, bool writeres
|
|
|
#endif
|
|
@@ -4127,19 +3627,6 @@ SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
|
|
|
|
|
|
D = B - F - C;
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- current->HDisplay = (E * 8);
|
|
|
- current->HSyncStart = (E * 8) + (F * 8);
|
|
|
- current->HSyncEnd = (E * 8) + (F * 8) + (C * 8);
|
|
|
- current->HTotal = (E * 8) + (F * 8) + (C * 8) + (D * 8);
|
|
|
-#ifdef TWDEBUG
|
|
|
- xf86DrvMsg(0, X_INFO,
|
|
|
- "H: A %d B %d C %d D %d E %d F %d HT %d HDE %d HRS %d HBS %d HBE %d HRE %d\n",
|
|
|
- A, B, C, D, E, F, HT, HDE, HRS, HBS, HBE, HRE);
|
|
|
-#else
|
|
|
- (void)VBS; (void)HBS; (void)A;
|
|
|
-#endif
|
|
|
-#endif
|
|
|
#ifdef SIS_LINUX_KERNEL
|
|
|
if(writeres) var->xres = xres = E * 8;
|
|
|
var->left_margin = D * 8;
|
|
@@ -4192,24 +3679,6 @@ SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
|
|
|
|
|
|
D = B - F - C;
|
|
|
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- current->VDisplay = VDE + 1;
|
|
|
- current->VSyncStart = VRS + 1;
|
|
|
- current->VSyncEnd = ((VRS & ~0x1f) | VRE) + 1;
|
|
|
- if(VRE <= (VRS & 0x1f)) current->VSyncEnd += 32;
|
|
|
- current->VTotal = E + D + C + F;
|
|
|
-#if 0
|
|
|
- current->VDisplay = E;
|
|
|
- current->VSyncStart = E + D;
|
|
|
- current->VSyncEnd = E + D + C;
|
|
|
- current->VTotal = E + D + C + F;
|
|
|
-#endif
|
|
|
-#ifdef TWDEBUG
|
|
|
- xf86DrvMsg(0, X_INFO,
|
|
|
- "V: A %d B %d C %d D %d E %d F %d VT %d VDE %d VRS %d VBS %d VBE %d VRE %d\n",
|
|
|
- A, B, C, D, E, F, VT, VDE, VRS, VBS, VBE, VRE);
|
|
|
-#endif
|
|
|
-#endif
|
|
|
#ifdef SIS_LINUX_KERNEL
|
|
|
if(writeres) var->yres = yres = E;
|
|
|
var->upper_margin = D;
|
|
@@ -4224,12 +3693,6 @@ SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
|
|
|
* a negative D. The CRT controller does not
|
|
|
* seem to like correcting HRE to 50)
|
|
|
*/
|
|
|
-#ifdef SIS_XORG_XF86
|
|
|
- current->HDisplay = 320;
|
|
|
- current->HSyncStart = 328;
|
|
|
- current->HSyncEnd = 376;
|
|
|
- current->HTotal = 400;
|
|
|
-#endif
|
|
|
#ifdef SIS_LINUX_KERNEL
|
|
|
var->left_margin = (400 - 376);
|
|
|
var->right_margin = (328 - 320);
|