blob: 08879f4a9b931d4334d450528ba74fc5a2014aee [file] [log] [blame]
Aaro Koskinend80aaa02011-02-17 23:29:14 +02001#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_util.h"
6#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02007#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020010#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
Aaro Koskinen624554d2011-10-11 21:47:35 +030012static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040013 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020023
Bill Pemberton80adad82010-06-17 13:10:51 -040024void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020025{
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030026 pVBInfo->StandTable = (struct SiS_StandTable_S *) &XGI330_StandTable;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053027 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
28 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
29 pVBInfo->XGINEWUB_CRT1Table
30 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031
Peter Huewefc39dcb2012-01-15 19:22:12 +010032 pVBInfo->MCLKData = (struct SiS_MCLKData *) XGI340New_MCLKData;
Aaro Koskinen06587332011-03-13 12:26:10 +020033 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Peter Huewefc39dcb2012-01-15 19:22:12 +010034 pVBInfo->VCLKData = (struct SiS_VCLKData *) XGI_VCLKData;
35 pVBInfo->VBVCLKData = (struct SiS_VBVCLKData *) XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053036 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Peter Huewefc39dcb2012-01-15 19:22:12 +010037 pVBInfo->StResInfo = (struct SiS_StResInfo_S *) XGI330_StResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053038 pVBInfo->ModeResInfo
Peter Huewefc39dcb2012-01-15 19:22:12 +010039 = (struct SiS_ModeResInfo_S *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053041 pVBInfo->LCDResInfo = 0;
42 pVBInfo->LCDTypeInfo = 0;
43 pVBInfo->LCDInfo = 0;
44 pVBInfo->VBInfo = 0;
45 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 pVBInfo->SR15 = XGI340_SR13;
48 pVBInfo->CR40 = XGI340_cr41;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053049 pVBInfo->CR6B = XGI340_CR6B;
50 pVBInfo->CR6E = XGI340_CR6E;
51 pVBInfo->CR6F = XGI340_CR6F;
52 pVBInfo->CR89 = XGI340_CR89;
53 pVBInfo->AGPReg = XGI340_AGPReg;
54 pVBInfo->SR16 = XGI340_SR16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020055
Peter Huewe6d12dae2012-06-14 00:21:52 +020056 pVBInfo->SR21 = 0xa3;
57 pVBInfo->SR22 = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053059 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
60 pVBInfo->PALTiming = XGI330_PALTiming;
61 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
62 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
63 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
64 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
65 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
66 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
67 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
68 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
69 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
70 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
71 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
72 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053074 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
75 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
76 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053078 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010079 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053080 pVBInfo->LCDCapList = XGI_LCDDLCapList;
81 else
82 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053084 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020085 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053087 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040088 unsigned char temp;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053089 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +010090 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053091 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020092 pVBInfo->XGINew_CR97 = 0xc1;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040093 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040095 /*Z11m DDR*/
96 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
97 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
98 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020099 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
102}
103
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800104static void XGI_SetSeqRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800105 unsigned short ModeIdIndex,
106 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200107{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530108 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200110
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300111 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200112
Aaro Koskinen8104e322011-03-13 12:26:22 +0200113 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300114 tempah = pVBInfo->StandTable->SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200115
Peter Huewea3d675c2012-02-09 21:11:47 +0100116 i = XGI_SetCRT2ToLCDA;
117 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530118 tempah |= 0x01;
119 } else {
120 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
121 if (pVBInfo->VBInfo & SetInSlaveMode)
122 tempah |= 0x01;
123 }
124 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200127 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530129 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800130 /* Get SR2,3,4 from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300131 SRdata = pVBInfo->StandTable->SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200132 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200134}
135
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200136static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800137 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200138{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530139 unsigned char CRTCdata;
140 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200141
Aaro Koskinen58839b02011-03-13 12:26:23 +0200142 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530143 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200144 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530146 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800147 /* Get CRTC from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300148 CRTCdata = pVBInfo->StandTable->CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200149 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200151}
152
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800153static void XGI_SetATTRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800154 unsigned short ModeIdIndex,
155 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200156{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530157 unsigned char ARdata;
158 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200159
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300160 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530162 for (i = 0; i <= 0x13; i++) {
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300163 ARdata = pVBInfo->StandTable->ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200164
165 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
166 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
167 ARdata = 0;
168 } else {
169 if ((pVBInfo->VBInfo &
170 (SetCRT2ToTV | SetCRT2ToLCD)) &&
171 (pVBInfo->VBInfo & SetInSlaveMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530172 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 }
174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200176 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200177 outb(i, pVBInfo->P3c0); /* set index */
178 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200181 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200182 outb(0x14, pVBInfo->P3c0); /* set index */
183 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200184 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200185 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186}
187
Aaro Koskinena1579612012-04-07 01:14:05 +0300188static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200189{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530190 unsigned char GRdata;
191 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530193 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800194 /* Get GR from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300195 GRdata = pVBInfo->StandTable->GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200196 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530197 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530199 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200200 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530201 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200202 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530203 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200204}
205
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200206static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530210 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200211 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212}
213
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200214static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200215{
216
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200217 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200218 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
219 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200221 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200222 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
223 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200224
Aaro Koskinendc505562011-03-13 12:26:26 +0200225 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530226 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227}
228
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200229static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530230 unsigned short ModeIdIndex,
231 unsigned short RefreshRateTableIndex, unsigned short *i,
232 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200233{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530234 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300236 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530237 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
238 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
239 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530241 if (pVBInfo->IF_DEF_LVDS == 0) {
242 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
243 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530245 if (pVBInfo->VBType & VB_XGI301C)
246 tempax |= SupportCRT2in301C;
247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800249 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100250 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530251 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200252
Miguel Gómez3b175622012-07-06 12:40:46 +0200253 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
254 pVBInfo->LCDResInfo != Panel_1280x960 &&
255 (pVBInfo->LCDInfo & LCDNonExpanding) &&
256 resinfo >= 9)
257 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530258 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200259
Peter Huewe599801f2012-02-09 21:11:45 +0100260 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300261 tempax |= SupportHiVision;
262 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
263 ((resinfo == 4) ||
264 (resinfo == 3 &&
265 (pVBInfo->SetFlag & TVSimuMode)) ||
266 (resinfo > 7)))
Miguel Gómez3b175622012-07-06 12:40:46 +0200267 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530268 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800269 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
270 SetCRT2ToSVIDEO |
271 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100272 SetCRT2ToYPbPr525750 |
273 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530274 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200275
Miguel Gómez3b175622012-07-06 12:40:46 +0200276 if (pVBInfo->VBType & (VB_SIS301B |
277 VB_SIS302B |
278 VB_SIS301LV |
279 VB_SIS302LV |
280 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530281 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200282
Miguel Gómez3b175622012-07-06 12:40:46 +0200283 if (!(pVBInfo->VBInfo & TVSetPAL) &&
284 (modeflag & NoSupportSimuTV) &&
285 (pVBInfo->VBInfo & SetInSlaveMode) &&
286 (!(pVBInfo->VBInfo & SetNotSimuMode)))
287 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530288 }
289 }
290 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530291 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
292 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530294 if (resinfo > 0x08)
295 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200296
Peter Huewe255aabd2012-02-09 21:11:44 +0100297 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530298 if (resinfo > 0x07)
299 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 if (resinfo == 0x04)
302 return 0; /* 512x384 */
303 }
304 }
305 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200306
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800307 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
308 tempbx; (*i)--) {
309 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
310 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530311 if (infoflag & tempax)
312 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 if ((*i) == 0)
315 break;
316 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530318 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800319 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
320 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
322 != tempbx) {
323 return 0;
324 }
325
326 if (infoflag & tempax)
327 return 1;
328 }
329 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200330}
331
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200332static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530333 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200334{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530335 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200336
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800337 /* di+0x00 */
338 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530339 sync &= 0xC0;
340 temp = 0x2F;
341 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200342 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200343}
344
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200345static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530346 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200347{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530348 unsigned char data, data1, pushax;
349 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200350
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800351 /* unlock cr0-7 */
352 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200354 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200357 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200358
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530359 for (i = 0x01; i <= 0x04; i++) {
360 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200361 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530362 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530364 for (i = 0x05; i <= 0x06; i++) {
365 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200366 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530367 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Aaro Koskinen58839b02011-03-13 12:26:23 +0200369 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530370 j &= 0x1F;
371 data = pVBInfo->TimingH[0].data[7];
372 data &= 0xE0;
373 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200374 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530376 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200377 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530378 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200379 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200380 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530381 data1 = data;
382 data1 &= 0xE0;
383 data &= 0x1F;
384 if (data == 0) {
385 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200386 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530387 0x0c);
388 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200389 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 data = pushax;
391 }
392 data = data - 1;
393 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200394 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200395 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530396 data = data >> 5;
397 data = data + 3;
398 if (data > 7)
399 data = data - 7;
400 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200401 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200403}
404
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800405static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
406 unsigned short ModeNo,
407 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200408{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530409 unsigned char data;
410 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 for (i = 0x00; i <= 0x01; i++) {
413 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200414 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530415 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530417 for (i = 0x02; i <= 0x03; i++) {
418 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200419 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530420 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 for (i = 0x04; i <= 0x05; i++) {
423 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Aaro Koskinen58839b02011-03-13 12:26:23 +0200427 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530428 j &= 0xC0;
429 data = pVBInfo->TimingV[0].data[6];
430 data &= 0x3F;
431 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200432 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530434 data = pVBInfo->TimingV[0].data[6];
435 data &= 0x80;
436 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200437
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300438 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530439 i &= DoubleScanMode;
440 if (i)
441 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200442
Aaro Koskinen58839b02011-03-13 12:26:23 +0200443 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530444 j &= 0x5F;
445 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200446 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200447}
448
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200449static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
450 unsigned short RefreshRateTableIndex,
451 struct vb_device_info *pVBInfo,
452 struct xgi_hw_device_info *HwDeviceExtension)
453{
454 unsigned char index, data;
455 unsigned short i;
456
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800457 /* Get index */
458 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200459 index = index & IndexMask;
460
Aaro Koskinen58839b02011-03-13 12:26:23 +0200461 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200462 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200463 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200464
465 for (i = 0; i < 8; i++)
466 pVBInfo->TimingH[0].data[i]
467 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
468
469 for (i = 0; i < 7; i++)
470 pVBInfo->TimingV[0].data[i]
471 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
472
473 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
474
475 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
476
477 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200478 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200479}
480
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200481/* --------------------------------------------------------------------- */
482/* Function : XGI_SetXG21CRTC */
483/* Input : Stand or enhance CRTC table */
484/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
485/* Description : Set LCD timing */
486/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200487static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530488 unsigned short RefreshRateTableIndex,
489 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200490{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300491 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530492 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200493
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300494 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
495 /* Tempax: CR4 HRS */
496 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
497 Tempcx = Tempax; /* Tempcx: HRS */
498 /* SR2E[7:0]->HRS */
499 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300501 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
502 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
503 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
504 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
505 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800506
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300507 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
508 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200509
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300510 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
511 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
512 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
513 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200514
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300515 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
516 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300518 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
519 if (Tempax < Tempcx) /* HRE < HRS */
520 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200521
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300522 Temp2 &= 0xFF;
523 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
524 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
525 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
526 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
527 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
528 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
529 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200530
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300531 /* CR10 VRS */
532 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
533 Tempbx = Tempax; /* Tempbx: VRS */
534 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
535 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
536 /* CR7[2][7] VRE */
537 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
538 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
539 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
540 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
541 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
542 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200543
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300544 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
545 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
546 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
547 Tempax &= 0x80;
548 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
549 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
550 /* Tempax: SRA */
551 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
552 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
553 Temp2 = Tempax;
554 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
555 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200556
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300557 /* Tempax: CR11 VRE */
558 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
559 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
560 /* Tempbx: SRA */
561 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
562 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
563 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
564 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
565 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
566 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200567
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300568 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
569 if (Tempax < Temp3) /* VRE < VRS */
570 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200571
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300572 Temp2 &= 0xFF;
573 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
574 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
575 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
576 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
577 Tempbx = (unsigned char) Temp1;
578 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
579 Tempax &= 0x7F;
580 /* SR3F D[7:2]->VRE D[1:0]->VRS */
581 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200582}
583
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800584static void XGI_SetXG27CRTC(unsigned short ModeNo,
585 unsigned short ModeIdIndex,
586 unsigned short RefreshRateTableIndex,
587 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200588{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300589 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200590
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300591 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
592 /* Tempax: CR4 HRS */
593 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
594 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
595 /* SR2E[7:0]->HRS */
596 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200597
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300598 /* SR0B */
599 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
600 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
601 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200602
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300603 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
604 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
605 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300607 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
608 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
609 Tempax <<= 3; /* Tempax[5]: HRE[5] */
610 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200611
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300612 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
613 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200614
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300615 /* Tempax: CR4 HRS */
616 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
617 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
618 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
619 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200620
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300621 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
622 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
623 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
624 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
625 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
626 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
627 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200628
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300629 /* CR10 VRS */
630 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
631 /* SR34[7:0]->VRS[7:0] */
632 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200633
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300634 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
635 /* CR7[7][2] VRS[9][8] */
636 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
637 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
638 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
639 Tempax >>= 2; /* Tempax[0]: VRS[8] */
640 /* SR35[0]: VRS[8] */
641 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
642 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
643 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
644 /* Tempax: SR0A */
645 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
646 Tempax &= 0x08; /* SR0A[3] VRS[10] */
647 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200648
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300649 /* Tempax: CR11 VRE */
650 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
651 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
652 /* Tempbx: SR0A */
653 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
654 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
655 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
656 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
657 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
658 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
659 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200660
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300661 if (Tempbx <= Tempcx) /* VRE <= VRS */
662 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200663
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300664 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
665 Tempax = (Tempbx << 2) & 0xFF;
666 /* SR3F[7:2]:VRE[5:0] */
667 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
668 Tempax = Tempcx >> 8;
669 /* SR35[2:0]:VRS[10:8] */
670 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200671}
672
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200673static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
674{
675 unsigned char temp;
676
677 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
678 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
679 temp = (temp & 3) << 6;
680 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
681 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
682 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
683 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
684
685}
686
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300687static void xgifb_set_lcd(int chip_id,
688 struct vb_device_info *pVBInfo,
689 unsigned short RefreshRateTableIndex,
690 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200691{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300692 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400693 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530695 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200696
Aaro Koskinen8104e322011-03-13 12:26:22 +0200697 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
698 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
699 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
700 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300701
702 if (chip_id == XG27) {
703 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
704 if ((Temp & 0x03) == 0) { /* dual 12 */
705 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
706 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
707 }
708 }
709
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300710 if (chip_id == XG27) {
711 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530712 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300713 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
714 if (Temp & 0x01) {
715 /* 18 bits FP */
716 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
717 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
718 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530719 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200721 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722
Aaro Koskinendc505562011-03-13 12:26:26 +0200723 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
724 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200725
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300726 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
727 if (Data & 0x4000)
728 /* Hsync polarity */
729 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
730 if (Data & 0x8000)
731 /* Vsync polarity */
732 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200733}
734
735/* --------------------------------------------------------------------- */
736/* Function : XGI_UpdateXG21CRTC */
737/* Input : */
738/* Output : CRT1 CRTC */
739/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
740/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800741static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
742 struct vb_device_info *pVBInfo,
743 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200744{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300745 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200746
Aaro Koskinendc505562011-03-13 12:26:26 +0200747 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300748 if (ModeNo == 0x2E &&
749 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
750 RES640x480x60))
751 index = 12;
752 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800753 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300754 index = 13;
755 else if (ModeNo == 0x2F)
756 index = 14;
757 else if (ModeNo == 0x50)
758 index = 15;
759 else if (ModeNo == 0x59)
760 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530762 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200763 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530764 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200765 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530766 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200767 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530768 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200769 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530770 pVBInfo->UpdateCRT1[index].CR16);
771 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200772}
773
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200774static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530775 unsigned short ModeNo, unsigned short ModeIdIndex,
776 unsigned short RefreshRateTableIndex,
777 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200778{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400779 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530781 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300783 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200784
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300785 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
786 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
787 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530789 if (modeflag & HalfDCLK)
790 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200791
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300792 if (modeflag & HalfDCLK)
793 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300795 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300797 if (temp & InterlaceMode)
798 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200799
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300800 if (modeflag & DoubleScanMode)
801 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200802
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530803 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530805 tempax /= tempcx;
806 tempax -= 1;
807 tempbx -= 1;
808 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200809 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
810 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530811 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200812 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
813 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200814 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530815 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200816 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530817 tempax = 0;
818 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530820 if (tempbx & 0x01)
821 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530823 if (tempbx & 0x02)
824 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200825
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200826 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200827 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530828 data &= 0xFF;
829 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530831 if (tempbx & 0x04)
832 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200833
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200834 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200835 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200836}
837
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800838static void XGI_SetCRT1Offset(unsigned short ModeNo,
839 unsigned short ModeIdIndex,
840 unsigned short RefreshRateTableIndex,
841 struct xgi_hw_device_info *HwDeviceExtension,
842 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200843{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530844 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530846 /* GetOffset */
847 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
848 temp = temp >> 8;
849 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530851 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
852 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 if (temp2)
855 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530857 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200858
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530859 switch (temp2) {
860 case 0:
861 temp2 = 1;
862 break;
863 case 1:
864 temp2 = 2;
865 break;
866 case 2:
867 temp2 = 4;
868 break;
869 case 3:
870 temp2 = 4;
871 break;
872 case 4:
873 temp2 = 6;
874 break;
875 case 5:
876 temp2 = 8;
877 break;
878 default:
879 break;
880 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530882 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
883 temp = temp * temp2 + temp2 / 2;
884 else
885 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530887 /* SetOffset */
888 DisplayUnit = temp;
889 temp2 = temp;
890 temp = temp >> 8; /* ah */
891 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200892 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530893 i &= 0xF0;
894 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200895 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530897 temp = (unsigned char) temp2;
898 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200899 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 /* SetDisplayUnit */
902 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
903 temp2 &= InterlaceMode;
904 if (temp2)
905 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 DisplayUnit = DisplayUnit << 5;
908 ah = (DisplayUnit & 0xff00) >> 8;
909 al = DisplayUnit & 0x00ff;
910 if (al == 0)
911 ah += 1;
912 else
913 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200914
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530915 if (HwDeviceExtension->jChipType >= XG20)
916 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
917 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200918
Aaro Koskinen8104e322011-03-13 12:26:22 +0200919 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200920}
921
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200922static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
923 unsigned short ModeIdIndex,
924 unsigned short RefreshRateTableIndex,
925 struct xgi_hw_device_info *HwDeviceExtension,
926 struct vb_device_info *pVBInfo)
927{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200928 unsigned short CRT2Index, VCLKIndex;
929 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200930
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300931 /* si+Ext_ResInfo */
932 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
933 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
934 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200935
936 if (pVBInfo->IF_DEF_LVDS == 0) {
937 CRT2Index = CRT2Index >> 6; /* for LCD */
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200938 if (pVBInfo->VBInfo &
939 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100940 if (pVBInfo->LCDResInfo != Panel_1024x768)
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200941 /* LCDXlat2VCLK */
942 VCLKIndex = VCLK108_2_315 + 5;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200943 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200944 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100945 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200946 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200947 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200948 else
Peter Huewe95072592012-06-14 00:21:48 +0200949 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200950
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200951 if (pVBInfo->SetFlag & TVSimuMode) {
952 if (modeflag & Charx8Dot) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200953 VCLKIndex = TVCLKBASE_315_25 +
954 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200955 } else {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200956 VCLKIndex = TVCLKBASE_315_25 +
957 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200958 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200959 }
960
961 /* 301lv */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300962 if (pVBInfo->VBType & VB_SIS301LV) {
963 if (pVBInfo->SetFlag & RPLLDIV2XO)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200964 VCLKIndex = YPbPr525iVCLK_2;
965 else
966 VCLKIndex = YPbPr525iVCLK;
967 }
968 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200969 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200970 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200971 else
Peter Huewe95072592012-06-14 00:21:48 +0200972 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200973 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300974 /* di+Ext_CRTVCLK */
975 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800976 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300977 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200978 }
979 } else { /* LVDS */
Peter Huewe255aabd2012-02-09 21:11:44 +0100980 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
981 (pVBInfo->LCDResInfo == Panel_320x480))
Peter Huewef477d3e2012-06-14 00:21:47 +0200982 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +0300983 else
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200984 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK,
985 LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200986 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200987
988 return VCLKIndex;
989}
990
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800991static void XGI_SetCRT1VCLK(unsigned short ModeNo,
992 unsigned short ModeIdIndex,
993 struct xgi_hw_device_info *HwDeviceExtension,
994 unsigned short RefreshRateTableIndex,
995 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200996{
Bill Pemberton108afbf2010-06-17 13:10:47 -0400997 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301000 if (pVBInfo->IF_DEF_LVDS == 1) {
1001 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001002 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001003 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1004 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301005 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001006 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301007 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001008 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001009 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1010 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001011 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301012 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1013 RefreshRateTableIndex, HwDeviceExtension,
1014 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001015 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001016 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301017 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301019 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001020 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1021 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301022 } else {
1023 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001024 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001025 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1026 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301027 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001028 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301029 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001030 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301031 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001032
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301033 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001034 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1035 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001036 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001037 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001038 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 index = data;
1040 index &= 0xE0;
1041 data &= 0x1F;
1042 data = data << 1;
1043 data += 1;
1044 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001045 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301046 }
1047 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001048}
1049
Aaro Koskinene85f2032011-11-27 23:03:07 +02001050static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1051{
1052 unsigned char temp;
1053
1054 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1055 temp = (temp & 1) << 6;
1056 /* SR06[6] 18bit Dither */
1057 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1058 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1059 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1060
1061}
1062
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001063static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301064 struct xgi_hw_device_info *HwDeviceExtension,
1065 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001066{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301067 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001068
Aaro Koskinen58839b02011-03-13 12:26:23 +02001069 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301070 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001071 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001072
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001073 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1074 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1075 data &= 0xC0;
1076 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1077 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1078 data |= 0x01;
1079 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001080
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301081 if (HwDeviceExtension->jChipType == XG21)
1082 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001083}
1084
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001085static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1086 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1087 struct vb_device_info *pVBInfo)
1088{
1089 unsigned short data, data2 = 0;
1090 short VCLK;
1091
1092 unsigned char index;
1093
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001094 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1095 index &= IndexMask;
1096 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001097
Aaro Koskinen58839b02011-03-13 12:26:23 +02001098 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001099 data &= 0xf3;
1100 if (VCLK >= 200)
1101 data |= 0x0c; /* VCLK > 200 */
1102
1103 if (HwDeviceExtension->jChipType >= XG20)
1104 data &= ~0x04; /* 2 pixel mode */
1105
Aaro Koskinen8104e322011-03-13 12:26:22 +02001106 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001107
1108 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001109 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001110 data &= 0xE7;
1111 if (VCLK < 200)
1112 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001113 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001114 }
1115
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001116 data2 = 0x00;
1117
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001118 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001119 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001120 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001121
1122}
1123
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001124static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301125 unsigned short ModeNo, unsigned short ModeIdIndex,
1126 unsigned short RefreshRateTableIndex,
1127 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301129 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1130 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001131
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001132 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1133 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001134
Aaro Koskinen58839b02011-03-13 12:26:23 +02001135 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001136 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001137
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001138 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001140 data2 |= 0x02;
1141 data3 = pVBInfo->ModeType - ModeVGA;
1142 data3 = data3 << 2;
1143 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301144 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301146 if (data)
1147 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001148
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001149 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001150 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001151 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301153 data = 0x0000;
1154 if (infoflag & InterlaceMode) {
1155 if (xres == 1024)
1156 data = 0x0035;
1157 else if (xres == 1280)
1158 data = 0x0048;
1159 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001162 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301163 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001164 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301166 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001167 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301169 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 if (modeflag & LineCompareOff)
1172 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001173
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001174 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301175 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001176 data = data ^ 0x60;
1177 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001178 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301180 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1181 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
Aaro Koskinen58839b02011-03-13 12:26:23 +02001183 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301185 if (HwDeviceExtension->jChipType == XG27) {
1186 if (data & 0x40)
1187 data = 0x2c;
1188 else
1189 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001190 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001191 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301192 } else if (HwDeviceExtension->jChipType >= XG20) {
1193 if (data & 0x40)
1194 data = 0x33;
1195 else
1196 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001197 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1198 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301199 } else {
1200 if (data & 0x40)
1201 data = 0x2c;
1202 else
1203 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001204 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301205 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001206
1207}
1208
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001209static void XGI_WriteDAC(unsigned short dl,
1210 unsigned short ah,
1211 unsigned short al,
1212 unsigned short dh,
1213 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001214{
1215 unsigned short temp, bh, bl;
1216
1217 bh = ah;
1218 bl = al;
1219
1220 if (dl != 0) {
1221 temp = bh;
1222 bh = dh;
1223 dh = temp;
1224 if (dl == 1) {
1225 temp = bl;
1226 bl = dh;
1227 dh = temp;
1228 } else {
1229 temp = bl;
1230 bl = bh;
1231 bh = temp;
1232 }
1233 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001234 outb((unsigned short) dh, pVBInfo->P3c9);
1235 outb((unsigned short) bh, pVBInfo->P3c9);
1236 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001237}
1238
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001239static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301240 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001241{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001242 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1243 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001244
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001245 outb(0xFF, pVBInfo->P3c6);
1246 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001248 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301249 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301251 for (k = 0; k < 3; k++) {
1252 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301254 if (data & 0x01)
1255 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301257 if (data & 0x02)
1258 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001260 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301261 data = data >> 2;
1262 }
1263 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001264
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001265 for (i = 16; i < 32; i++) {
1266 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001267
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001268 for (k = 0; k < 3; k++)
1269 outb(data, pVBInfo->P3c9);
1270 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001271
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001272 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001273
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001274 for (m = 0; m < 9; m++) {
1275 di = si;
1276 bx = si + 0x04;
1277 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001278
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001279 for (n = 0; n < 3; n++) {
1280 for (o = 0; o < 5; o++) {
1281 dh = table[si];
1282 ah = table[di];
1283 al = table[bx];
1284 si++;
1285 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301286 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001287
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001288 si -= 2;
1289
1290 for (o = 0; o < 3; o++) {
1291 dh = table[bx];
1292 ah = table[di];
1293 al = table[si];
1294 si--;
1295 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1296 }
1297
1298 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301299 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001300
1301 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301302 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001303}
1304
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001305static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1306 unsigned short ModeIdIndex,
1307 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001308{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301309 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001310
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001311 /* si+Ext_ResInfo */
1312 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001313
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001314 /* si+Ext_ResInfo */
1315 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001316
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001317 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1318 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001319
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001320 if (modeflag & HalfDCLK)
1321 xres = xres << 1;
1322
1323 if (modeflag & DoubleScanMode)
1324 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301326 if (xres == 720)
1327 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301329 pVBInfo->VGAHDE = xres;
1330 pVBInfo->HDE = xres;
1331 pVBInfo->VGAVDE = yres;
1332 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001333}
1334
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001335static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1336 unsigned short ModeIdIndex,
1337 unsigned short RefreshRateTableIndex,
1338 struct vb_device_info *pVBInfo)
1339{
1340 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1341
1342 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1343
1344 tempbx = BX;
1345
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001346 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1347 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001348
1349 tempal = tempal & 0x0f;
1350
1351 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001352 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001353
Peter Huewea3d675c2012-02-09 21:11:47 +01001354 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001355 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001356 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001357 }
1358
1359 if (tempbx & 0x01)
1360 tempal = (tempal >> 4);
1361
1362 tempal = (tempal & 0x0f);
1363 }
1364
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001365 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001366
1367 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1368 if ((tempbx == 5) || (tempbx) == 7)
1369 tempcx = LCDDesDataLen2;
1370 else if ((tempbx == 3) || (tempbx == 8))
1371 tempcx = LVDSDesDataLen2;
1372 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001373
1374 switch (tempbx) {
1375 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001376 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001377 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001378 break;
1379 case 2:
1380 tempdi = XGI_EPLLCDDataPtr;
1381 break;
1382 case 3:
1383 tempdi = XGI_EPLLCDDesDataPtr;
1384 break;
1385 case 4:
1386 tempdi = XGI_LCDDataTable;
1387 break;
1388 case 5:
1389 tempdi = XGI_LCDDesDataTable;
1390 break;
1391 case 6:
1392 tempdi = XGI_EPLCHLCDRegPtr;
1393 break;
1394 case 7:
1395 case 8:
1396 case 9:
1397 tempdi = NULL;
1398 break;
1399 default:
1400 break;
1401 }
1402
1403 if (tempdi == NULL) /* OEMUtil */
1404 return NULL;
1405
1406 table = tempbx;
1407 i = 0;
1408
1409 while (tempdi[i].PANELID != 0xff) {
1410 tempdx = pVBInfo->LCDResInfo;
1411 if (tempbx & 0x0080) { /* OEMUtil */
1412 tempbx &= (~0x0080);
1413 tempdx = pVBInfo->LCDTypeInfo;
1414 }
1415
1416 if (pVBInfo->LCDInfo & EnableScalingLCD)
1417 tempdx &= (~PanelResInfo);
1418
1419 if (tempdi[i].PANELID == tempdx) {
1420 tempbx = tempdi[i].MASK;
1421 tempdx = pVBInfo->LCDInfo;
1422
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001423 if (modeflag & HalfDCLK)
1424 tempdx |= SetLCDLowResolution;
1425
1426 tempbx &= tempdx;
1427 if (tempbx == tempdi[i].CAP)
1428 break;
1429 }
1430 i++;
1431 }
1432
1433 if (table == 0) {
1434 switch (tempdi[i].DATAPTR) {
1435 case 0:
1436 return &XGI_LVDSCRT11024x768_1_H[tempal];
1437 break;
1438 case 1:
1439 return &XGI_LVDSCRT11024x768_2_H[tempal];
1440 break;
1441 case 2:
1442 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1443 break;
1444 case 3:
1445 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1446 break;
1447 case 4:
1448 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1449 break;
1450 case 5:
1451 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1452 break;
1453 case 6:
1454 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1455 break;
1456 case 7:
1457 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1458 break;
1459 case 8:
1460 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1461 break;
1462 case 9:
1463 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1464 break;
1465 case 10:
1466 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1467 break;
1468 default:
1469 break;
1470 }
1471 } else if (table == 1) {
1472 switch (tempdi[i].DATAPTR) {
1473 case 0:
1474 return &XGI_LVDSCRT11024x768_1_V[tempal];
1475 break;
1476 case 1:
1477 return &XGI_LVDSCRT11024x768_2_V[tempal];
1478 break;
1479 case 2:
1480 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1481 break;
1482 case 3:
1483 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1484 break;
1485 case 4:
1486 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1487 break;
1488 case 5:
1489 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1490 break;
1491 case 6:
1492 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1493 break;
1494 case 7:
1495 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1496 break;
1497 case 8:
1498 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1499 break;
1500 case 9:
1501 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1502 break;
1503 case 10:
1504 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1505 break;
1506 default:
1507 break;
1508 }
1509 } else if (table == 2) {
1510 switch (tempdi[i].DATAPTR) {
1511 case 0:
1512 return &XGI_LVDS1024x768Data_1[tempal];
1513 break;
1514 case 1:
1515 return &XGI_LVDS1024x768Data_2[tempal];
1516 break;
1517 case 2:
1518 return &XGI_LVDS1280x1024Data_1[tempal];
1519 break;
1520 case 3:
1521 return &XGI_LVDS1280x1024Data_2[tempal];
1522 break;
1523 case 4:
1524 return &XGI_LVDS1400x1050Data_1[tempal];
1525 break;
1526 case 5:
1527 return &XGI_LVDS1400x1050Data_2[tempal];
1528 break;
1529 case 6:
1530 return &XGI_LVDS1600x1200Data_1[tempal];
1531 break;
1532 case 7:
1533 return &XGI_LVDSNoScalingData[tempal];
1534 break;
1535 case 8:
1536 return &XGI_LVDS1024x768Data_1x75[tempal];
1537 break;
1538 case 9:
1539 return &XGI_LVDS1024x768Data_2x75[tempal];
1540 break;
1541 case 10:
1542 return &XGI_LVDS1280x1024Data_1x75[tempal];
1543 break;
1544 case 11:
1545 return &XGI_LVDS1280x1024Data_2x75[tempal];
1546 break;
1547 case 12:
1548 return &XGI_LVDSNoScalingDatax75[tempal];
1549 break;
1550 default:
1551 break;
1552 }
1553 } else if (table == 3) {
1554 switch (tempdi[i].DATAPTR) {
1555 case 0:
1556 return &XGI_LVDS1024x768Des_1[tempal];
1557 break;
1558 case 1:
1559 return &XGI_LVDS1024x768Des_3[tempal];
1560 break;
1561 case 2:
1562 return &XGI_LVDS1024x768Des_2[tempal];
1563 break;
1564 case 3:
1565 return &XGI_LVDS1280x1024Des_1[tempal];
1566 break;
1567 case 4:
1568 return &XGI_LVDS1280x1024Des_2[tempal];
1569 break;
1570 case 5:
1571 return &XGI_LVDS1400x1050Des_1[tempal];
1572 break;
1573 case 6:
1574 return &XGI_LVDS1400x1050Des_2[tempal];
1575 break;
1576 case 7:
1577 return &XGI_LVDS1600x1200Des_1[tempal];
1578 break;
1579 case 8:
1580 return &XGI_LVDSNoScalingDesData[tempal];
1581 break;
1582 case 9:
1583 return &XGI_LVDS1024x768Des_1x75[tempal];
1584 break;
1585 case 10:
1586 return &XGI_LVDS1024x768Des_3x75[tempal];
1587 break;
1588 case 11:
1589 return &XGI_LVDS1024x768Des_2x75[tempal];
1590 break;
1591 case 12:
1592 return &XGI_LVDS1280x1024Des_1x75[tempal];
1593 break;
1594 case 13:
1595 return &XGI_LVDS1280x1024Des_2x75[tempal];
1596 break;
1597 case 14:
1598 return &XGI_LVDSNoScalingDesDatax75[tempal];
1599 break;
1600 default:
1601 break;
1602 }
1603 } else if (table == 4) {
1604 switch (tempdi[i].DATAPTR) {
1605 case 0:
1606 return &XGI_ExtLCD1024x768Data[tempal];
1607 break;
1608 case 1:
1609 return &XGI_StLCD1024x768Data[tempal];
1610 break;
1611 case 2:
1612 return &XGI_CetLCD1024x768Data[tempal];
1613 break;
1614 case 3:
1615 return &XGI_ExtLCD1280x1024Data[tempal];
1616 break;
1617 case 4:
1618 return &XGI_StLCD1280x1024Data[tempal];
1619 break;
1620 case 5:
1621 return &XGI_CetLCD1280x1024Data[tempal];
1622 break;
1623 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001624 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001625 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001626 break;
1627 case 8:
1628 return &XGI_CetLCD1400x1050Data[tempal];
1629 break;
1630 case 9:
1631 return &XGI_ExtLCD1600x1200Data[tempal];
1632 break;
1633 case 10:
1634 return &XGI_StLCD1600x1200Data[tempal];
1635 break;
1636 case 11:
1637 return &XGI_NoScalingData[tempal];
1638 break;
1639 case 12:
1640 return &XGI_ExtLCD1024x768x75Data[tempal];
1641 break;
1642 case 13:
1643 return &XGI_ExtLCD1024x768x75Data[tempal];
1644 break;
1645 case 14:
1646 return &XGI_CetLCD1024x768x75Data[tempal];
1647 break;
1648 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001649 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001650 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001651 break;
1652 case 17:
1653 return &XGI_CetLCD1280x1024x75Data[tempal];
1654 break;
1655 case 18:
1656 return &XGI_NoScalingDatax75[tempal];
1657 break;
1658 default:
1659 break;
1660 }
1661 } else if (table == 5) {
1662 switch (tempdi[i].DATAPTR) {
1663 case 0:
1664 return &XGI_ExtLCDDes1024x768Data[tempal];
1665 break;
1666 case 1:
1667 return &XGI_StLCDDes1024x768Data[tempal];
1668 break;
1669 case 2:
1670 return &XGI_CetLCDDes1024x768Data[tempal];
1671 break;
1672 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001673 if ((pVBInfo->VBType & VB_SIS301LV) ||
1674 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001675 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1676 else
1677 return &XGI_ExtLCDDes1280x1024Data[tempal];
1678 break;
1679 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001680 if ((pVBInfo->VBType & VB_SIS301LV) ||
1681 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001682 return &XGI_StLCDDLDes1280x1024Data[tempal];
1683 else
1684 return &XGI_StLCDDes1280x1024Data[tempal];
1685 break;
1686 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001687 if ((pVBInfo->VBType & VB_SIS301LV) ||
1688 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001689 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1690 else
1691 return &XGI_CetLCDDes1280x1024Data[tempal];
1692 break;
1693 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001694 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001695 if ((pVBInfo->VBType & VB_SIS301LV) ||
1696 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001697 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001698 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001699 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001700 break;
1701 case 8:
1702 return &XGI_CetLCDDes1400x1050Data[tempal];
1703 break;
1704 case 9:
1705 return &XGI_CetLCDDes1400x1050Data2[tempal];
1706 break;
1707 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001708 if ((pVBInfo->VBType & VB_SIS301LV) ||
1709 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001710 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1711 else
1712 return &XGI_ExtLCDDes1600x1200Data[tempal];
1713 break;
1714 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001715 if ((pVBInfo->VBType & VB_SIS301LV) ||
1716 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001717 return &XGI_StLCDDLDes1600x1200Data[tempal];
1718 else
1719 return &XGI_StLCDDes1600x1200Data[tempal];
1720 break;
1721 case 12:
1722 return &XGI_NoScalingDesData[tempal];
1723 break;
1724 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001725 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001726 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001727 break;
1728 case 15:
1729 return &XGI_CetLCDDes1024x768x75Data[tempal];
1730 break;
1731 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001732 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001733 if ((pVBInfo->VBType & VB_SIS301LV) ||
1734 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001735 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001736 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001737 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001738 break;
1739 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001740 if ((pVBInfo->VBType & VB_SIS301LV) ||
1741 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001742 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1743 else
1744 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1745 break;
1746 case 19:
1747 return &XGI_NoScalingDesDatax75[tempal];
1748 break;
1749 default:
1750 break;
1751 }
1752 } else if (table == 6) {
1753 switch (tempdi[i].DATAPTR) {
1754 case 0:
1755 return &XGI_CH7017LV1024x768[tempal];
1756 break;
1757 case 1:
1758 return &XGI_CH7017LV1400x1050[tempal];
1759 break;
1760 default:
1761 break;
1762 }
1763 }
1764 return NULL;
1765}
1766
Aaro Koskinen24572542012-09-11 00:15:21 +03001767static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001768 unsigned short ModeIdIndex,
1769 unsigned short RefreshRateTableIndex,
1770 struct vb_device_info *pVBInfo)
1771{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001772 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001773
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001774 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1775 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001776 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001777 tempdx = pVBInfo->TVInfo;
1778
1779 if (pVBInfo->VBInfo & SetInSlaveMode)
1780 tempdx = tempdx | SetTVLockMode;
1781
1782 if (modeflag & HalfDCLK)
1783 tempdx = tempdx | SetTVLowResolution;
1784
1785 i = 0;
1786
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001787 while (XGI_TVDataTable[i].MASK != 0xffff) {
1788 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1789 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001790 break;
1791 i++;
1792 }
1793
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001794 switch (XGI_TVDataTable[i].DATAPTR) {
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001795 case 0:
1796 return &XGI_ExtPALData[tempal];
1797 break;
1798 case 1:
1799 return &XGI_ExtNTSCData[tempal];
1800 break;
1801 case 2:
1802 return &XGI_StPALData[tempal];
1803 break;
1804 case 3:
1805 return &XGI_StNTSCData[tempal];
1806 break;
1807 case 4:
1808 return &XGI_ExtHiTVData[tempal];
1809 break;
1810 case 5:
1811 return &XGI_St2HiTVData[tempal];
1812 break;
1813 case 6:
1814 return &XGI_ExtYPbPr525iData[tempal];
1815 break;
1816 case 7:
1817 return &XGI_ExtYPbPr525pData[tempal];
1818 break;
1819 case 8:
1820 return &XGI_ExtYPbPr750pData[tempal];
1821 break;
1822 case 9:
1823 return &XGI_StYPbPr525iData[tempal];
1824 break;
1825 case 10:
1826 return &XGI_StYPbPr525pData[tempal];
1827 break;
1828 case 11:
1829 return &XGI_StYPbPr750pData[tempal];
1830 break;
1831 case 12: /* avoid system hang */
1832 return &XGI_ExtNTSCData[tempal];
1833 break;
1834 case 13:
1835 return &XGI_St1HiTVData[tempal];
1836 break;
1837 default:
1838 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001839 }
1840 return NULL;
1841}
1842
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001843static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301844 unsigned short RefreshRateTableIndex,
1845 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001846{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301847 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001848 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301850 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001851
Peter Huewea3d675c2012-02-09 21:11:47 +01001852 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe51f984b2012-06-14 00:21:51 +02001853 LCDPtr = (struct SiS_LVDSData *)XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301854 ModeNo, ModeIdIndex, RefreshRateTableIndex,
1855 pVBInfo);
1856 pVBInfo->VGAHT = LCDPtr->VGAHT;
1857 pVBInfo->VGAVT = LCDPtr->VGAVT;
1858 pVBInfo->HT = LCDPtr->LCDHT;
1859 pVBInfo->VT = LCDPtr->LCDVT;
1860 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001861
Peter Huewea3d675c2012-02-09 21:11:47 +01001862 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301863 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1864 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001865 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1866 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301867 pVBInfo->HDE = 1024;
1868 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001869 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001870 (pVBInfo->LCDResInfo ==
1871 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301872 pVBInfo->HDE = 1280;
1873 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001874 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301875 pVBInfo->HDE = 1400;
1876 pVBInfo->VDE = 1050;
1877 } else {
1878 pVBInfo->HDE = 1600;
1879 pVBInfo->VDE = 1200;
1880 }
1881 }
1882 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001883}
1884
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001885static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301886 unsigned short RefreshRateTableIndex,
1887 struct xgi_hw_device_info *HwDeviceExtension,
1888 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001889{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301890 unsigned char index;
1891 unsigned short tempbx, i;
1892 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1893 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001894
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001895 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301896 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001897
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001898 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001899
Peter Huewea3d675c2012-02-09 21:11:47 +01001900 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001901 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
1902 XGI_GetLcdPtr(tempbx, ModeNo,
1903 ModeIdIndex,
1904 RefreshRateTableIndex,
1905 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001906
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001907 for (i = 0; i < 8; i++)
1908 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301909 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001910
1911 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1912
1913 tempbx = 1;
1914
Peter Huewea3d675c2012-02-09 21:11:47 +01001915 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001916 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
1917 XGI_GetLcdPtr(
1918 tempbx,
1919 ModeNo,
1920 ModeIdIndex,
1921 RefreshRateTableIndex,
1922 pVBInfo);
1923 for (i = 0; i < 7; i++)
1924 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1925 }
1926
1927 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001928}
1929
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001930static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1931{
1932 unsigned char tempal, tempah, tempbl, i;
1933
Aaro Koskinen58839b02011-03-13 12:26:23 +02001934 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001935 tempal = tempah & 0x0F;
1936 tempah = tempah & 0xF0;
1937 i = 0;
1938 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1939
1940 while (tempbl != 0xFF) {
1941 if (tempbl & 0x80) { /* OEMUtil */
1942 tempal = tempah;
1943 tempbl = tempbl & ~(0x80);
1944 }
1945
1946 if (tempal == tempbl)
1947 break;
1948
1949 i++;
1950
1951 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1952 }
1953
1954 return i;
1955}
1956
1957static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1958{
1959 unsigned short tempah, tempal, tempbl, i;
1960
1961 tempal = pVBInfo->LCDResInfo;
1962 tempah = pVBInfo->LCDTypeInfo;
1963
1964 i = 0;
1965 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1966
1967 while (tempbl != 0xFF) {
1968 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1969 tempal = tempah;
1970 tempbl &= ~0x80;
1971 }
1972
1973 if (tempal == tempbl)
1974 break;
1975
1976 i++;
1977 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1978 }
1979
1980 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001981 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001982 pVBInfo->LCDTypeInfo = 0;
1983 i = 0;
1984 }
1985
1986 return i;
1987}
1988
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001989static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1990 unsigned short *VSyncWidth,
1991 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001992{
1993 unsigned short Index;
1994
1995 Index = XGI_GetLCDCapPtr(pVBInfo);
1996 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1997 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1998
1999 return;
2000}
2001
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002002static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302003 unsigned short RefreshRateTableIndex,
2004 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002005{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302006 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2007 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002008 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302009 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002010
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002011 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03002012 tempbx = 3;
2013 if (pVBInfo->LCDInfo & EnableScalingLCD)
2014 LCDPtr1 =
2015 (struct XGI330_LCDDataDesStruct2 *)
2016 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002017 tempbx,
2018 ModeNo,
2019 ModeIdIndex,
2020 RefreshRateTableIndex,
2021 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002022 else
2023 LCDPtr =
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002024 (struct XGI_LCDDesStruct *)
Aaro Koskinen66cface2011-08-31 21:46:13 +03002025 XGI_GetLcdPtr(
2026 tempbx,
2027 ModeNo,
2028 ModeIdIndex,
2029 RefreshRateTableIndex,
2030 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002031
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002032 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2033 push1 = tempbx;
2034 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002035
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002036 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002037 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2038 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002039 tempax = 1024;
2040 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002041 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2042 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002043 tempax = 1280;
2044 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002045 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002046 tempax = 1400;
2047 tempbx = 1050;
2048 } else {
2049 tempax = 1600;
2050 tempbx = 1200;
2051 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002052
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002053 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2054 pVBInfo->HDE = tempax;
2055 pVBInfo->VDE = tempbx;
2056 pVBInfo->VGAHDE = tempax;
2057 pVBInfo->VGAVDE = tempbx;
2058 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002059
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002060 tempax = pVBInfo->HT;
2061
2062 if (pVBInfo->LCDInfo & EnableScalingLCD)
2063 tempbx = LCDPtr1->LCDHDES;
2064 else
2065 tempbx = LCDPtr->LCDHDES;
2066
2067 tempcx = pVBInfo->HDE;
2068 tempbx = tempbx & 0x0fff;
2069 tempcx += tempbx;
2070
2071 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002072 tempcx -= tempax;
2073
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002074 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002075
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002076 tempcx = tempcx >> 3;
2077 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002078
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002079 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2080 (unsigned short) (tempbx & 0xff));
2081 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2082 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002083
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002084 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002085
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002086 if (pVBInfo->LCDInfo & EnableScalingLCD)
2087 tempbx = LCDPtr1->LCDHRS;
2088 else
2089 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002090
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002091 tempcx = push2;
2092
2093 if (pVBInfo->LCDInfo & EnableScalingLCD)
2094 tempcx = LCDPtr1->LCDHSync;
2095
2096 tempcx += tempbx;
2097
2098 if (tempcx >= tempax)
2099 tempcx -= tempax;
2100
2101 tempax = tempbx & 0x07;
2102 tempax = tempax >> 5;
2103 tempcx = tempcx >> 3;
2104 tempbx = tempbx >> 3;
2105
2106 tempcx &= 0x1f;
2107 tempax |= tempcx;
2108
2109 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2110 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2111 (unsigned short) (tempbx & 0xff));
2112
2113 tempax = pVBInfo->VT;
2114 if (pVBInfo->LCDInfo & EnableScalingLCD)
2115 tempbx = LCDPtr1->LCDVDES;
2116 else
2117 tempbx = LCDPtr->LCDVDES;
2118 tempcx = pVBInfo->VDE;
2119
2120 tempbx = tempbx & 0x0fff;
2121 tempcx += tempbx;
2122 if (tempcx >= tempax)
2123 tempcx -= tempax;
2124
2125 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2126 (unsigned short) (tempbx & 0xff));
2127 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2128 (unsigned short) (tempcx & 0xff));
2129
2130 tempbx = (tempbx >> 8) & 0x07;
2131 tempcx = (tempcx >> 8) & 0x07;
2132
2133 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2134 (unsigned short) ((tempcx << 3)
2135 | tempbx));
2136
2137 tempax = pVBInfo->VT;
2138 if (pVBInfo->LCDInfo & EnableScalingLCD)
2139 tempbx = LCDPtr1->LCDVRS;
2140 else
2141 tempbx = LCDPtr->LCDVRS;
2142
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002143 tempcx = push1;
2144
2145 if (pVBInfo->LCDInfo & EnableScalingLCD)
2146 tempcx = LCDPtr1->LCDVSync;
2147
2148 tempcx += tempbx;
2149 if (tempcx >= tempax)
2150 tempcx -= tempax;
2151
2152 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2153 (unsigned short) (tempbx & 0xff));
2154 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2155 (unsigned short) (tempcx & 0x0f));
2156
2157 tempax = ((tempbx >> 8) & 0x07) << 3;
2158
2159 tempbx = pVBInfo->VGAVDE;
2160 if (tempbx != pVBInfo->VDE)
2161 tempax |= 0x40;
2162
Peter Huewea3d675c2012-02-09 21:11:47 +01002163 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002164 tempax |= 0x40;
2165
2166 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2167 tempax);
2168
2169 tempcx = pVBInfo->VGAVT;
2170 tempbx = pVBInfo->VDE;
2171 tempax = pVBInfo->VGAVDE;
2172 tempcx -= tempax;
2173
2174 temp = tempax; /* 0430 ylshieh */
2175 temp1 = (temp << 18) / tempbx;
2176
2177 tempdx = (unsigned short) ((temp << 18) % tempbx);
2178
2179 if (tempdx != 0)
2180 temp1 += 1;
2181
2182 temp2 = temp1;
2183 push3 = temp2;
2184
2185 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2186 (unsigned short) (temp2 & 0xff));
2187 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2188 (unsigned short) ((temp2 >> 8) & 0xff));
2189
2190 tempbx = (unsigned short) (temp2 >> 16);
2191 tempax = tempbx & 0x03;
2192
2193 tempbx = pVBInfo->VGAVDE;
2194 if (tempbx == pVBInfo->VDE)
2195 tempax |= 0x04;
2196
2197 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2198
2199 if (pVBInfo->VBType & VB_XGI301C) {
2200 temp2 = push3;
2201 xgifb_reg_set(pVBInfo->Part4Port,
2202 0x3c,
2203 (unsigned short) (temp2 & 0xff));
2204 xgifb_reg_set(pVBInfo->Part4Port,
2205 0x3b,
2206 (unsigned short) ((temp2 >> 8) &
2207 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002208 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002209 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2210 ~0xc0,
2211 (unsigned short) ((tempbx &
2212 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002213
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002214 tempcx = pVBInfo->VGAVDE;
2215 if (tempcx == pVBInfo->VDE)
2216 xgifb_reg_and_or(pVBInfo->Part4Port,
2217 0x30, ~0x0c, 0x00);
2218 else
2219 xgifb_reg_and_or(pVBInfo->Part4Port,
2220 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302221 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002222
2223 tempcx = pVBInfo->VGAHDE;
2224 tempbx = pVBInfo->HDE;
2225
2226 temp1 = tempcx << 16;
2227
2228 tempax = (unsigned short) (temp1 / tempbx);
2229
2230 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2231 tempax = 65535;
2232
2233 temp3 = tempax;
2234 temp1 = pVBInfo->VGAHDE << 16;
2235
2236 temp1 /= temp3;
2237 temp3 = temp3 << 16;
2238 temp1 -= 1;
2239
2240 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2241
2242 tempax = (unsigned short) (temp3 & 0xff);
2243 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2244
2245 temp1 = pVBInfo->VGAVDE << 18;
2246 temp1 = temp1 / push3;
2247 tempbx = (unsigned short) (temp1 & 0xffff);
2248
Peter Huewe255aabd2012-02-09 21:11:44 +01002249 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002250 tempbx -= 1;
2251
2252 tempax = ((tempbx >> 8) & 0xff) << 3;
2253 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2254 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2255 (unsigned short) (tempax & 0xff));
2256 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2257 (unsigned short) (tempbx & 0xff));
2258
2259 temp3 = temp3 >> 16;
2260
2261 if (modeflag & HalfDCLK)
2262 temp3 = temp3 >> 1;
2263
2264 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2265 (unsigned short) ((temp3 >> 8) & 0xff));
2266 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2267 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002268}
2269
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002270/* --------------------------------------------------------------------- */
2271/* Function : XGI_GETLCDVCLKPtr */
2272/* Input : */
2273/* Output : al -> VCLK Index */
2274/* Description : */
2275/* --------------------------------------------------------------------- */
2276static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2277 struct vb_device_info *pVBInfo)
2278{
2279 unsigned short index;
2280
Peter Huewea3d675c2012-02-09 21:11:47 +01002281 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002282 index = XGI_GetLCDCapPtr1(pVBInfo);
2283
2284 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2285 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2286 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2287 } else { /* LCDA */
2288 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2289 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2290 }
2291 }
2292 return;
2293}
2294
2295static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2296 unsigned short ModeNo, unsigned short ModeIdIndex,
2297 struct vb_device_info *pVBInfo)
2298{
2299
2300 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002301 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002302
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002303 /* si+Ext_ResInfo */
2304 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002305
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002306 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2307 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002308 index = XGI_GetLCDCapPtr(pVBInfo);
2309 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2310
Peter Huewea3d675c2012-02-09 21:11:47 +01002311 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002312 return tempal;
2313
2314 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002315 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002316 (VB_SIS301B |
2317 VB_SIS302B |
2318 VB_SIS301LV |
2319 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002320 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002321 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002322 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002323 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002324 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002325 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002326 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002327 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002328 tempal = TVCLKBASE_315 +
2329 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002330
2331 }
2332 return tempal;
2333 }
2334
Peter Huewe599801f2012-02-09 21:11:45 +01002335 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002336 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002337 return tempal;
2338 }
2339
Peter Huewe599801f2012-02-09 21:11:45 +01002340 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002341 tempal = YPbPr525pVCLK;
2342 return tempal;
2343 }
2344
2345 tempal = NTSC1024VCLK;
2346
2347 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002348 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002349 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002350 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002351 }
2352
2353 if (pVBInfo->VBInfo & SetCRT2ToTV)
2354 return tempal;
2355 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002356 } /* {End of VB} */
2357
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002358 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002359 tempal = tempal >> 2;
2360 tempal &= 0x03;
2361
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002362 /* for Dot8 Scaling LCD */
2363 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002364 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2365
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002366 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2367 return tempal;
2368}
2369
2370static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2371 unsigned char *di_1, struct vb_device_info *pVBInfo)
2372{
Peter Huewe6896b942012-02-09 21:11:46 +01002373 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2374 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002375 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
2376 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002377 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2378 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2379 }
2380 } else {
2381 *di_0 = XGI_VCLKData[tempal].SR2B;
2382 *di_1 = XGI_VCLKData[tempal].SR2C;
2383 }
2384}
2385
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002386static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302387 unsigned short RefreshRateTableIndex,
2388 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002389{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302390 unsigned char di_0, di_1, tempal;
2391 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302393 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2394 pVBInfo);
2395 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2396 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302398 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002399 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302400 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002401 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302402 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002403 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2404 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302405 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002406 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2407 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302408 }
2409 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002410}
2411
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002412static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302413 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002414{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302415 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002416
Peter Huewe6896b942012-02-09 21:11:46 +01002417 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2418 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302419 tempcl = 0;
2420 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002421 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302423 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002424 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302425 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002426 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302427 if (!(temp & 0x40))
2428 tempcl |= ActiveCRT1;
2429 }
2430 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002431
Aaro Koskinen58839b02011-03-13 12:26:23 +02002432 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302433 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302435 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002436 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002437 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302438 if (tempax & 0x04)
2439 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302441 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302443 if (!(tempcl & ActiveLCD))
2444 if (temp == 0x01)
2445 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302447 if (temp == 0x04)
2448 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302450 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002451 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302453 if (!(temp & 0x08))
2454 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302456 if (!(temp & 0x04))
2457 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002458
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302459 if (temp & 0x02)
2460 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002461
Peter Huewe599801f2012-02-09 21:11:45 +01002462 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302463 if (temp & 0x01)
2464 tempch |= ActiveHiTV;
2465 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002466
Peter Huewe599801f2012-02-09 21:11:45 +01002467 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002468 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302469 pVBInfo->Part2Port,
2470 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302472 if (temp & 0x10)
2473 tempch |= ActiveYPbPr;
2474 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002475
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302476 if (tempch != 0)
2477 tempcl |= ActiveTV;
2478 }
2479 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002480
Aaro Koskinen58839b02011-03-13 12:26:23 +02002481 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302482 if (tempcl & ActiveLCD) {
2483 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2484 if (temp & ActiveTV)
2485 tempcl |= ActiveTV;
2486 }
2487 }
2488 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002489 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002490 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002491
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302492 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002493 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302494 } else {
2495 return;
2496 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002497}
2498
Bill Pemberton80adad82010-06-17 13:10:51 -04002499void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002500{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302501 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002502
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002503 if (pVBInfo->IF_DEF_LVDS != 0)
2504 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002505
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002506 tempbx = VB_SIS302B;
2507 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2508 if (flag == 0x02)
2509 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002510
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002511 tempbx = VB_SIS301;
2512 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2513 if (flag < 0xB0)
2514 goto finish;
2515
2516 tempbx = VB_SIS301B;
2517 if (flag < 0xC0)
2518 goto bigger_than_0xB0;
2519
2520 tempbx = VB_XGI301C;
2521 if (flag < 0xD0)
2522 goto bigger_than_0xB0;
2523
2524 tempbx = VB_SIS301LV;
2525 if (flag < 0xE0)
2526 goto bigger_than_0xB0;
2527
2528 tempbx = VB_SIS302LV;
2529 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2530 if (tempah != 0xFF)
2531 tempbx = VB_XGI301C;
2532
2533bigger_than_0xB0:
2534 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2535 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2536 if (!(flag & 0x02))
2537 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302538 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002539
2540finish:
2541 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002542}
2543
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002544static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302545 struct xgi_hw_device_info *HwDeviceExtension,
2546 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002547{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302548 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002549
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002550 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302551 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002552 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302553 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002554
Miguel Gómezf9317352012-07-06 12:40:48 +02002555 if (!(pVBInfo->VBType & 0xFFFF))
2556 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002557
Miguel Gómezf9317352012-07-06 12:40:48 +02002558 /* Check Display Device */
2559 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2560 tempbx = tempbx | temp;
2561 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2562 push = temp;
2563 push = push << 8;
2564 tempax = temp << 8;
2565 tempbx = tempbx | tempax;
2566 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2567 | SetInSlaveMode | DisableCRT2Display);
2568 temp = 0xFFFF ^ temp;
2569 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002570
Miguel Gómezf9317352012-07-06 12:40:48 +02002571 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002572
Aaro Koskinen4d8f5ca2012-09-11 00:15:17 +03002573 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002574 if (pVBInfo->VBType &
2575 (VB_SIS302B |
2576 VB_SIS301LV |
2577 VB_SIS302LV |
2578 VB_XGI301C)) {
2579 if (temp & EnableDualEdge) {
2580 tempbx |= SetCRT2ToDualEdge;
2581 if (temp & SetToLCDA)
2582 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002583 }
2584 }
2585 }
2586
2587 if (pVBInfo->IF_DEF_YPbPr == 1) {
2588 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2589 ((pVBInfo->VBType & VB_SIS301LV) ||
2590 (pVBInfo->VBType & VB_SIS302LV) ||
2591 (pVBInfo->VBType & VB_XGI301C)))) {
2592 if (temp & SetYPbPr) {
2593 if (pVBInfo->IF_DEF_HiVision == 1) {
2594 /* shampoo add for new
2595 * scratch */
2596 temp = xgifb_reg_get(
2597 pVBInfo->P3d4,
2598 0x35);
2599 temp &= YPbPrMode;
2600 tempbx |= SetCRT2ToHiVision;
2601
2602 if (temp != YPbPrMode1080i) {
2603 tempbx &=
2604 (~SetCRT2ToHiVision);
2605 tempbx |=
2606 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302607 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302608 }
2609 }
2610 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002611 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002612
Miguel Gómezf9317352012-07-06 12:40:48 +02002613 tempax = push; /* restore CR31 */
2614
2615 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302616 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002617 if (pVBInfo->IF_DEF_HiVision == 1)
2618 temp = 0x09FC;
2619 else
2620 temp = 0x097C;
2621 } else {
2622 if (pVBInfo->IF_DEF_HiVision == 1)
2623 temp = 0x01FC;
2624 else
2625 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302626 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002627 } else { /* 3nd party chip */
2628 temp = SetCRT2ToLCD;
2629 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002630
Miguel Gómezf9317352012-07-06 12:40:48 +02002631 if (!(tempbx & temp)) {
2632 tempax |= DisableCRT2Display;
2633 tempbx = 0;
2634 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002635
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002636 if (!(pVBInfo->VBType & VB_NoLCD)) {
2637 if (tempbx & XGI_SetCRT2ToLCDA) {
2638 if (tempbx & SetSimuScanMode)
2639 tempbx &= (~(SetCRT2ToLCD |
2640 SetCRT2ToRAMDAC |
2641 SwitchCRT2));
2642 else
2643 tempbx &= (~(SetCRT2ToLCD |
2644 SetCRT2ToRAMDAC |
2645 SetCRT2ToTV |
2646 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002647 }
2648 }
2649
2650 /* shampoo add */
2651 /* for driver abnormal */
2652 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2653 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2654 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002655 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002656 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002657 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002658 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002659 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302660 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002661 } else {
2662 tempbx &= (~(SetCRT2ToRAMDAC |
2663 SetCRT2ToLCD |
2664 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302665 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002666 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002667
Miguel Gómezf9317352012-07-06 12:40:48 +02002668 if (!(pVBInfo->VBType & VB_NoLCD)) {
2669 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002670 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002671 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002672 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002673 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002674 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302675 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002676 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002677
Miguel Gómezf9317352012-07-06 12:40:48 +02002678 if (tempbx & SetCRT2ToSCART) {
2679 tempbx &= (0xFF00 |
2680 SetCRT2ToSCART |
2681 SwitchCRT2 |
2682 SetSimuScanMode);
2683 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2684 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002685
Miguel Gómezf9317352012-07-06 12:40:48 +02002686 if (pVBInfo->IF_DEF_YPbPr == 1) {
2687 if (tempbx & SetCRT2ToYPbPr525750)
2688 tempbx &= (0xFF00 |
2689 SwitchCRT2 |
2690 SetSimuScanMode);
2691 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002692
Miguel Gómezf9317352012-07-06 12:40:48 +02002693 if (pVBInfo->IF_DEF_HiVision == 1) {
2694 if (tempbx & SetCRT2ToHiVision)
2695 tempbx &= (0xFF00 |
2696 SetCRT2ToHiVision |
2697 SwitchCRT2 |
2698 SetSimuScanMode);
2699 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002700
Miguel Gómezf9317352012-07-06 12:40:48 +02002701 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2702 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2703 tempbx = DisableCRT2Display;
2704 }
2705
2706 if (!(tempbx & DisableCRT2Display)) {
2707 if ((!(tempbx & DriverMode)) ||
2708 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002709 if (!(tempbx & XGI_SetCRT2ToLCDA))
2710 tempbx |= (SetInSlaveMode |
2711 SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02002712 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002713
Miguel Gómezf9317352012-07-06 12:40:48 +02002714 /* LCD+TV can't support in slave mode
2715 * (Force LCDA+TV->LCDB) */
2716 if ((tempbx & SetInSlaveMode) &&
2717 (tempbx & XGI_SetCRT2ToLCDA)) {
2718 tempbx ^= (SetCRT2ToLCD |
2719 XGI_SetCRT2ToLCDA |
2720 SetCRT2ToDualEdge);
2721 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302722 }
2723 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002724
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302725 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002726}
2727
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002728static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302729 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002730{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302731 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002732
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302733 tempbx = 0;
2734 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002735
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302736 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002737 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2738 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302740 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002741 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302742 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002743 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002744 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002745 TVSetPALM |
2746 TVSetPALN |
2747 TVSetPAL);
2748 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002749 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002750 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302751 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002752 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002753 TVSetNTSCJ |
2754 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302755 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302757 if (pVBInfo->IF_DEF_LVDS == 0) {
2758 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002759 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302760 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302762 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002763 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002764 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302765 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302767 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002768 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302770 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002771 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302772 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002773 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302774 }
2775 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302777 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002778 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2779 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302780 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302782 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002783 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2784 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302785 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Peter Huewe599801f2012-02-09 21:11:45 +01002787 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002788 (modeflag > 13) &&
2789 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302790 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302792 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002793
Peter Huewe599801f2012-02-09 21:11:45 +01002794 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302795 if (pVBInfo->VBInfo & SetInSlaveMode)
2796 tempbx &= (~RPLLDIV2XO);
2797 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002798 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01002799 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302800 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002801 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002802 (VB_SIS301B |
2803 VB_SIS302B |
2804 VB_SIS301LV |
2805 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002806 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302807 if (tempbx & TVSimuMode)
2808 tempbx &= (~RPLLDIV2XO);
2809 }
2810 }
2811 }
2812 }
2813 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002814}
2815
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002816static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2817 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002818{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302819 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302821 pVBInfo->LCDResInfo = 0;
2822 pVBInfo->LCDTypeInfo = 0;
2823 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002824
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002825 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2826 /* si+Ext_ResInfo // */
2827 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002828 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302829 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302831 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002832 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002833
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002834 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002835 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302836 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002837 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002838 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302839 tempax &= 0x0F;
2840 else
2841 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302843 if ((resinfo == 6) || (resinfo == 9)) {
2844 if (tempax >= 3)
2845 tempbx |= PanelRef75Hz;
2846 } else if ((resinfo == 7) || (resinfo == 8)) {
2847 if (tempax >= 4)
2848 tempbx |= PanelRef75Hz;
2849 }
2850 }
2851 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302855 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002856
Peter Huewea3d675c2012-02-09 21:11:47 +01002857 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302858 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302860 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002861
Aaro Koskinen58839b02011-03-13 12:26:23 +02002862 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302864 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002865
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302866 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302868 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302870 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302872 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002873 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002874 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302875 tempbx |= SetLCDDualLink;
2876 }
2877 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002878
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302879 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002880 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002881 & SetCRT2ToLCD) && (resinfo == 9) &&
2882 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002883 /*
2884 * set to center in 1280x1024 LCDB
2885 * for Panel_1400x1050
2886 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002887 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302888 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002889
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302890 if (pVBInfo->VBInfo & SetInSlaveMode) {
2891 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002892 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302893 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002894 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302895 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302897 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302899 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002900}
2901
Bill Pemberton108afbf2010-06-17 13:10:47 -04002902unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302903 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002904{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002905 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2906 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2907 break;
2908 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2909 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302910 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302912 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002913}
2914
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002915static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2916{
2917 unsigned char ujRet = 0;
2918 unsigned char i = 0;
2919
2920 for (i = 0; i < 8; i++) {
2921 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002922 ujRet |= (ujDate >> i) & 1;
2923 }
2924
2925 return ujRet;
2926}
2927
2928/*----------------------------------------------------------------------------*/
2929/* output */
2930/* bl[5] : LVDS signal */
2931/* bl[1] : LVDS backlight */
2932/* bl[0] : LVDS VDD */
2933/*----------------------------------------------------------------------------*/
2934static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2935{
2936 unsigned char CR4A, temp;
2937
Aaro Koskinen58839b02011-03-13 12:26:23 +02002938 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002939 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002940
Aaro Koskinen58839b02011-03-13 12:26:23 +02002941 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002942
2943 temp = XG21GPIODataTransfer(temp);
2944 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002945 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002946 return temp;
2947}
2948
2949/*----------------------------------------------------------------------------*/
2950/* output */
2951/* bl[5] : LVDS signal */
2952/* bl[1] : LVDS backlight */
2953/* bl[0] : LVDS VDD */
2954/*----------------------------------------------------------------------------*/
2955static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2956{
2957 unsigned char CR4A, CRB4, temp;
2958
Aaro Koskinen58839b02011-03-13 12:26:23 +02002959 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002960 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002961
Aaro Koskinen58839b02011-03-13 12:26:23 +02002962 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002963
2964 temp &= 0x0C;
2965 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002966 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002967 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002968 temp |= ((CRB4 & 0x04) << 3);
2969 return temp;
2970}
2971
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002972/*----------------------------------------------------------------------------*/
2973/* input */
2974/* bl[5] : 1;LVDS signal on */
2975/* bl[1] : 1;LVDS backlight on */
2976/* bl[0] : 1:LVDS VDD on */
2977/* bh: 100000b : clear bit 5, to set bit5 */
2978/* 000010b : clear bit 1, to set bit1 */
2979/* 000001b : clear bit 0, to set bit0 */
2980/*----------------------------------------------------------------------------*/
2981static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2982 struct vb_device_info *pVBInfo)
2983{
2984 unsigned char CR4A, temp;
2985
2986 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2987 tempbh &= 0x23;
2988 tempbl &= 0x23;
2989 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2990
2991 if (tempbh & 0x20) {
2992 temp = (tempbl >> 4) & 0x02;
2993
2994 /* CR B4[1] */
2995 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2996
2997 }
2998
2999 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3000
3001 temp = XG21GPIODataTransfer(temp);
3002 temp &= ~tempbh;
3003 temp |= tempbl;
3004 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3005}
3006
Aaro Koskinen776115a2011-11-27 23:03:10 +02003007static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3008 struct vb_device_info *pVBInfo)
3009{
3010 unsigned char CR4A, temp;
3011 unsigned short tempbh0, tempbl0;
3012
3013 tempbh0 = tempbh;
3014 tempbl0 = tempbl;
3015 tempbh0 &= 0x20;
3016 tempbl0 &= 0x20;
3017 tempbh0 >>= 3;
3018 tempbl0 >>= 3;
3019
3020 if (tempbh & 0x20) {
3021 temp = (tempbl >> 4) & 0x02;
3022
3023 /* CR B4[1] */
3024 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3025
3026 }
3027 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3028
3029 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3030 tempbh &= 0x03;
3031 tempbl &= 0x03;
3032 tempbh <<= 2;
3033 tempbl <<= 2; /* GPIOC,GPIOD */
3034 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3035 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3036}
3037
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003038static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3039 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303040 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003041{
3042
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003043 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303044 if (pXGIHWDE->jChipType == XG21) {
3045 if (pVBInfo->IF_DEF_LVDS == 1) {
3046 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003047 /* LVDS VDD on */
3048 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003049 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303050 }
3051 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003052 /* LVDS signal on */
3053 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003054 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003055 /* LVDS backlight on */
3056 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303057 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003058 /* DVO/DVI signal on */
3059 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303060 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303062 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003063
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303064 if (pXGIHWDE->jChipType == XG27) {
3065 if (pVBInfo->IF_DEF_LVDS == 1) {
3066 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003067 /* LVDS VDD on */
3068 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003069 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303070 }
3071 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003072 /* LVDS signal on */
3073 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003074 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003075 /* LVDS backlight on */
3076 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303077 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003078 /* DVO/DVI signal on */
3079 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303080 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003081
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303082 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003083}
3084
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003085void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3086 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303087 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003088{
3089
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303090 if (pXGIHWDE->jChipType == XG21) {
3091 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003092 /* LVDS backlight off */
3093 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003094 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303095 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003096 /* DVO/DVI signal off */
3097 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303098 }
3099 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303101 if (pXGIHWDE->jChipType == XG27) {
3102 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003103 /* LVDS backlight off */
3104 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003105 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303106 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303108 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003109 /* DVO/DVI signal off */
3110 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003112
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003113 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003114}
3115
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003116static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003117{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003118 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303119 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003120
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003121 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303122 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003123}
3124
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003125static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003126{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003127 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003128}
3129
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003130static void XGI_SaveCRT2Info(unsigned short ModeNo,
3131 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003132{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303133 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003134
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003135 /* reserve CR34 for CRT1 Mode No */
3136 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303137 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3138 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003139 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003140}
3141
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003142static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3143 unsigned short ModeIdIndex,
3144 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003145{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003147
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003148 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003149 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3150 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3151 /* si+St_ModeFlag */
3152 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003153
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003154 if (modeflag & HalfDCLK)
3155 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003156
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003157 if (modeflag & DoubleScanMode)
3158 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003159
Miguel Gómez3339db82012-07-06 12:40:49 +02003160 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3161 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003162
Miguel Gómez3339db82012-07-06 12:40:49 +02003163 if (pVBInfo->IF_DEF_LVDS == 0) {
3164 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3165 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3166 if (yres == 1024)
3167 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303168 }
3169 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003170
Miguel Gómez3339db82012-07-06 12:40:49 +02003171 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3172 if (yres == 400)
3173 yres = 405;
3174 else if (yres == 350)
3175 yres = 360;
3176
3177 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3178 if (yres == 360)
3179 yres = 375;
3180 }
3181 }
3182
3183 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3184 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3185 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3186 if (yres == 350)
3187 yres = 357;
3188 else if (yres == 400)
3189 yres = 420;
3190 else if (yres == 480)
3191 yres = 525;
3192 }
3193 }
3194 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303195 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003196
Miguel Gómez3339db82012-07-06 12:40:49 +02003197 if (xres == 720)
3198 xres = 640;
3199
3200exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303201 pVBInfo->VGAHDE = xres;
3202 pVBInfo->HDE = xres;
3203 pVBInfo->VGAVDE = yres;
3204 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003205}
3206
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003207static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003208{
3209
Peter Huewea3d675c2012-02-09 21:11:47 +01003210 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003211 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303212 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003215}
3216
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003217static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3218 unsigned short ModeIdIndex,
3219 unsigned short RefreshRateTableIndex,
3220 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003221{
3222 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003223 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003224
3225 pVBInfo->RVBHCMAX = 1;
3226 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003227 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3228 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3229 CRT1Index &= IndexMask;
3230 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3231 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3232 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3233 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3234 tempcx = (unsigned short)
3235 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3236 tempcx &= 0x0100;
3237 tempcx = tempcx << 2;
3238 tempbx |= tempcx;
3239 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003240
3241 if (temp1 & 0x01)
3242 tempbx |= 0x0100;
3243
3244 if (temp1 & 0x20)
3245 tempbx |= 0x0200;
3246 tempax += 5;
3247
3248 if (modeflag & Charx8Dot)
3249 tempax *= 8;
3250 else
3251 tempax *= 9;
3252
3253 pVBInfo->VGAHT = tempax;
3254 pVBInfo->HT = tempax;
3255 tempbx++;
3256 pVBInfo->VGAVT = tempbx;
3257 pVBInfo->VT = tempbx;
3258}
3259
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003260static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303261 unsigned short RefreshRateTableIndex,
3262 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003263{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303264 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003265
Peter Huewefc39dcb2012-01-15 19:22:12 +01003266 struct SiS_LCDData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003267
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003268 /* si+Ext_ResInfo */
3269 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3270 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303271 pVBInfo->NewFlickerMode = 0;
3272 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003273
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303274 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3275 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3276 pVBInfo);
3277 return;
3278 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303280 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003281
Peter Huewea3d675c2012-02-09 21:11:47 +01003282 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003283 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303284 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3285 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003286
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303287 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3288 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3289 pVBInfo->VGAHT = LCDPtr->VGAHT;
3290 pVBInfo->VGAVT = LCDPtr->VGAVT;
3291 pVBInfo->HT = LCDPtr->LCDHT;
3292 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003293
Peter Huewe255aabd2012-02-09 21:11:44 +01003294 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303295 tempax = 1024;
3296 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003297
Peter Huewea3d675c2012-02-09 21:11:47 +01003298 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303299 if (pVBInfo->VGAVDE == 357)
3300 tempbx = 527;
3301 else if (pVBInfo->VGAVDE == 420)
3302 tempbx = 620;
3303 else if (pVBInfo->VGAVDE == 525)
3304 tempbx = 775;
3305 else if (pVBInfo->VGAVDE == 600)
3306 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303307 else
3308 tempbx = 768;
3309 } else
3310 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003311 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303312 tempax = 1024;
3313 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003314 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315 tempax = 1280;
3316 if (pVBInfo->VGAVDE == 360)
3317 tempbx = 768;
3318 else if (pVBInfo->VGAVDE == 375)
3319 tempbx = 800;
3320 else if (pVBInfo->VGAVDE == 405)
3321 tempbx = 864;
3322 else
3323 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003324 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303325 tempax = 1280;
3326 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003327 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303328 tempax = 1280;
3329 if (pVBInfo->VGAVDE == 350)
3330 tempbx = 700;
3331 else if (pVBInfo->VGAVDE == 400)
3332 tempbx = 800;
3333 else if (pVBInfo->VGAVDE == 1024)
3334 tempbx = 960;
3335 else
3336 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003337 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 tempax = 1400;
3339 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003340
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303341 if (pVBInfo->VGAVDE == 1024) {
3342 tempax = 1280;
3343 tempbx = 1024;
3344 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003345 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303346 tempax = 1600;
3347 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003348 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303349 if (pVBInfo->VGAVDE == 350)
3350 tempbx = 875;
3351 else if (pVBInfo->VGAVDE == 400)
3352 tempbx = 1000;
3353 }
3354 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303356 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3357 tempax = pVBInfo->VGAHDE;
3358 tempbx = pVBInfo->VGAVDE;
3359 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003360
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303361 pVBInfo->HDE = tempax;
3362 pVBInfo->VDE = tempbx;
3363 return;
3364 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303366 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03003367 struct SiS_TVData const *TVPtr;
3368
3369 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3370 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003371
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303372 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3373 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3374 pVBInfo->VGAHT = TVPtr->VGAHT;
3375 pVBInfo->VGAVT = TVPtr->VGAVT;
3376 pVBInfo->HDE = TVPtr->TVHDE;
3377 pVBInfo->VDE = TVPtr->TVVDE;
3378 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3379 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003380
Peter Huewe599801f2012-02-09 21:11:45 +01003381 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303382 if (resinfo == 0x08)
3383 pVBInfo->NewFlickerMode = 0x40;
3384 else if (resinfo == 0x09)
3385 pVBInfo->NewFlickerMode = 0x40;
3386 else if (resinfo == 0x12)
3387 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303389 if (pVBInfo->VGAVDE == 350)
3390 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303392 tempax = ExtHiTVHT;
3393 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303395 if (pVBInfo->VBInfo & SetInSlaveMode) {
3396 if (pVBInfo->TVInfo & TVSimuMode) {
3397 tempax = StHiTVHT;
3398 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 if (!(modeflag & Charx8Dot)) {
3401 tempax = StHiTextTVHT;
3402 tempbx = StHiTextTVVT;
3403 }
3404 }
3405 }
Peter Huewe599801f2012-02-09 21:11:45 +01003406 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3407 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303408 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3409 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3410 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003411
Peter Huewe599801f2012-02-09 21:11:45 +01003412 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303413 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3414 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003415 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303416 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3417 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3418 if (pVBInfo->TVInfo & NTSC1024x768)
3419 tempax = NTSC1024x768HT;
3420 }
3421 } else {
3422 tempax = PALHT;
3423 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003424 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303425 tempax = NTSCHT;
3426 tempbx = NTSCVT;
3427 if (pVBInfo->TVInfo & NTSC1024x768)
3428 tempax = NTSC1024x768HT;
3429 }
3430 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303432 pVBInfo->HT = tempax;
3433 pVBInfo->VT = tempbx;
3434 return;
3435 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003436}
3437
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003438static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303439 unsigned short RefreshRateTableIndex,
3440 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003441{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003442 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303444 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3445 pVBInfo);
3446 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3447 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003448
Peter Huewe6896b942012-02-09 21:11:46 +01003449 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303450 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003451 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3452 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3453 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303454 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003455 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3456 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303457 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003458
Aaro Koskinen8104e322011-03-13 12:26:22 +02003459 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303461 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003462 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303463 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003464 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003465}
3466
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003467static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3468 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003469{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003470 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3471 short index;
3472 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303473
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003474 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003475 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303476
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003477 if (index < 0)
3478 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303479
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003480 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303481}
3482
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003483static unsigned short XGI_GetOffset(unsigned short ModeNo,
3484 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303485 unsigned short RefreshRateTableIndex,
3486 struct xgi_hw_device_info *HwDeviceExtension,
3487 struct vb_device_info *pVBInfo)
3488{
3489 unsigned short temp, colordepth, modeinfo, index, infoflag,
3490 ColorDepth[] = { 0x01, 0x02, 0x04 };
3491
3492 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003493 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303494
3495 index = (modeinfo >> 8) & 0xFF;
3496
3497 temp = pVBInfo->ScreenOffset[index];
3498
3499 if (infoflag & InterlaceMode)
3500 temp = temp << 1;
3501
3502 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3503
3504 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3505 temp = ModeNo - 0x7C;
3506 colordepth = ColorDepth[temp];
3507 temp = 0x6B;
3508 if (infoflag & InterlaceMode)
3509 temp = temp << 1;
3510 return temp * colordepth;
3511 } else {
3512 return temp * colordepth;
3513 }
3514}
3515
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003516static void XGI_SetCRT2Offset(unsigned short ModeNo,
3517 unsigned short ModeIdIndex,
3518 unsigned short RefreshRateTableIndex,
3519 struct xgi_hw_device_info *HwDeviceExtension,
3520 struct vb_device_info *pVBInfo)
3521{
3522 unsigned short offset;
3523 unsigned char temp;
3524
3525 if (pVBInfo->VBInfo & SetInSlaveMode)
3526 return;
3527
3528 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3529 HwDeviceExtension, pVBInfo);
3530 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003531 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003532 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003533 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003534 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003535 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003536}
3537
Randy Dunlap89229672010-08-10 08:46:44 -07003538static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003539{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003540 /* threshold high ,disable auto threshold */
3541 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3542 /* threshold low default 04h */
3543 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003544}
3545
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003546static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303547 struct xgi_hw_device_info *HwDeviceExtension,
3548 unsigned short RefreshRateTableIndex,
3549 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003550{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303551 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003552
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003553 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3554 CRT1Index &= IndexMask;
3555 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003556
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303557 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3558 HwDeviceExtension, pVBInfo);
3559 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303561 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003562 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003563
Aaro Koskinen8104e322011-03-13 12:26:22 +02003564 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3565 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003566}
3567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003568static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303569 struct xgi_hw_device_info *HwDeviceExtension,
3570 unsigned short RefreshRateTableIndex,
3571 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003572{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303573 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3574 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003575
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003576 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3577 CRT1Index &= IndexMask;
3578 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3579 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303581 /* bainy change table name */
3582 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003583 /* BTVGA2HT 0x08,0x09 */
3584 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003585 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303586 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003587 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003588 /* BTVGA2HDEE 0x0A,0x0C */
3589 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003590 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303591 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3592 pushbx = pVBInfo->VGAHDE / 2 + 16;
3593 tempcx = tempcx >> 1;
3594 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3595 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003596
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303597 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3598 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003599 tempbx |= ((pVBInfo->
3600 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3601 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303602 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3603 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3604 tempcx &= 0x1F;
3605 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3606 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3607 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3608 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303610 tempbx += 4;
3611 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303613 if (tempcx > (pVBInfo->VGAHT / 2))
3614 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003615
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303616 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003617
Aaro Koskinen8104e322011-03-13 12:26:22 +02003618 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303619 } else {
3620 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003621 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303622 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003623 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003624 /* BTVGA2HDEE 0x0A,0x0C */
3625 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003626 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303627 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3628 pushbx = pVBInfo->VGAHDE + 16;
3629 tempcx = tempcx >> 1;
3630 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3631 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303633 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3634 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003635 tempbx |= ((pVBInfo->
3636 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3637 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303638 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3639 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3640 tempcx &= 0x1F;
3641 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3642 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3643 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3644 tempbx += 16;
3645 tempcx += 16;
3646 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303648 if (tempcx > pVBInfo->VGAHT)
3649 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303651 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003652 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303653 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303655 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3656 tempbx = pushbx;
3657 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3658 tempax |= (tempbx & 0xFF00);
3659 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003660 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303661 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003662 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303663 tempcx = (pVBInfo->VGAVT - 1);
3664 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003665
Aaro Koskinen8104e322011-03-13 12:26:22 +02003666 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303667 tempbx = pVBInfo->VGAVDE - 1;
3668 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003669 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303670 temp = ((tempbx & 0xFF00) << 3) >> 8;
3671 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003672 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303674 tempax = pVBInfo->VGAVDE;
3675 tempbx = pVBInfo->VGAVDE;
3676 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003677 /* BTVGA2VRS 0x10,0x11 */
3678 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3679 /* BTVGA2VRE 0x11 */
3680 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303682 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3683 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3684 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303686 if (temp & 0x04)
3687 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303689 if (temp & 0x080)
3690 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303692 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303694 if (temp & 0x08)
3695 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003696
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303697 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3698 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3699 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003700
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003702 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303703 temp = ((tempbx & 0xFF00) >> 8) << 4;
3704 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003705 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303706 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303708 if (modeflag & DoubleScanMode)
3709 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003710
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303711 if (modeflag & HalfDCLK)
3712 tempax |= 0x40;
3713
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003714 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003715}
3716
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003717static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3718{
3719 unsigned long tempax, tempbx;
3720
3721 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3722 & 0xFFFF;
3723 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3724 tempax = (tempax * pVBInfo->HT) / tempbx;
3725
3726 return (unsigned short) tempax;
3727}
3728
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003729static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303730 struct xgi_hw_device_info *HwDeviceExtension,
3731 unsigned short RefreshRateTableIndex,
3732 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003733{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303734 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3735 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003736
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003737 /* si+Ext_ResInfo */
3738 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3739 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3740 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3741 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3744 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003745
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303746 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003747 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003749
Peter Huewe6896b942012-02-09 21:11:46 +01003750 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303751 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303753 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303755 if (modeflag & HalfDCLK)
3756 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003757
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303758 tempax = (tempax / tempcx) - 1;
3759 tempbx |= ((tempax & 0x00FF) << 8);
3760 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003761 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303763 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303765 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003766 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3767 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303768 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003769
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003770 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3771 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303772 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303773 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003774
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003775 /* 0x05 Horizontal Display Start */
3776 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3777 /* 0x06 Horizontal Blank end */
3778 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303780 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3781 if (pVBInfo->VBInfo & SetCRT2ToTV)
3782 tempax = pVBInfo->VGAHT;
3783 else
3784 tempax = XGI_GetVGAHT2(pVBInfo);
3785 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303787 if (tempax >= pVBInfo->VGAHT)
3788 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303790 if (modeflag & HalfDCLK)
3791 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303793 tempax = (tempax / tempcx) - 5;
3794 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003795 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303796 temp = (tempbx & 0x00FF) - 1;
3797 if (!(modeflag & HalfDCLK)) {
3798 temp -= 6;
3799 if (pVBInfo->TVInfo & TVSimuMode) {
3800 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003801 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303802 }
3803 }
3804 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303805 tempbx = (tempbx & 0xFF00) >> 8;
3806 tempcx = (tempcx + tempbx) >> 1;
3807 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3810 temp -= 1;
3811 if (!(modeflag & HalfDCLK)) {
3812 if ((modeflag & Charx8Dot)) {
3813 temp += 4;
3814 if (pVBInfo->VGAHDE >= 800)
3815 temp -= 6;
3816 }
3817 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003818 } else if (!(modeflag & HalfDCLK)) {
3819 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003820 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003821 pVBInfo->VGAHDE >= 800) {
3822 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003823 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003824 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003825 (pVBInfo->LCDInfo & LCDNonExpanding))
3826 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303827 }
3828 }
3829 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003830
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003831 /* 0x07 Horizontal Retrace Start */
3832 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3833 /* 0x08 Horizontal Retrace End */
3834 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003835
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303836 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3837 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003838 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303839 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003840 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003842 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303843 0x08, 0x03);
3844 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003845 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303846 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003847 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303848 0x08, 0x02);
3849 }
3850 }
3851 }
3852 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003853
Aaro Koskinen8104e322011-03-13 12:26:22 +02003854 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003855 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003856 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303858 tempbx = pVBInfo->VGAVT;
3859 push1 = tempbx;
3860 tempcx = 0x121;
3861 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003862
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303863 if (tempbx == 357)
3864 tempbx = 350;
3865 if (tempbx == 360)
3866 tempbx = 350;
3867 if (tempbx == 375)
3868 tempbx = 350;
3869 if (tempbx == 405)
3870 tempbx = 400;
3871 if (tempbx == 525)
3872 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003873
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303874 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303876 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003877 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003878 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303879 if (tempbx == 350)
3880 tempbx += 5;
3881 if (tempbx == 480)
3882 tempbx += 5;
3883 }
3884 }
3885 }
3886 tempbx--;
3887 temp = tempbx & 0x00FF;
3888 tempbx--;
3889 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003890 /* 0x10 vertical Blank Start */
3891 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303892 tempbx = push2;
3893 tempbx--;
3894 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003895 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303897 if (tempbx & 0x0100)
3898 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003899
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303900 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303902 if (modeflag & DoubleScanMode)
3903 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303905 if (tempbx & 0x0200)
3906 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303908 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003909 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303911 if (tempbx & 0x0400)
3912 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003913
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003914 /* 0x11 Vertival Blank End */
3915 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303916
3917 tempax = push1;
3918 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3919 tempax = tempax >> 2;
3920 push1 = tempax; /* push ax */
3921
3922 if (resinfo != 0x09) {
3923 tempax = tempax << 1;
3924 tempbx += tempax;
3925 }
3926
Peter Huewe599801f2012-02-09 21:11:45 +01003927 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003928 if ((pVBInfo->VBType & VB_SIS301LV) &&
3929 !(pVBInfo->TVInfo & TVSetHiVision)) {
3930 if ((pVBInfo->TVInfo & TVSimuMode) &&
3931 (pVBInfo->TVInfo & TVSetPAL)) {
3932 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3933 !(pVBInfo->TVInfo &
3934 (TVSetYPbPr525p |
3935 TVSetYPbPr750p |
3936 TVSetHiVision)))
3937 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303938 }
3939 } else {
3940 tempbx -= 10;
3941 }
3942 } else {
3943 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01003944 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01003945 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003946 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01003947 (TVSetYPbPr525p |
3948 TVSetYPbPr750p |
3949 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303950 tempbx += 40;
3951 } else {
3952 tempbx += 40;
3953 }
3954 }
3955 }
3956 }
3957 tempax = push1;
3958 tempax = tempax >> 2;
3959 tempax++;
3960 tempax += tempbx;
3961 push1 = tempax; /* push ax */
3962
Peter Huewe599801f2012-02-09 21:11:45 +01003963 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303964 if (tempbx <= 513) {
3965 if (tempax >= 513)
3966 tempbx = 513;
3967 }
3968 }
3969
3970 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003971 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303972 tempbx--;
3973 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003974 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303975
3976 if (tempbx & 0x0100)
3977 tempcx |= 0x0008;
3978
3979 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003980 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303981
3982 tempbx++;
3983
3984 if (tempbx & 0x0100)
3985 tempcx |= 0x0004;
3986
3987 if (tempbx & 0x0200)
3988 tempcx |= 0x0080;
3989
3990 if (tempbx & 0x0400)
3991 tempcx |= 0x0C00;
3992
3993 tempbx = push1; /* pop ax */
3994 temp = tempbx & 0x00FF;
3995 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003996 /* 0x0D vertical Retrace End */
3997 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303998
3999 if (tempbx & 0x0010)
4000 tempcx |= 0x2000;
4001
4002 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004003 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004005 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304006 tempax = modeflag;
4007 temp = (tempax & 0xFF00) >> 8;
4008
4009 temp = (temp >> 1) & 0x09;
4010
Peter Huewe6896b942012-02-09 21:11:46 +01004011 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304012 temp |= 0x01;
4013
Aaro Koskinen8104e322011-03-13 12:26:22 +02004014 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4015 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4016 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304017
4018 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4019 temp = 0x80;
4020 else
4021 temp = 0x00;
4022
Aaro Koskinen8104e322011-03-13 12:26:22 +02004023 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304024
4025 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004026}
4027
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004028static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304029 unsigned short RefreshRateTableIndex,
4030 struct xgi_hw_device_info *HwDeviceExtension,
4031 struct vb_device_info *pVBInfo)
4032{
4033 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4034 modeflag, resinfo, crt2crtc;
4035 unsigned char *TimingPoint;
4036
4037 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4038
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004039 /* si+Ext_ResInfo */
4040 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4041 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4042 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304043
4044 tempax = 0;
4045
4046 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4047 tempax |= 0x0800;
4048
4049 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4050 tempax |= 0x0400;
4051
4052 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4053 tempax |= 0x0200;
4054
Peter Huewe599801f2012-02-09 21:11:45 +01004055 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304056 tempax |= 0x1000;
4057
Peter Huewe599801f2012-02-09 21:11:45 +01004058 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304059 tempax |= 0x0100;
4060
Peter Huewe599801f2012-02-09 21:11:45 +01004061 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304062 tempax &= 0xfe00;
4063
4064 tempax = (tempax & 0xff00) >> 8;
4065
Aaro Koskinen8104e322011-03-13 12:26:22 +02004066 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304067 TimingPoint = pVBInfo->NTSCTiming;
4068
Peter Huewe599801f2012-02-09 21:11:45 +01004069 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304070 TimingPoint = pVBInfo->PALTiming;
4071
Peter Huewe599801f2012-02-09 21:11:45 +01004072 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304073 TimingPoint = pVBInfo->HiTVExtTiming;
4074
4075 if (pVBInfo->VBInfo & SetInSlaveMode)
4076 TimingPoint = pVBInfo->HiTVSt2Timing;
4077
4078 if (pVBInfo->SetFlag & TVSimuMode)
4079 TimingPoint = pVBInfo->HiTVSt1Timing;
4080
4081 if (!(modeflag & Charx8Dot))
4082 TimingPoint = pVBInfo->HiTVTextTiming;
4083 }
4084
Peter Huewe599801f2012-02-09 21:11:45 +01004085 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4086 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304087 TimingPoint = pVBInfo->YPbPr525iTiming;
4088
Peter Huewe599801f2012-02-09 21:11:45 +01004089 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090 TimingPoint = pVBInfo->YPbPr525pTiming;
4091
Peter Huewe599801f2012-02-09 21:11:45 +01004092 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304093 TimingPoint = pVBInfo->YPbPr750pTiming;
4094 }
4095
4096 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004097 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304098
4099 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004100 /* di->temp2[j] */
4101 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304102
4103 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004104 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304105
4106 temp = pVBInfo->NewFlickerMode;
4107 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004108 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304109
Peter Huewe599801f2012-02-09 21:11:45 +01004110 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304111 tempax = 950;
4112
Peter Huewe599801f2012-02-09 21:11:45 +01004113 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304114 tempax = 520;
4115 else
4116 tempax = 440;
4117
4118 if (pVBInfo->VDE <= tempax) {
4119 tempax -= pVBInfo->VDE;
4120 tempax = tempax >> 2;
4121 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4122 push1 = tempax;
4123 temp = (tempax & 0xFF00) >> 8;
4124 temp += (unsigned short) TimingPoint[0];
4125
Peter Huewe6896b942012-02-09 21:11:46 +01004126 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4127 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304128 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4129 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004130 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304131 tempcx = pVBInfo->VGAHDE;
4132 if (tempcx >= 1024) {
4133 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004134 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304135 temp = 0x19; /* PAL */
4136 }
4137 }
4138 }
4139
Aaro Koskinen8104e322011-03-13 12:26:22 +02004140 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304141 tempax = push1;
4142 temp = (tempax & 0xFF00) >> 8;
4143 temp += TimingPoint[1];
4144
Peter Huewe6896b942012-02-09 21:11:46 +01004145 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4146 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304147 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4148 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004149 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304150 tempcx = pVBInfo->VGAHDE;
4151 if (tempcx >= 1024) {
4152 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004153 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304154 temp = 0x52; /* PAL */
4155 }
4156 }
4157 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004158 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304159 }
4160
4161 /* 301b */
4162 tempcx = pVBInfo->HT;
4163
4164 if (XGI_IsLCDDualLink(pVBInfo))
4165 tempcx = tempcx >> 1;
4166
4167 tempcx -= 2;
4168 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004169 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304170
4171 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004172 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304173
4174 tempcx = pVBInfo->HT >> 1;
4175 push1 = tempcx; /* push cx */
4176 tempcx += 7;
4177
Peter Huewe599801f2012-02-09 21:11:45 +01004178 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304179 tempcx -= 4;
4180
4181 temp = tempcx & 0x00FF;
4182 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004183 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184
4185 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4186 tempbx += tempcx;
4187 push2 = tempbx;
4188 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004189 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304190 temp = (tempbx & 0xFF00) >> 8;
4191 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004192 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304193
4194 tempbx = push2;
4195 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004196 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197 tempbx = tempbx - 4;
4198 tempcx = tempbx;
4199 }
4200
4201 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004202 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304203
4204 j += 2;
4205 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4206 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004207 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304208 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004209 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304210
4211 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004212 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304213 tempcx -= 4;
4214
4215 temp = tempcx & 0xFF;
4216 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004217 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304218
4219 tempcx = push1; /* pop cx */
4220 j += 2;
4221 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4222 tempcx -= temp;
4223 temp = tempcx & 0x00FF;
4224 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004225 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304226
4227 tempcx -= 11;
4228
4229 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4230 tempax = XGI_GetVGAHT2(pVBInfo);
4231 tempcx = tempax - 1;
4232 }
4233 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004234 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304235
4236 tempbx = pVBInfo->VDE;
4237
4238 if (pVBInfo->VGAVDE == 360)
4239 tempbx = 746;
4240 if (pVBInfo->VGAVDE == 375)
4241 tempbx = 746;
4242 if (pVBInfo->VGAVDE == 405)
4243 tempbx = 853;
4244
4245 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004246 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004247 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004248 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004249 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304250 tempbx = tempbx >> 1;
4251 } else
4252 tempbx = tempbx >> 1;
4253 }
4254
4255 tempbx -= 2;
4256 temp = tempbx & 0x00FF;
4257
Peter Huewe599801f2012-02-09 21:11:45 +01004258 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004259 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004260 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304261 if (pVBInfo->VBInfo & SetInSlaveMode) {
4262 if (ModeNo == 0x2f)
4263 temp += 1;
4264 }
4265 }
4266 } else {
4267 if (pVBInfo->VBInfo & SetInSlaveMode) {
4268 if (ModeNo == 0x2f)
4269 temp += 1;
4270 }
4271 }
4272 }
4273
Aaro Koskinen8104e322011-03-13 12:26:22 +02004274 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304275
4276 temp = (tempcx & 0xFF00) >> 8;
4277 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4278
Peter Huewe599801f2012-02-09 21:11:45 +01004279 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004280 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004281 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304282 temp |= 0x10;
4283
4284 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4285 temp |= 0x20;
4286 }
4287 } else {
4288 temp |= 0x10;
4289 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4290 temp |= 0x20;
4291 }
4292 }
4293
Aaro Koskinen8104e322011-03-13 12:26:22 +02004294 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304295
Peter Huewe6896b942012-02-09 21:11:46 +01004296 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4297 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304298 tempbx = pVBInfo->VDE;
4299 tempcx = tempbx - 2;
4300
4301 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004302 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4303 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304 tempbx = tempbx >> 1;
4305 }
4306
Peter Huewe6896b942012-02-09 21:11:46 +01004307 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 temp = 0;
4309 if (tempcx & 0x0400)
4310 temp |= 0x20;
4311
4312 if (tempbx & 0x0400)
4313 temp |= 0x40;
4314
Aaro Koskinen8104e322011-03-13 12:26:22 +02004315 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304316 }
4317
4318 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004319 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304320 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004321 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304322 }
4323
4324 tempbx = tempbx & 0x00FF;
4325
4326 if (!(modeflag & HalfDCLK)) {
4327 tempcx = pVBInfo->VGAHDE;
4328 if (tempcx >= pVBInfo->HDE) {
4329 tempbx |= 0x2000;
4330 tempax &= 0x00FF;
4331 }
4332 }
4333
4334 tempcx = 0x0101;
4335
4336 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4337 if (pVBInfo->VGAHDE >= 1024) {
4338 tempcx = 0x1920;
4339 if (pVBInfo->VGAHDE >= 1280) {
4340 tempcx = 0x1420;
4341 tempbx = tempbx & 0xDFFF;
4342 }
4343 }
4344 }
4345
4346 if (!(tempbx & 0x2000)) {
4347 if (modeflag & HalfDCLK)
4348 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4349
4350 push1 = tempbx;
4351 tempeax = pVBInfo->VGAHDE;
4352 tempebx = (tempcx & 0xFF00) >> 8;
4353 longtemp = tempeax * tempebx;
4354 tempecx = tempcx & 0x00FF;
4355 longtemp = longtemp / tempecx;
4356
4357 /* 301b */
4358 tempecx = 8 * 1024;
4359
Peter Huewe6896b942012-02-09 21:11:46 +01004360 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4361 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304362 tempecx = tempecx * 8;
4363 }
4364
4365 longtemp = longtemp * tempecx;
4366 tempecx = pVBInfo->HDE;
4367 temp2 = longtemp % tempecx;
4368 tempeax = longtemp / tempecx;
4369 if (temp2 != 0)
4370 tempeax += 1;
4371
4372 tempax = (unsigned short) tempeax;
4373
4374 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004375 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4376 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304377 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4378 }
4379 /* end 301b */
4380
4381 tempbx = push1;
4382 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4383 | (tempbx & 0x00FF));
4384 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4385 | (tempax & 0x00FF));
4386 temp = (tempax & 0xFF00) >> 8;
4387 } else {
4388 temp = (tempax & 0x00FF) >> 8;
4389 }
4390
Aaro Koskinen8104e322011-03-13 12:26:22 +02004391 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004393 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 temp = tempcx & 0x00FF;
4395
4396 if (tempbx & 0x2000)
4397 temp = 0;
4398
4399 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4400 temp |= 0x18;
4401
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004402 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004403 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304404 tempbx = 0x0382;
4405 tempcx = 0x007e;
4406 } else {
4407 tempbx = 0x0369;
4408 tempcx = 0x0061;
4409 }
4410
4411 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004412 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304413 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004414 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304415
4416 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4417 temp = temp << 2;
4418 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4419
Peter Huewe599801f2012-02-09 21:11:45 +01004420 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304421 temp |= 0x10;
4422
Peter Huewe599801f2012-02-09 21:11:45 +01004423 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304424 temp |= 0x20;
4425
Peter Huewe599801f2012-02-09 21:11:45 +01004426 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304427 temp |= 0x60;
4428 }
4429
Aaro Koskinen8104e322011-03-13 12:26:22 +02004430 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004431 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004432 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304433
Peter Huewe599801f2012-02-09 21:11:45 +01004434 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304435 if (pVBInfo->TVInfo & NTSC1024x768) {
4436 TimingPoint = XGI_NTSC1024AdjTime;
4437 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004438 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304439 TimingPoint[j]);
4440 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004441 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304442 }
4443 }
4444
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004445 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304446 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004447 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004448 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304449 0x08); /* PALM Mode */
4450 }
4451
Peter Huewe599801f2012-02-09 21:11:45 +01004452 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004453 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304454 0x01);
4455 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004456 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304457
Aaro Koskinendc505562011-03-13 12:26:26 +02004458 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304459 }
4460
Peter Huewe599801f2012-02-09 21:11:45 +01004461 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304462 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004463 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304464 }
4465
4466 if (pVBInfo->VBInfo & SetCRT2ToTV)
4467 return;
4468}
4469
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004470static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304471 struct xgi_hw_device_info *HwDeviceExtension,
4472 unsigned short RefreshRateTableIndex,
4473 struct vb_device_info *pVBInfo)
4474{
4475 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4476 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4477
4478 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4479
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004480 /* si+Ext_ResInfo */
4481 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4482 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4483 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4484 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304485
4486 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4487 return;
4488
4489 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4490
4491 if (XGI_IsLCDDualLink(pVBInfo))
4492 tempbx = tempbx >> 1;
4493
4494 tempbx -= 1;
4495 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004496 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304497 temp = (tempbx & 0xFF00) >> 8;
4498 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004499 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304500 temp = 0x01;
4501
Aaro Koskinen8104e322011-03-13 12:26:22 +02004502 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304503 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4504 push1 = tempbx;
4505 tempbx--;
4506 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004507 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004509 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510
4511 tempcx = pVBInfo->VT - 1;
4512 push2 = tempcx + 1;
4513 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004514 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304515 temp = (tempcx & 0xFF00) >> 8;
4516 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004517 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004518 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4519 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4520 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4521 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304522
4523 /* Customized LCDB Des no add */
4524 tempbx = 5;
4525 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
4526 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4527 tempah = pVBInfo->LCDResInfo;
4528 tempah &= PanelResInfo;
4529
Peter Huewe255aabd2012-02-09 21:11:44 +01004530 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304531 tempbx = 1024;
4532 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004533 } else if ((tempah == Panel_1280x1024) ||
4534 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304535 tempbx = 1280;
4536 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004537 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304538 tempbx = 1400;
4539 tempcx = 1050;
4540 } else {
4541 tempbx = 1600;
4542 tempcx = 1200;
4543 }
4544
4545 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4546 tempbx = pVBInfo->HDE;
4547 tempcx = pVBInfo->VDE;
4548 }
4549
4550 pushbx = tempbx;
4551 tempax = pVBInfo->VT;
4552 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4553 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4554 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4555 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4556 tempbx = pVBInfo->LCDVDES;
4557 tempcx += tempbx;
4558
4559 if (tempcx >= tempax)
4560 tempcx -= tempax; /* lcdvdes */
4561
4562 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004563 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304564 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004565 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304566 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4567 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4568 tempah = tempch;
4569 tempah = tempah << 3;
4570 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004571 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304572
4573 /* getlcdsync() */
4574 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4575 tempcx = tempbx;
4576 tempax = pVBInfo->VT;
4577 tempbx = pVBInfo->LCDVRS;
4578
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304579 tempcx += tempbx;
4580 if (tempcx >= tempax)
4581 tempcx -= tempax;
4582
4583 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004584 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304585 temp = (tempbx & 0xFF00) >> 8;
4586 temp = temp << 4;
4587 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004588 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304589 tempcx = pushbx;
4590 tempax = pVBInfo->HT;
4591 tempbx = pVBInfo->LCDHDES;
4592 tempbx &= 0x0FFF;
4593
4594 if (XGI_IsLCDDualLink(pVBInfo)) {
4595 tempax = tempax >> 1;
4596 tempbx = tempbx >> 1;
4597 tempcx = tempcx >> 1;
4598 }
4599
Peter Huewe6896b942012-02-09 21:11:46 +01004600 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304601 tempbx += 1;
4602
4603 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4604 tempbx += 1;
4605
4606 tempcx += tempbx;
4607
4608 if (tempcx >= tempax)
4609 tempcx -= tempax;
4610
4611 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004612 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304613 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004614 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304615 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004616 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304617 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004618 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304619
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304620 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4621 tempcx = tempax;
4622 tempax = pVBInfo->HT;
4623 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624 if (XGI_IsLCDDualLink(pVBInfo)) {
4625 tempax = tempax >> 1;
4626 tempbx = tempbx >> 1;
4627 tempcx = tempcx >> 1;
4628 }
4629
Peter Huewe6896b942012-02-09 21:11:46 +01004630 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304631 tempbx += 1;
4632
4633 tempcx += tempbx;
4634
4635 if (tempcx >= tempax)
4636 tempcx -= tempax;
4637
4638 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004639 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640
4641 temp = (tempbx & 0xFF00) >> 8;
4642 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004643 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304644 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004645 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304646
Peter Huewea3d675c2012-02-09 21:11:47 +01004647 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304648 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004649 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4650 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304651 | VB_XGI301C)) {
4652 temp = 0xC6;
4653 } else
4654 temp = 0xC4;
4655
Aaro Koskinen8104e322011-03-13 12:26:22 +02004656 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4657 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304658 }
4659
4660 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004661 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4662 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304663 | VB_XGI301C)) {
4664 temp = 0x4F;
4665 } else
4666 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004667 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304668 }
4669 }
4670}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004671
4672/* --------------------------------------------------------------------- */
4673/* Function : XGI_GetTap4Ptr */
4674/* Input : */
4675/* Output : di -> Tap4 Reg. Setting Pointer */
4676/* Description : */
4677/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004678static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304679 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004680{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304681 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304683 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004684
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304685 if (tempcx == 0) {
4686 tempax = pVBInfo->VGAHDE;
4687 tempbx = pVBInfo->HDE;
4688 } else {
4689 tempax = pVBInfo->VGAVDE;
4690 tempbx = pVBInfo->VDE;
4691 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004692
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004693 if (tempax <= tempbx)
4694 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304695 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004696 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004697
Peter Huewe599801f2012-02-09 21:11:45 +01004698 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304699 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004700
Peter Huewe599801f2012-02-09 21:11:45 +01004701 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4702 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4703 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004704 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004705 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304706 Tap4TimingPtr = YPbPr750pTap4Timing;
4707 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004708
Peter Huewe599801f2012-02-09 21:11:45 +01004709 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004710 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304712 i = 0;
4713 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4714 if (Tap4TimingPtr[i].DE == tempax)
4715 break;
4716 i++;
4717 }
4718 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004719}
4720
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004721static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004722{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304723 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004724
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304725 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004726
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304727 if (!(pVBInfo->VBType & VB_XGI301C))
4728 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004729
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304730 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4731 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004732 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004733
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004734 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004735 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004736 /* Set Vertical Scaling */
4737 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304738 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004739 xgifb_reg_set(pVBInfo->Part2Port,
4740 i,
4741 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304742 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004743
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004744 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004745 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004746 /* Enable V.Scaling */
4747 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304748 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004749 /* Enable H.Scaling */
4750 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004751}
4752
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004753static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304754 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004755{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304756 unsigned short i;
4757 unsigned char *tempdi;
4758 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004759
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004760 /* si+Ext_ResInfo */
4761 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004762
Aaro Koskinen8104e322011-03-13 12:26:22 +02004763 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004764 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004765 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4766 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304767 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004768 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4769 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4773 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004774
Peter Huewe599801f2012-02-09 21:11:45 +01004775 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004776 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4777 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4778 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304779 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004780
Peter Huewe599801f2012-02-09 21:11:45 +01004781 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4782 & SetCRT2ToYPbPr525750)) {
4783 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304784 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304786 tempdi = pVBInfo->HiTVGroup3Data;
4787 if (pVBInfo->SetFlag & TVSimuMode) {
4788 tempdi = pVBInfo->HiTVGroup3Simu;
4789 if (!(modeflag & Charx8Dot))
4790 tempdi = pVBInfo->HiTVGroup3Text;
4791 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Peter Huewe599801f2012-02-09 21:11:45 +01004793 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304794 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004795
Peter Huewe599801f2012-02-09 21:11:45 +01004796 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304799 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004800 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304802 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004803 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004804 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304805 }
4806 }
4807 return;
4808} /* {end of XGI_SetGroup3} */
4809
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004810static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304811 unsigned short RefreshRateTableIndex,
4812 struct xgi_hw_device_info *HwDeviceExtension,
4813 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004814{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304815 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304817 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004818
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004819 /* si+Ext_ResInfo */
4820 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304821 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004822 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 tempbx = pVBInfo->RVBHCMAX;
4825 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004826 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4828 tempcx = pVBInfo->VGAHT - 1;
4829 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004830 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304832 temp = ((tempcx & 0xFF00) >> 8) << 3;
4833 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304835 tempcx = pVBInfo->VGAVT - 1;
4836 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4837 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304839 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004840 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004842 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004843 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304844 tempcx = pVBInfo->VBInfo;
4845 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304847 if (modeflag & HalfDCLK)
4848 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304850 if (XGI_IsLCDDualLink(pVBInfo))
4851 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004852
Peter Huewe599801f2012-02-09 21:11:45 +01004853 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304854 temp = 0;
4855 if (tempbx <= 1024)
4856 temp = 0xA0;
4857 if (tempbx == 1280)
4858 temp = 0xC0;
4859 } else if (tempcx & SetCRT2ToTV) {
4860 temp = 0xA0;
4861 if (tempbx <= 800)
4862 temp = 0x80;
4863 } else {
4864 temp = 0x80;
4865 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4866 temp = 0;
4867 if (tempbx > 800)
4868 temp = 0x60;
4869 }
4870 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004871
Peter Huewe599801f2012-02-09 21:11:45 +01004872 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304873 temp = 0x00;
4874 if (pVBInfo->VGAHDE == 1280)
4875 temp = 0x40;
4876 if (pVBInfo->VGAHDE == 1024)
4877 temp = 0x20;
4878 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004879 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004880
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304881 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004882
Peter Huewe599801f2012-02-09 21:11:45 +01004883 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304884 if (!(temp & 0xE000))
4885 tempbx = tempbx >> 1;
4886 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304888 tempcx = pVBInfo->RVBHRS;
4889 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004890 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004891
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304892 tempeax = pVBInfo->VGAVDE;
4893 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004894
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304895 if (tempeax <= tempebx) {
4896 tempcx = (tempcx & (~0x4000));
4897 tempeax = pVBInfo->VGAVDE;
4898 } else {
4899 tempeax -= tempebx;
4900 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 templong = (tempeax * 256 * 1024) % tempebx;
4903 tempeax = (tempeax * 256 * 1024) / tempebx;
4904 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304906 if (templong != 0)
4907 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004908
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304909 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004910 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304912 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004913 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304914 tempbx = (unsigned short) (tempebx >> 16);
4915 temp = tempbx & 0x00FF;
4916 temp = temp << 4;
4917 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004918 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304920 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004921 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4922 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304923 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004924 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 tempax = pVBInfo->VGAHDE;
4926 if (modeflag & HalfDCLK)
4927 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004928
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304929 if (XGI_IsLCDDualLink(pVBInfo))
4930 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304932 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4933 if (tempax > 800)
4934 tempax -= 800;
4935 } else {
4936 if (pVBInfo->VGAHDE > 800) {
4937 if (pVBInfo->VGAHDE == 1024)
4938 tempax = (tempax * 25 / 32) - 1;
4939 else
4940 tempax = (tempax * 20 / 32) - 1;
4941 }
4942 }
4943 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304945 temp = (tempax & 0xFF00) >> 8;
4946 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004947 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304948 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004949 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004950
Peter Huewe599801f2012-02-09 21:11:45 +01004951 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304952 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004953 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004954
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304955 }
4956 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4959 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004960 | TVSetYPbPr525p | TVSetYPbPr750p
4961 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304962 temp |= 0x0001;
4963 if ((pVBInfo->VBInfo & SetInSlaveMode)
4964 && (!(pVBInfo->TVInfo
4965 & TVSimuMode)))
4966 temp &= (~0x0001);
4967 }
4968 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004969
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004970 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304971 tempbx = pVBInfo->HT;
4972 if (XGI_IsLCDDualLink(pVBInfo))
4973 tempbx = tempbx >> 1;
4974 tempbx = (tempbx >> 1) - 2;
4975 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004976 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304977 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004978 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304979 }
4980 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004981
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304982 if (pVBInfo->ISXPDOS == 0)
4983 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4984 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004985}
4986
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004987static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4988{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004989 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004990}
4991
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004992static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304993 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004994{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304995 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304997 Pindex = pVBInfo->Part5Port;
4998 Pdata = pVBInfo->Part5Port + 1;
4999 if (pVBInfo->ModeType == ModeVGA) {
5000 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005001 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305002 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305003 }
5004 }
5005 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005006}
5007
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005008static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305009 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005010{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005011 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005012}
5013
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005014static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305015 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005016{
5017
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005018 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005019}
5020
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005021static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5022 unsigned short ModeNo, unsigned short ModeIdIndex,
5023 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005024{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005025 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005026
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005027 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005028 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5029 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5030 /* si+St_ModeFlag */
5031 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005032
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305033 if (!(modeflag & Charx8Dot)) {
5034 xres /= 9;
5035 xres *= 8;
5036 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005037
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005038 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5039 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005040
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005041 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5042 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005043
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005044 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305045 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005046
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005047 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305048 return 0;
5049
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005050 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5051 yres != xgifb_info->lvds_data.LVDSVDE) {
5052 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
5053 if (colordepth > 2)
5054 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305055 }
5056 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005057}
5058
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005059static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5060 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005061 unsigned short ModeNo,
5062 unsigned short ModeIdIndex,
5063 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005064{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305065 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005066 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305067 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5068 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5069 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005070
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005071 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005072 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305073 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005074 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005075
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005076 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005077
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005078 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005079 /* SR35[7] FP VSync polarity */
5080 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5081 /* SR30[5] FP HSync polarity */
5082 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005083
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005084 if (chip_id == XG27)
5085 XGI_SetXG27FPBits(pVBInfo);
5086 else
5087 XGI_SetXG21FPBits(pVBInfo);
5088
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005089 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005090 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5091 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5092 /* si+St_ModeFlag */
5093 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305095 if (!(modeflag & Charx8Dot))
5096 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005097
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005098 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005099
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005100 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305102 if (LVDSHBS > LVDSHT)
5103 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005104
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005105 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305106 if (LVDSHRS > LVDSHT)
5107 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005108
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005109 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305110 if (LVDSHRE > LVDSHT)
5111 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005112
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005113 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005114
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005115 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005116
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005117 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005118 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305119 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305121 if (LVDSVBS > LVDSVT)
5122 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005123
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005124 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305125 if (LVDSVRS > LVDSVT)
5126 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005127
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005128 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 if (LVDSVRE > LVDSVT)
5130 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005131
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005132 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005133
Aaro Koskinen58839b02011-03-13 12:26:23 +02005134 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005135 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005136
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305137 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005138 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305140 /* HT SR0B[1:0] CR00 */
5141 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005142 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005143 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305145 /* HBS SR0B[5:4] CR02 */
5146 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005147 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005148 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305150 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5151 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005152 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5153 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5154 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305156 /* HRS SR0B[7:6] CR04 */
5157 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005158 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005159 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305161 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5162 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005163 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005164 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305166 /* HRE SR0C[2] CR05[4:0] */
5167 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005168 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5169 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305171 /* Panel HRE SR2F[7:2] */
5172 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005173 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305175 /* VT SR0A[0] CR07[5][0] CR06 */
5176 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005177 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5178 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5179 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005180 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005181
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305182 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5183 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005184 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5185 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5186 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005187 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305189 /* VBE SR0A[4] CR16 */
5190 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005191 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005192 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005193
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305194 /* VRS SR0A[3] CR7[7][2] CR10 */
5195 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005196 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5197 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5198 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005199 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005200
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005201 if (chip_id == XG27) {
5202 /* Panel VRS SR35[2:0] SR34[7:0] */
5203 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5204 (value & 0x700) >> 8);
5205 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5206 } else {
5207 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5208 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5209 (value & 0x600) >> 9);
5210 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5211 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5212 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305214 /* VRE SR0A[5] CR11[3:0] */
5215 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005216 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5217 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305219 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005220 if (chip_id == XG27)
5221 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5222 (value << 2) & 0xFC);
5223 else
5224 /* SR3F[7] has to be 0, h/w bug */
5225 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5226 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305228 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005229
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005230 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005231 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005232 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005233 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005234 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305235 value += 0x10;
5236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305238 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005239 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005240 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005241 /* set data, panning = 0, shift left 1 dot*/
5242 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005243
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005244 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005245 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305246
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005247 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305248 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005249
5250}
5251
5252/* --------------------------------------------------------------------- */
5253/* Function : XGI_IsLCDON */
5254/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005255/* Output : 0 : Skip PSC Control */
5256/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005257/* Description : */
5258/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005259static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005260{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305261 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305263 tempax = pVBInfo->VBInfo;
5264 if (tempax & SetCRT2ToDualEdge)
5265 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005266 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305267 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305269 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005270}
5271
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005272/* --------------------------------------------------------------------- */
5273/* Function : XGI_DisableChISLCD */
5274/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005275/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005276/* Description : */
5277/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005278static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005279{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305280 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005281
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305282 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005283 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305285 if (tempbx & (EnableChA | DisableChA)) {
5286 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5287 return 0;
5288 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305290 if (!(tempbx & (EnableChB | DisableChB)))
5291 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305293 if (tempah & 0x01) /* Chk LCDB Mode */
5294 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005295
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305296 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005297}
5298
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005299/* --------------------------------------------------------------------- */
5300/* Function : XGI_EnableChISLCD */
5301/* Input : */
5302/* Output : 0 -> Not LCD mode */
5303/* Description : */
5304/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005305static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005306{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305307 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005308
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305309 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005310 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312 if (tempbx & (EnableChA | DisableChA)) {
5313 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5314 return 0;
5315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005316
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305317 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005318 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005319
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305320 if (tempah & 0x01) /* Chk LCDB Mode */
5321 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005322
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305323 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005324}
5325
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005326static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5327 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305328 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005329{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005330 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005331
Peter Huewe6896b942012-02-09 21:11:46 +01005332 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5333 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305334 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005335 if (!(pVBInfo->VBInfo &
5336 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005337 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305338 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5339 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005340 if (!(pVBInfo->VBInfo &
5341 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005342 /* Disable Channel B */
5343 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305345 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005346 /* force to disable Cahnnel */
5347 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305349 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005350 /* Force to disable Channel B */
5351 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305352 }
5353 }
5354 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005355
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005356 /* disable part4_1f */
5357 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005358
Peter Huewe6896b942012-02-09 21:11:46 +01005359 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005360 if (((pVBInfo->VBInfo &
5361 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5362 || (XGI_DisableChISLCD(pVBInfo))
5363 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005364 /* LVDS Driver power down */
5365 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305366 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005367
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305368 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005369 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305370 | SetSimuScanMode))) {
5371 if (pVBInfo->SetFlag & GatingCRT)
5372 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005373 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305374 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005375
Peter Huewea3d675c2012-02-09 21:11:47 +01005376 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305377 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005378 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005379 /* Power down */
5380 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305381 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005382
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005383 /* disable TV as primary VGA swap */
5384 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305386 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005387 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005388
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005389 if ((pVBInfo->SetFlag & DisableChB) ||
5390 (pVBInfo->VBInfo &
5391 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005392 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005393 (pVBInfo->VBInfo &
5394 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005395 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005396
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005397 if ((pVBInfo->SetFlag & DisableChB) ||
5398 (pVBInfo->VBInfo &
5399 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005400 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005401 (pVBInfo->VBInfo &
5402 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5403 /* save Part1 index 0 */
5404 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5405 /* BTDAC = 1, avoid VB reset */
5406 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5407 /* disable CRT2 */
5408 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5409 /* restore Part1 index 0 */
5410 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305411 }
5412 } else { /* {301} */
5413 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005414 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5415 /* Disable CRT2 */
5416 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5417 /* Disable TV asPrimary VGA swap */
5418 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305419 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005420
Peter Huewea3d675c2012-02-09 21:11:47 +01005421 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305422 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005423 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305424 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005425}
5426
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005427/* --------------------------------------------------------------------- */
5428/* Function : XGI_GetTVPtrIndex */
5429/* Input : */
5430/* Output : */
5431/* Description : bx 0 : ExtNTSC */
5432/* 1 : StNTSC */
5433/* 2 : ExtPAL */
5434/* 3 : StPAL */
5435/* 4 : ExtHiTV */
5436/* 5 : StHiTV */
5437/* 6 : Ext525i */
5438/* 7 : St525i */
5439/* 8 : Ext525p */
5440/* 9 : St525p */
5441/* A : Ext750p */
5442/* B : St750p */
5443/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005444static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005445{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305446 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005447
Peter Huewe599801f2012-02-09 21:11:45 +01005448 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305449 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005450 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305451 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005452 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305453 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005454 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305455 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005456 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305457 tempbx = 10;
5458 if (pVBInfo->TVInfo & TVSimuMode)
5459 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005462}
5463
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005464/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005465/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005466/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005467/* Output : bx 0 : NTSC */
5468/* 1 : PAL */
5469/* 2 : PALM */
5470/* 3 : PALN */
5471/* 4 : NTSC1024x768 */
5472/* 5 : PAL-M 1024x768 */
5473/* 6-7: reserved */
5474/* cl 0 : YFilter1 */
5475/* 1 : YFilter2 */
5476/* ch 0 : 301A */
5477/* 1 : 301B/302B/301LV/302LV */
5478/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005479/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005480static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5481 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005482{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005483 *tempbx = 0;
5484 *tempcl = 0;
5485 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005486
Peter Huewe599801f2012-02-09 21:11:45 +01005487 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005488 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005489
Peter Huewe599801f2012-02-09 21:11:45 +01005490 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005491 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005492
Peter Huewe599801f2012-02-09 21:11:45 +01005493 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005494 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005495
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005496 if (pVBInfo->TVInfo & NTSC1024x768) {
5497 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005498 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005499 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305500 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005501
Peter Huewe6896b942012-02-09 21:11:46 +01005502 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5503 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005504 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5505 & TVSimuMode)) {
5506 *tempbx += 8;
5507 *tempcl += 1;
5508 }
5509 }
5510
Peter Huewe6896b942012-02-09 21:11:46 +01005511 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5512 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005513 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005514}
5515
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005516static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005517{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305518 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005519
Peter Huewe6896b942012-02-09 21:11:46 +01005520 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5521 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005522 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305523 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305524 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005525 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305527 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5528 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005529 if (pVBInfo->VBInfo &
5530 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005531 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005532
Peter Huewea3d675c2012-02-09 21:11:47 +01005533 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305534 tempbl = tempbh;
5535 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005536
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305537 tempbl &= 0x0F;
5538 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005539 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005540
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305541 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5542 | SetCRT2ToTV)) { /* Channel B */
5543 tempah &= 0xF0;
5544 tempah |= tempbl;
5545 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005546
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005547 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5548 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305549 tempah &= 0x0F;
5550 tempah |= tempbh;
5551 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005552 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305553 }
5554 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5555 tempbl = 0;
5556 tempbh = 0;
5557 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005558 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305559 tempah &= 0x0f;
5560 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005561 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305562 tempah);
5563 }
5564 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005565}
5566
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005567static void XGI_SetLCDCap_A(unsigned short tempcx,
5568 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005569{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305570 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005571
Aaro Koskinen58839b02011-03-13 12:26:23 +02005572 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005573
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305574 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005575 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005576 /* Enable Dither */
5577 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005578 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305579 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005580 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305581 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005582 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305583 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005584}
5585
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005586/* --------------------------------------------------------------------- */
5587/* Function : XGI_SetLCDCap_B */
5588/* Input : cx -> LCD Capability */
5589/* Output : */
5590/* Description : */
5591/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005592static void XGI_SetLCDCap_B(unsigned short tempcx,
5593 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005594{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305595 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005596 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305597 (unsigned short) (((tempcx & 0x00ff) >> 6)
5598 | 0x0c));
5599 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005600 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 (unsigned short) (((tempcx & 0x00ff) >> 6)
5602 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005603}
5604
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005605static void XGI_LongWait(struct vb_device_info *pVBInfo)
5606{
5607 unsigned short i;
5608
5609 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5610
5611 if (!(i & 0xC0)) {
5612 for (i = 0; i < 0xFFFF; i++) {
5613 if (!(inb(pVBInfo->P3da) & 0x08))
5614 break;
5615 }
5616
5617 for (i = 0; i < 0xFFFF; i++) {
5618 if ((inb(pVBInfo->P3da) & 0x08))
5619 break;
5620 }
5621 }
5622}
5623
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005624static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005625{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305626 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305628 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005629
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005630 /* disable down spectrum D[4] */
5631 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305632 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005633 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305634 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005635
Aaro Koskinen8104e322011-03-13 12:26:22 +02005636 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305637 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005638 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305639 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005640 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305641 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005642 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305643 pVBInfo->LCDCapList[index].Spectrum_34);
5644 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005645 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005646}
5647
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005648static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5649{
5650 unsigned short tempcx;
5651
5652 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5653
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005654 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005655 (VB_SIS301B |
5656 VB_SIS302B |
5657 VB_SIS301LV |
5658 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005659 VB_XGI301C)) { /* 301LV/302LV only */
5660 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005661 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005662 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005663 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005664 (unsigned char) (tempcx & 0x1F));
5665 }
5666 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005667 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005668 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5669 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5670 | EnablePLLSPLOW)) >> 8));
5671 }
5672
Peter Huewe6896b942012-02-09 21:11:46 +01005673 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5674 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005675 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5676 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005677 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005678 XGI_SetLCDCap_A(tempcx, pVBInfo);
5679
Peter Huewe6896b942012-02-09 21:11:46 +01005680 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005681 if (tempcx & EnableSpectrum)
5682 SetSpectrum(pVBInfo);
5683 }
5684 } else {
5685 /* LVDS,CH7017 */
5686 XGI_SetLCDCap_A(tempcx, pVBInfo);
5687 }
5688}
5689
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005690/* --------------------------------------------------------------------- */
5691/* Function : XGI_SetAntiFlicker */
5692/* Input : */
5693/* Output : */
5694/* Description : Set TV Customized Param. */
5695/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005696static void XGI_SetAntiFlicker(unsigned short ModeNo,
5697 unsigned short ModeIdIndex,
5698 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005699{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005700 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305702 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005703
Peter Huewe599801f2012-02-09 21:11:45 +01005704 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305705 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305707 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5708 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305709 tempah = TVAntiFlickList[tempbx];
5710 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005711
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005712 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005713}
5714
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005715static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5716 unsigned short ModeIdIndex,
5717 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005718{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005719 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305721 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305723 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5724 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305725 tempah = TVEdgeList[tempbx];
5726 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005727
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005728 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005729}
5730
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005731static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005732{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305733 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305735 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005736
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305737 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5740 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005741
Aaro Koskinen8104e322011-03-13 12:26:22 +02005742 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305743 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005744 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305745 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005746 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305747 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005748 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305749 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005750}
5751
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005752static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305753 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005754{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305755 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305757 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305759 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005760
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305761 switch (tempbx) {
5762 case 0x00:
5763 case 0x04:
5764 filterPtr = NTSCYFilter1;
5765 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305767 case 0x01:
5768 filterPtr = PALYFilter1;
5769 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305771 case 0x02:
5772 case 0x05:
5773 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305774 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005775 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305776 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305778 case 0x08:
5779 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305780 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305781 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305782 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005783 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305784 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305786 default:
5787 return;
5788 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005789
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005790 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305791 if (tempcl == 0)
5792 index = tempal * 4;
5793 else
5794 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305796 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005797 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5798 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5799 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5800 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305801 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005802 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5803 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5804 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5805 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305806 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005807
Peter Huewe6896b942012-02-09 21:11:46 +01005808 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5809 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005810 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5811 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5812 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305813 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005814}
5815
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005816/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005817/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005818/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005819/* Output : */
5820/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005821/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005822static void XGI_OEM310Setting(unsigned short ModeNo,
5823 unsigned short ModeIdIndex,
5824 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005825{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005826 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005827
Peter Huewea3d675c2012-02-09 21:11:47 +01005828 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005829 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005830
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005831 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005832 XGI_SetPhaseIncr(pVBInfo);
5833 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5834 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005835
Peter Huewe6896b942012-02-09 21:11:46 +01005836 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005837 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305838 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005839}
5840
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005841/* --------------------------------------------------------------------- */
5842/* Function : XGI_SetCRT2ModeRegs */
5843/* Input : */
5844/* Output : */
5845/* Description : Origin code for crt2group */
5846/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005847static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 struct xgi_hw_device_info *HwDeviceExtension,
5849 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005850{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305851 unsigned short tempbl;
5852 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305854 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305856 tempah = 0;
5857 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005858 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305859 tempah &= ~0x10; /* BTRAMDAC */
5860 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305862 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5863 | SetCRT2ToLCD)) {
5864 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005865 tempcl = pVBInfo->ModeType;
5866 tempcl -= ModeVGA;
5867 if (tempcl >= 0) {
5868 /* BT Color */
5869 tempah = (0x008 >> tempcl);
5870 if (tempah == 0)
5871 tempah = 1;
5872 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305873 }
5874 if (pVBInfo->VBInfo & SetInSlaveMode)
5875 tempah ^= 0x50; /* BTDAC */
5876 }
5877 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005878
Aaro Koskinen8104e322011-03-13 12:26:22 +02005879 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305880 tempah = 0x08;
5881 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005882
Miguel Gómeze123e462012-07-06 12:40:52 +02005883 if (pVBInfo->VBInfo & DisableCRT2Display)
5884 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005885
Miguel Gómeze123e462012-07-06 12:40:52 +02005886 tempah = 0x00;
5887 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005888
Miguel Gómeze123e462012-07-06 12:40:52 +02005889 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5890 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5891 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005892
Miguel Gómeze123e462012-07-06 12:40:52 +02005893 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5894 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5895 tempbl &= 0xf7;
5896 tempah |= 0x01;
5897 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305898 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005899
Miguel Gómeze123e462012-07-06 12:40:52 +02005900 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5901 tempbl &= 0xf7;
5902 tempah |= 0x01;
5903 }
5904
5905 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5906 goto reg_and_or;
5907
5908 tempbl &= 0xf8;
5909 tempah = 0x01;
5910
5911 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5912 tempah |= 0x02;
5913
5914 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5915 tempah = tempah ^ 0x05;
5916 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5917 tempah = tempah ^ 0x01;
5918 }
5919
5920 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5921 tempah |= 0x08;
5922
5923reg_and_or:
5924 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305926 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005927 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305928 tempah &= (~0x08);
5929 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5930 & SetInSlaveMode))) {
5931 tempah |= 0x010;
5932 }
5933 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005934
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305935 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305936 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005937 if (pVBInfo->VBInfo & DriverMode)
5938 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005940
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005941 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305942 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305944 if (pVBInfo->LCDInfo & SetLCDDualLink)
5945 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005946
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305947 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305948 if (pVBInfo->TVInfo & RPLLDIV2XO)
5949 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305950 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005951
Peter Huewe255aabd2012-02-09 21:11:44 +01005952 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5953 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305954 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005955
Peter Huewe255aabd2012-02-09 21:11:44 +01005956 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305957 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005958
Aaro Koskinen8104e322011-03-13 12:26:22 +02005959 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305960 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005961
Peter Huewe6896b942012-02-09 21:11:46 +01005962 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5963 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305964 tempah = 0;
5965 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005966
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305967 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5968 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005969 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305970 tempah |= 0x04; /* shampoo 0129 */
5971 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005972
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005973 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305974 tempah = 0x00;
5975 tempbl = 0xcf;
5976 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5977 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5978 tempah |= 0x30;
5979 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005980
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005981 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305982 tempah = 0;
5983 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005984
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305985 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5986 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5987 tempah |= 0xc0;
5988 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005989 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305990 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305992 tempah = 0;
5993 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005994 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305995 tempbl = 0xff;
5996 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5997 tempah |= 0x80;
5998 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005999
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006000 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006001
Peter Huewe6896b942012-02-09 21:11:46 +01006002 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306003 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006004 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6005 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306006 }
6007 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006008}
6009
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306011void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6012 struct vb_device_info *pVBInfo)
6013{
6014
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006015 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006016
6017}
6018
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306019void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6020 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006021{
6022
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006023 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006024
6025}
6026
Bill Pemberton80adad82010-06-17 13:10:51 -04006027unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006028{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306029 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306031 if (pVBInfo->IF_DEF_LVDS == 1) {
6032 return 1;
6033 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006034 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306035 if ((flag == 1) || (flag == 2))
6036 return 1; /* 301b */
6037 else
6038 return 0;
6039 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006040}
6041
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006042unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6043 unsigned short ModeNo, unsigned short ModeIdIndex,
6044 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006045{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006046 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6047 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6048 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006049
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006050 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006051
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006052 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006053
Aaro Koskinen58839b02011-03-13 12:26:23 +02006054 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006055 index = index >> pVBInfo->SelectCRT2Rate;
6056 index &= 0x0F;
6057
6058 if (pVBInfo->LCDInfo & LCDNonExpanding)
6059 index = 0;
6060
6061 if (index > 0)
6062 index--;
6063
6064 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006065 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006066 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006067 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6068 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006069 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006070 /* 301b */
6071 temp = LCDARefreshIndex[
6072 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006073 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006074 temp = LCDRefreshIndex[
6075 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006076
6077 if (index > temp)
6078 index = temp;
6079 } else {
6080 index = 0;
6081 }
6082 }
6083 }
6084
6085 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6086 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6087 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006088 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6089 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006090 index++;
6091 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006092 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006093 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6094 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006095 index++;
6096 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006097 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6098 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006099 index++;
6100 }
6101 }
6102
6103 i = 0;
6104 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006105 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6106 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006107 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006108 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6109 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006110 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006111 if (temp < pVBInfo->ModeType)
6112 break;
6113 i++;
6114 index--;
6115
6116 } while (index != 0xFFFF);
6117 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6118 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006119 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6120 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006121 if (temp & InterlaceMode)
6122 i++;
6123 }
6124 }
6125 i--;
6126 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
6127 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
6128 RefreshRateTableIndex, &i, pVBInfo);
6129 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02006130 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006131}
6132
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006133static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306134 struct xgi_hw_device_info *HwDeviceExtension,
6135 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006136{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006137 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006138
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006139 pVBInfo->SetFlag |= ProgrammingCRT2;
6140 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6141 ModeIdIndex, pVBInfo);
6142 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6143 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6144 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6145 HwDeviceExtension, pVBInfo);
6146 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6147 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006148}
6149
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006150static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006151 struct xgi_hw_device_info *HwDeviceExtension,
6152 struct vb_device_info *pVBInfo)
6153{
6154 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6155
6156 tempbx = pVBInfo->VBInfo;
6157 pVBInfo->SetFlag |= ProgrammingCRT2;
6158 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6159 pVBInfo->SelectCRT2Rate = 4;
6160 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6161 ModeIdIndex, pVBInfo);
6162 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6163 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6164 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6165 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6166 RefreshRateTableIndex, pVBInfo);
6167 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6168 RefreshRateTableIndex, pVBInfo);
6169 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6170 RefreshRateTableIndex, pVBInfo);
6171 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6172 HwDeviceExtension, pVBInfo);
6173 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6174 RefreshRateTableIndex, pVBInfo);
6175 XGI_SetTap4Regs(pVBInfo);
6176 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6177 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6178 HwDeviceExtension, pVBInfo);
6179 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6180 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6181 XGI_AutoThreshold(pVBInfo);
6182 return 1;
6183}
6184
6185void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6186{
6187 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6188 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6189 0x05, 0x00 };
6190
6191 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6192
6193 unsigned char CR17, CR63, SR31;
6194 unsigned short temp;
6195 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6196
6197 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006198 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006199
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006200 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006201 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006202 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006203 pVBInfo->P3d4, 0x53) | 0x02));
6204
Aaro Koskinen58839b02011-03-13 12:26:23 +02006205 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6206 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6207 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006208
Aaro Koskinen8104e322011-03-13 12:26:22 +02006209 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6210 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006211
Aaro Koskinen58839b02011-03-13 12:26:23 +02006212 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006213 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006214
Aaro Koskinen58839b02011-03-13 12:26:23 +02006215 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006216 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006217
Aaro Koskinen58839b02011-03-13 12:26:23 +02006218 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006219 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006220 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006221 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006222
Aaro Koskinen8104e322011-03-13 12:26:22 +02006223 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006224
6225 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006226 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006227
6228 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006229 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006230 CRTCData[i]);
6231
6232 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006233 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006234 CRTCData[i]);
6235
6236 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006237 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006238 CRTCData[i]);
6239
Aaro Koskinen8104e322011-03-13 12:26:22 +02006240 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006241 & 0xE0));
6242
Aaro Koskinen8104e322011-03-13 12:26:22 +02006243 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6244 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6245 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006246
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006247 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006248
6249 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006250 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6251 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6252 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006253 }
6254
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006255 mdelay(1);
6256
6257 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006258 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006259
6260 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006261 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006262 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006263 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006264
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006265 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006266 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006267
6268 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006269 outb(0, (pVBInfo->P3c8 + 1));
6270 outb(0, (pVBInfo->P3c8 + 1));
6271 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006272 }
6273
Aaro Koskinen8104e322011-03-13 12:26:22 +02006274 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6275 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6276 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006277
Aaro Koskinen58839b02011-03-13 12:26:23 +02006278 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006279 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006280 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006281}
6282
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006283static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6284 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006285 struct vb_device_info *pVBInfo)
6286{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006287 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006288
Peter Huewe6896b942012-02-09 21:11:46 +01006289 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6290 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006291 if (!(pVBInfo->SetFlag & DisableChA)) {
6292 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006293 /* Power on */
6294 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006295 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006296 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6297 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006298 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006299 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006300 }
6301 }
6302 }
6303
6304 if (!(pVBInfo->SetFlag & DisableChB)) {
6305 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6306 & (SetCRT2ToLCD | SetCRT2ToTV
6307 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006308 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006309 pVBInfo->P3c4, 0x32);
6310 tempah &= 0xDF;
6311 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006312 if (!(pVBInfo->VBInfo &
6313 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006314 tempah |= 0x20;
6315 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006316 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006317 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006318
Aaro Koskinen58839b02011-03-13 12:26:23 +02006319 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006320 pVBInfo->Part1Port, 0x2E);
6321
6322 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006323 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006324 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006325 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006326 }
6327 }
6328
6329 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6330 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006331 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006332 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006333 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006334 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006335 if (XGI_EnableChISLCD(pVBInfo) ||
6336 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006337 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006338 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006339 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006340 pVBInfo->Part4Port,
6341 0x2A,
6342 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006343 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006344 /* LVDS Driver power on */
6345 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006346 }
6347 }
6348
6349 tempah = 0x00;
6350
6351 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6352 tempah = 0xc0;
6353
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006354 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6355 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6356 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6357 tempah = tempah & 0x40;
6358 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6359 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006360
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006361 if (pVBInfo->SetFlag & DisableChB)
6362 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006363
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006364 if (pVBInfo->SetFlag & DisableChA)
6365 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006366
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006367 if (pVBInfo->SetFlag & EnableChB)
6368 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006369
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006370 if (pVBInfo->SetFlag & EnableChA)
6371 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006372 }
6373 }
6374
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006375 /* EnablePart4_1F */
6376 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006377
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006378 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006379 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006380 XGI_DisableGatingCRT(HwDeviceExtension,
6381 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006382 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6383 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006384 }
6385 }
6386 } /* 301 */
6387 else { /* LVDS */
6388 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006389 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006390 /* enable CRT2 */
6391 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006392
Aaro Koskinen58839b02011-03-13 12:26:23 +02006393 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006394 0x2E);
6395 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006396 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006397
Aaro Koskinendc505562011-03-13 12:26:26 +02006398 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006399 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006400 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006401}
6402
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006403static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6404 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006405 unsigned short ModeNo, unsigned short ModeIdIndex,
6406 struct vb_device_info *pVBInfo)
6407{
Aaro Koskinena1579612012-04-07 01:14:05 +03006408 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006409
Aaro Koskinena1579612012-04-07 01:14:05 +03006410 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006411 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006412 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6413 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6414 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006415 XGI_ClearExt1Regs(pVBInfo);
6416
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006417 if (HwDeviceExtension->jChipType == XG27) {
6418 if (pVBInfo->IF_DEF_LVDS == 0)
6419 XGI_SetDefaultVCLK(pVBInfo);
6420 }
6421
6422 temp = ~ProgrammingCRT2;
6423 pVBInfo->SetFlag &= temp;
6424 pVBInfo->SelectCRT2Rate = 0;
6425
Peter Huewe6896b942012-02-09 21:11:46 +01006426 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6427 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006428 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006429 | SetInSlaveMode)) {
6430 pVBInfo->SetFlag |= ProgrammingCRT2;
6431 }
6432 }
6433
6434 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6435 ModeIdIndex, pVBInfo);
6436 if (RefreshRateTableIndex != 0xFFFF) {
6437 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6438 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6439 pVBInfo, HwDeviceExtension);
6440 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6441 RefreshRateTableIndex, pVBInfo);
6442 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6443 HwDeviceExtension, pVBInfo);
6444 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6445 RefreshRateTableIndex, pVBInfo);
6446 }
6447
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006448 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006449 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006450 if (temp & 0xA0) {
6451
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006452 if (HwDeviceExtension->jChipType == XG27)
6453 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6454 RefreshRateTableIndex, pVBInfo);
6455 else
6456 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6457 RefreshRateTableIndex, pVBInfo);
6458
6459 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6460 RefreshRateTableIndex);
6461
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006462 xgifb_set_lcd(HwDeviceExtension->jChipType,
6463 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006464
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006465 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006466 xgifb_set_lvds(xgifb_info,
6467 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006468 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006469 }
6470 }
6471
6472 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6473 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6474 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6475 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006476 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006477}
6478
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006479unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6480 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006481 unsigned short ModeNo)
6482{
6483 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006484 struct vb_device_info VBINF;
6485 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006486 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006487 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006488
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006489 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006490 pVBInfo->IF_DEF_YPbPr = 0;
6491 pVBInfo->IF_DEF_HiVision = 0;
6492 pVBInfo->IF_DEF_CRT2Monitor = 0;
6493 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006494 } else {
6495 pVBInfo->IF_DEF_YPbPr = 1;
6496 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006497 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006498 }
6499
6500 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6501 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6502 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6503 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6504 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6505 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6506 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6507 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6508 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6509 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6510 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6511 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6512 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006513 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6514 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6515 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6516 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6517 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006518
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006519 /* for x86 Linux, XG21 LVDS */
6520 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006521 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006522 pVBInfo->IF_DEF_LVDS = 1;
6523 }
6524 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006525 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6526 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006527 pVBInfo->IF_DEF_LVDS = 1;
6528 }
6529 }
6530
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006531 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006532 XGI_GetVBType(pVBInfo);
6533
6534 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006535 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006536 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006537 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006538
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006539 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006540 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6541
6542 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6543
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006544 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006545 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6546 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6547 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006548 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006549
Peter Huewea3d675c2012-02-09 21:11:47 +01006550 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006551 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006552 ModeIdIndex, pVBInfo);
6553
Peter Huewea3d675c2012-02-09 21:11:47 +01006554 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006555 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6556 HwDeviceExtension, pVBInfo);
6557 }
6558 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01006559 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006560 XGI_SetCRT1Group(xgifb_info,
6561 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006562 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006563 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006564 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6565 HwDeviceExtension,
6566 pVBInfo);
6567 }
6568 }
6569 }
6570
Peter Huewe6896b942012-02-09 21:11:46 +01006571 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006572 switch (HwDeviceExtension->ujVBChipID) {
6573 case VB_CHIP_301:
6574 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6575 pVBInfo); /*add for CRT2 */
6576 break;
6577
6578 case VB_CHIP_302:
6579 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6580 pVBInfo); /*add for CRT2 */
6581 break;
6582
6583 default:
6584 break;
6585 }
6586 }
6587
6588 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6589 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006590 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006591 } /* !XG20 */
6592 else {
6593 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006594 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006595 ModeIdIndex,
6596 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006597 return 0;
6598
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006599 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006600 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006601
6602 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006603 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006604
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006605 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006606
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006607 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6608 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006609
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006610 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006611 }
6612
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006613 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6614
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006615 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006616 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006617
6618 return 1;
6619}