blob: 6c1dd0492583b1f4f001d7b37a3b2bad7b0dd987 [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 */
Peter Huewe6896b942012-02-09 21:11:46 +0100261 if ((pVBInfo->VBType & VB_SIS301LV) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800262 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100263 tempax |= SupportYPbPr750p;
Miguel Gómez3b175622012-07-06 12:40:46 +0200264 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
265 ((resinfo == 3) ||
266 (resinfo == 4) ||
267 (resinfo > 7)))
268 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530269 } else {
Peter Huewe6896b942012-02-09 21:11:46 +0100270 tempax |= SupportHiVision;
Miguel Gómez3b175622012-07-06 12:40:46 +0200271 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
272 ((resinfo == 4) ||
273 (resinfo == 3 &&
274 (pVBInfo->SetFlag & TVSimuMode)) ||
275 (resinfo > 7)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530276 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530277 }
278 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800279 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
280 SetCRT2ToSVIDEO |
281 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100282 SetCRT2ToYPbPr525750 |
283 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530284 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200285
Miguel Gómez3b175622012-07-06 12:40:46 +0200286 if (pVBInfo->VBType & (VB_SIS301B |
287 VB_SIS302B |
288 VB_SIS301LV |
289 VB_SIS302LV |
290 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530291 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292
Miguel Gómez3b175622012-07-06 12:40:46 +0200293 if (!(pVBInfo->VBInfo & TVSetPAL) &&
294 (modeflag & NoSupportSimuTV) &&
295 (pVBInfo->VBInfo & SetInSlaveMode) &&
296 (!(pVBInfo->VBInfo & SetNotSimuMode)))
297 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530298 }
299 }
300 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
302 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530304 if (resinfo > 0x08)
305 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200306
Peter Huewe255aabd2012-02-09 21:11:44 +0100307 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530308 if (resinfo > 0x07)
309 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200310
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530311 if (resinfo == 0x04)
312 return 0; /* 512x384 */
313 }
314 }
315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200316
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800317 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
318 tempbx; (*i)--) {
319 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
320 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 if (infoflag & tempax)
322 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530324 if ((*i) == 0)
325 break;
326 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530328 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800329 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
330 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530331 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
332 != tempbx) {
333 return 0;
334 }
335
336 if (infoflag & tempax)
337 return 1;
338 }
339 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200340}
341
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200342static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530343 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200344{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200346
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800347 /* di+0x00 */
348 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530349 sync &= 0xC0;
350 temp = 0x2F;
351 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200352 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353}
354
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200355static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200357{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530358 unsigned char data, data1, pushax;
359 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200360
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800361 /* unlock cr0-7 */
362 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530363 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200364 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530366 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200367 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530369 for (i = 0x01; i <= 0x04; i++) {
370 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200371 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530372 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530374 for (i = 0x05; i <= 0x06; i++) {
375 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200376 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530377 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200378
Aaro Koskinen58839b02011-03-13 12:26:23 +0200379 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530380 j &= 0x1F;
381 data = pVBInfo->TimingH[0].data[7];
382 data &= 0xE0;
383 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200384 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200387 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530388 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200389 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200390 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530391 data1 = data;
392 data1 &= 0xE0;
393 data &= 0x1F;
394 if (data == 0) {
395 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200396 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530397 0x0c);
398 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200399 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 data = pushax;
401 }
402 data = data - 1;
403 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200404 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200405 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 data = data >> 5;
407 data = data + 3;
408 if (data > 7)
409 data = data - 7;
410 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200411 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413}
414
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800415static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
416 unsigned short ModeNo,
417 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200418{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530419 unsigned char data;
420 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 for (i = 0x00; i <= 0x01; i++) {
423 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530427 for (i = 0x02; i <= 0x03; i++) {
428 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200429 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530430 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530432 for (i = 0x04; i <= 0x05; i++) {
433 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200434 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530435 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200436
Aaro Koskinen58839b02011-03-13 12:26:23 +0200437 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530438 j &= 0xC0;
439 data = pVBInfo->TimingV[0].data[6];
440 data &= 0x3F;
441 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200442 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530444 data = pVBInfo->TimingV[0].data[6];
445 data &= 0x80;
446 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200447
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300448 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530449 i &= DoubleScanMode;
450 if (i)
451 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200452
Aaro Koskinen58839b02011-03-13 12:26:23 +0200453 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530454 j &= 0x5F;
455 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200456 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200457}
458
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200459static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
460 unsigned short RefreshRateTableIndex,
461 struct vb_device_info *pVBInfo,
462 struct xgi_hw_device_info *HwDeviceExtension)
463{
464 unsigned char index, data;
465 unsigned short i;
466
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800467 /* Get index */
468 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200469 index = index & IndexMask;
470
Aaro Koskinen58839b02011-03-13 12:26:23 +0200471 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200472 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200473 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200474
475 for (i = 0; i < 8; i++)
476 pVBInfo->TimingH[0].data[i]
477 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
478
479 for (i = 0; i < 7; i++)
480 pVBInfo->TimingV[0].data[i]
481 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
482
483 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
484
485 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
486
487 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200488 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200489}
490
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200491/* --------------------------------------------------------------------- */
492/* Function : XGI_SetXG21CRTC */
493/* Input : Stand or enhance CRTC table */
494/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
495/* Description : Set LCD timing */
496/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200497static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530498 unsigned short RefreshRateTableIndex,
499 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300501 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530502 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200503
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300504 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
505 /* Tempax: CR4 HRS */
506 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
507 Tempcx = Tempax; /* Tempcx: HRS */
508 /* SR2E[7:0]->HRS */
509 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200510
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300511 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
512 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
513 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
514 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
515 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800516
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300517 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
518 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200519
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300520 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
521 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
522 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
523 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300525 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
526 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200527
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300528 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
529 if (Tempax < Tempcx) /* HRE < HRS */
530 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200531
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300532 Temp2 &= 0xFF;
533 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
534 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
535 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
536 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
537 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
538 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
539 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200540
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300541 /* CR10 VRS */
542 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
543 Tempbx = Tempax; /* Tempbx: VRS */
544 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
545 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
546 /* CR7[2][7] VRE */
547 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
548 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
549 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
550 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
551 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
552 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200553
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300554 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
555 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
556 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
557 Tempax &= 0x80;
558 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
559 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
560 /* Tempax: SRA */
561 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
562 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
563 Temp2 = Tempax;
564 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
565 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300567 /* Tempax: CR11 VRE */
568 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
569 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
570 /* Tempbx: SRA */
571 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
572 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
573 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
574 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
575 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
576 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200577
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300578 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
579 if (Tempax < Temp3) /* VRE < VRS */
580 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200581
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300582 Temp2 &= 0xFF;
583 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
584 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
585 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
586 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
587 Tempbx = (unsigned char) Temp1;
588 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
589 Tempax &= 0x7F;
590 /* SR3F D[7:2]->VRE D[1:0]->VRS */
591 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200592}
593
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800594static void XGI_SetXG27CRTC(unsigned short ModeNo,
595 unsigned short ModeIdIndex,
596 unsigned short RefreshRateTableIndex,
597 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200598{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300599 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200600
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300601 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
602 /* Tempax: CR4 HRS */
603 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
604 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
605 /* SR2E[7:0]->HRS */
606 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200607
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300608 /* SR0B */
609 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
610 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
611 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200612
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300613 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
614 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
615 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200616
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300617 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
618 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
619 Tempax <<= 3; /* Tempax[5]: HRE[5] */
620 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200621
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300622 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
623 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200624
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300625 /* Tempax: CR4 HRS */
626 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
627 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
628 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
629 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200630
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300631 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
632 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
633 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
634 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
635 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
636 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
637 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300639 /* CR10 VRS */
640 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
641 /* SR34[7:0]->VRS[7:0] */
642 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200643
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300644 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
645 /* CR7[7][2] VRS[9][8] */
646 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
647 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
648 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
649 Tempax >>= 2; /* Tempax[0]: VRS[8] */
650 /* SR35[0]: VRS[8] */
651 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
652 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
653 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
654 /* Tempax: SR0A */
655 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
656 Tempax &= 0x08; /* SR0A[3] VRS[10] */
657 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200658
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300659 /* Tempax: CR11 VRE */
660 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
661 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
662 /* Tempbx: SR0A */
663 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
664 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
665 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
666 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
667 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
668 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
669 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200670
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300671 if (Tempbx <= Tempcx) /* VRE <= VRS */
672 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200673
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300674 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
675 Tempax = (Tempbx << 2) & 0xFF;
676 /* SR3F[7:2]:VRE[5:0] */
677 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
678 Tempax = Tempcx >> 8;
679 /* SR35[2:0]:VRS[10:8] */
680 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200681}
682
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200683static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
684{
685 unsigned char temp;
686
687 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
688 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
689 temp = (temp & 3) << 6;
690 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
691 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
692 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
693 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
694
695}
696
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300697static void xgifb_set_lcd(int chip_id,
698 struct vb_device_info *pVBInfo,
699 unsigned short RefreshRateTableIndex,
700 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200701{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300702 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400703 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530705 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200706
Aaro Koskinen8104e322011-03-13 12:26:22 +0200707 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
708 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
709 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
710 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300711
712 if (chip_id == XG27) {
713 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
714 if ((Temp & 0x03) == 0) { /* dual 12 */
715 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
716 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
717 }
718 }
719
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300720 if (chip_id == XG27) {
721 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530722 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300723 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
724 if (Temp & 0x01) {
725 /* 18 bits FP */
726 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
727 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
728 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200730
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200731 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200732
Aaro Koskinendc505562011-03-13 12:26:26 +0200733 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
734 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200735
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300736 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
737 if (Data & 0x4000)
738 /* Hsync polarity */
739 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
740 if (Data & 0x8000)
741 /* Vsync polarity */
742 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200743}
744
745/* --------------------------------------------------------------------- */
746/* Function : XGI_UpdateXG21CRTC */
747/* Input : */
748/* Output : CRT1 CRTC */
749/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
750/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800751static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
752 struct vb_device_info *pVBInfo,
753 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200754{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300755 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200756
Aaro Koskinendc505562011-03-13 12:26:26 +0200757 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300758 if (ModeNo == 0x2E &&
759 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
760 RES640x480x60))
761 index = 12;
762 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800763 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300764 index = 13;
765 else if (ModeNo == 0x2F)
766 index = 14;
767 else if (ModeNo == 0x50)
768 index = 15;
769 else if (ModeNo == 0x59)
770 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200773 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530774 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200775 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530776 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200777 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530778 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200779 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530780 pVBInfo->UpdateCRT1[index].CR16);
781 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782}
783
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200784static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530785 unsigned short ModeNo, unsigned short ModeIdIndex,
786 unsigned short RefreshRateTableIndex,
787 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400789 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530791 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200792
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300793 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300795 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
796 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
797 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530799 if (modeflag & HalfDCLK)
800 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200801
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300802 if (modeflag & HalfDCLK)
803 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200804
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300805 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200806
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300807 if (temp & InterlaceMode)
808 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300810 if (modeflag & DoubleScanMode)
811 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530813 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530815 tempax /= tempcx;
816 tempax -= 1;
817 tempbx -= 1;
818 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200819 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
820 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530821 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200822 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
823 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200824 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530825 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200826 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530827 tempax = 0;
828 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530830 if (tempbx & 0x01)
831 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530833 if (tempbx & 0x02)
834 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200835
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200836 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200837 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530838 data &= 0xFF;
839 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530841 if (tempbx & 0x04)
842 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200843
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200844 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200845 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200846}
847
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800848static void XGI_SetCRT1Offset(unsigned short ModeNo,
849 unsigned short ModeIdIndex,
850 unsigned short RefreshRateTableIndex,
851 struct xgi_hw_device_info *HwDeviceExtension,
852 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200853{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530856 /* GetOffset */
857 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
858 temp = temp >> 8;
859 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530861 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
862 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530864 if (temp2)
865 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530867 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530869 switch (temp2) {
870 case 0:
871 temp2 = 1;
872 break;
873 case 1:
874 temp2 = 2;
875 break;
876 case 2:
877 temp2 = 4;
878 break;
879 case 3:
880 temp2 = 4;
881 break;
882 case 4:
883 temp2 = 6;
884 break;
885 case 5:
886 temp2 = 8;
887 break;
888 default:
889 break;
890 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200891
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530892 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
893 temp = temp * temp2 + temp2 / 2;
894 else
895 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530897 /* SetOffset */
898 DisplayUnit = temp;
899 temp2 = temp;
900 temp = temp >> 8; /* ah */
901 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200902 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530903 i &= 0xF0;
904 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200905 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 temp = (unsigned char) temp2;
908 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200909 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530911 /* SetDisplayUnit */
912 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
913 temp2 &= InterlaceMode;
914 if (temp2)
915 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530917 DisplayUnit = DisplayUnit << 5;
918 ah = (DisplayUnit & 0xff00) >> 8;
919 al = DisplayUnit & 0x00ff;
920 if (al == 0)
921 ah += 1;
922 else
923 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530925 if (HwDeviceExtension->jChipType >= XG20)
926 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
927 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200928
Aaro Koskinen8104e322011-03-13 12:26:22 +0200929 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200930}
931
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200932static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
933 unsigned short ModeIdIndex,
934 unsigned short RefreshRateTableIndex,
935 struct xgi_hw_device_info *HwDeviceExtension,
936 struct vb_device_info *pVBInfo)
937{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200938 unsigned short CRT2Index, VCLKIndex;
939 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200940
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300941 /* si+Ext_ResInfo */
942 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
943 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
944 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200945
946 if (pVBInfo->IF_DEF_LVDS == 0) {
947 CRT2Index = CRT2Index >> 6; /* for LCD */
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200948 if (pVBInfo->VBInfo &
949 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100950 if (pVBInfo->LCDResInfo != Panel_1024x768)
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200951 /* LCDXlat2VCLK */
952 VCLKIndex = VCLK108_2_315 + 5;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200953 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200954 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100955 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200956 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200957 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200958 else
Peter Huewe95072592012-06-14 00:21:48 +0200959 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200960
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200961 if (pVBInfo->SetFlag & TVSimuMode) {
962 if (modeflag & Charx8Dot) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200963 VCLKIndex = TVCLKBASE_315_25 +
964 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200965 } else {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200966 VCLKIndex = TVCLKBASE_315_25 +
967 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200968 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200969 }
970
971 /* 301lv */
Peter Huewe6896b942012-02-09 21:11:46 +0100972 if ((pVBInfo->VBType & VB_SIS301LV) &&
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200973 !(pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100974 if (pVBInfo->VBExtInfo == YPbPr750p)
Peter Huewea3d675c2012-02-09 21:11:47 +0100975 VCLKIndex = XGI_YPbPr750pVCLK;
Peter Huewe6896b942012-02-09 21:11:46 +0100976 else if (pVBInfo->VBExtInfo == YPbPr525p)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200977 VCLKIndex = YPbPr525pVCLK;
978 else if (pVBInfo->SetFlag & RPLLDIV2XO)
979 VCLKIndex = YPbPr525iVCLK_2;
980 else
981 VCLKIndex = YPbPr525iVCLK;
982 }
983 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200984 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200985 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200986 else
Peter Huewe95072592012-06-14 00:21:48 +0200987 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200988 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300989 /* di+Ext_CRTVCLK */
990 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800991 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300992 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200993 }
994 } else { /* LVDS */
Peter Huewe255aabd2012-02-09 21:11:44 +0100995 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
996 (pVBInfo->LCDResInfo == Panel_320x480))
Peter Huewef477d3e2012-06-14 00:21:47 +0200997 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +0300998 else
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200999 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK,
1000 LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001001 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001002
1003 return VCLKIndex;
1004}
1005
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001006static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1007 unsigned short ModeIdIndex,
1008 struct xgi_hw_device_info *HwDeviceExtension,
1009 unsigned short RefreshRateTableIndex,
1010 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001011{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001012 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301013 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001014
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301015 if (pVBInfo->IF_DEF_LVDS == 1) {
1016 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001017 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1019 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301020 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001021 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301022 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001023 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001024 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1025 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001026 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301027 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1028 RefreshRateTableIndex, HwDeviceExtension,
1029 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001030 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001031 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301032 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001033 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301034 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001035 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1036 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301037 } else {
1038 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001039 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001040 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1041 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301042 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001043 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301044 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001045 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301046 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301048 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001049 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1050 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001051 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001052 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001053 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301054 index = data;
1055 index &= 0xE0;
1056 data &= 0x1F;
1057 data = data << 1;
1058 data += 1;
1059 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001060 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301061 }
1062 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001063}
1064
Aaro Koskinene85f2032011-11-27 23:03:07 +02001065static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1066{
1067 unsigned char temp;
1068
1069 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1070 temp = (temp & 1) << 6;
1071 /* SR06[6] 18bit Dither */
1072 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1073 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1074 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1075
1076}
1077
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001078static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301079 struct xgi_hw_device_info *HwDeviceExtension,
1080 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001081{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301082 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001083
Aaro Koskinen58839b02011-03-13 12:26:23 +02001084 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301085 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001086 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001087
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001088 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1089 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1090 data &= 0xC0;
1091 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1092 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1093 data |= 0x01;
1094 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301096 if (HwDeviceExtension->jChipType == XG21)
1097 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001098}
1099
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001100static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1101 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1102 struct vb_device_info *pVBInfo)
1103{
1104 unsigned short data, data2 = 0;
1105 short VCLK;
1106
1107 unsigned char index;
1108
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001109 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1110 index &= IndexMask;
1111 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001112
Aaro Koskinen58839b02011-03-13 12:26:23 +02001113 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001114 data &= 0xf3;
1115 if (VCLK >= 200)
1116 data |= 0x0c; /* VCLK > 200 */
1117
1118 if (HwDeviceExtension->jChipType >= XG20)
1119 data &= ~0x04; /* 2 pixel mode */
1120
Aaro Koskinen8104e322011-03-13 12:26:22 +02001121 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001122
1123 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001124 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001125 data &= 0xE7;
1126 if (VCLK < 200)
1127 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001128 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001129 }
1130
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001131 data2 = 0x00;
1132
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001133 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001134 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001135 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001136
1137}
1138
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001139static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301140 unsigned short ModeNo, unsigned short ModeIdIndex,
1141 unsigned short RefreshRateTableIndex,
1142 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001143{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301144 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1145 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001147 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1148 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001149
Aaro Koskinen58839b02011-03-13 12:26:23 +02001150 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001151 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001153 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301154 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001155 data2 |= 0x02;
1156 data3 = pVBInfo->ModeType - ModeVGA;
1157 data3 = data3 << 2;
1158 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301159 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 if (data)
1162 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001163
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001164 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001165 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001166 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001167
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301168 data = 0x0000;
1169 if (infoflag & InterlaceMode) {
1170 if (xres == 1024)
1171 data = 0x0035;
1172 else if (xres == 1280)
1173 data = 0x0048;
1174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301176 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001177 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301178 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001179 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301181 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001182 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301184 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301186 if (modeflag & LineCompareOff)
1187 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001188
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001189 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301190 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001191 data = data ^ 0x60;
1192 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001193 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001194
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301195 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1196 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001197
Aaro Koskinen58839b02011-03-13 12:26:23 +02001198 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301200 if (HwDeviceExtension->jChipType == XG27) {
1201 if (data & 0x40)
1202 data = 0x2c;
1203 else
1204 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001205 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001206 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301207 } else if (HwDeviceExtension->jChipType >= XG20) {
1208 if (data & 0x40)
1209 data = 0x33;
1210 else
1211 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001212 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1213 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301214 } else {
1215 if (data & 0x40)
1216 data = 0x2c;
1217 else
1218 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001219 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301220 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001221
1222}
1223
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001224static void XGI_WriteDAC(unsigned short dl,
1225 unsigned short ah,
1226 unsigned short al,
1227 unsigned short dh,
1228 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001229{
1230 unsigned short temp, bh, bl;
1231
1232 bh = ah;
1233 bl = al;
1234
1235 if (dl != 0) {
1236 temp = bh;
1237 bh = dh;
1238 dh = temp;
1239 if (dl == 1) {
1240 temp = bl;
1241 bl = dh;
1242 dh = temp;
1243 } else {
1244 temp = bl;
1245 bl = bh;
1246 bh = temp;
1247 }
1248 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001249 outb((unsigned short) dh, pVBInfo->P3c9);
1250 outb((unsigned short) bh, pVBInfo->P3c9);
1251 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001252}
1253
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001254static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301255 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001257 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1258 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001260 outb(0xFF, pVBInfo->P3c6);
1261 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001262
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001263 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301264 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301266 for (k = 0; k < 3; k++) {
1267 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301269 if (data & 0x01)
1270 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001271
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301272 if (data & 0x02)
1273 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001274
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001275 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301276 data = data >> 2;
1277 }
1278 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001279
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001280 for (i = 16; i < 32; i++) {
1281 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001282
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001283 for (k = 0; k < 3; k++)
1284 outb(data, pVBInfo->P3c9);
1285 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001286
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001287 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001288
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001289 for (m = 0; m < 9; m++) {
1290 di = si;
1291 bx = si + 0x04;
1292 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001293
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001294 for (n = 0; n < 3; n++) {
1295 for (o = 0; o < 5; o++) {
1296 dh = table[si];
1297 ah = table[di];
1298 al = table[bx];
1299 si++;
1300 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301301 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001302
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001303 si -= 2;
1304
1305 for (o = 0; o < 3; o++) {
1306 dh = table[bx];
1307 ah = table[di];
1308 al = table[si];
1309 si--;
1310 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1311 }
1312
1313 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301314 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001315
1316 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301317 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001318}
1319
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001320static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1321 unsigned short ModeIdIndex,
1322 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001323{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301324 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001325
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001326 /* si+Ext_ResInfo */
1327 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001328
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001329 /* si+Ext_ResInfo */
1330 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001331
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001332 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1333 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001334
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001335 if (modeflag & HalfDCLK)
1336 xres = xres << 1;
1337
1338 if (modeflag & DoubleScanMode)
1339 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001340
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301341 if (xres == 720)
1342 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001343
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301344 pVBInfo->VGAHDE = xres;
1345 pVBInfo->HDE = xres;
1346 pVBInfo->VGAVDE = yres;
1347 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001348}
1349
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001350static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1351 unsigned short ModeIdIndex,
1352 unsigned short RefreshRateTableIndex,
1353 struct vb_device_info *pVBInfo)
1354{
1355 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1356
1357 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1358
1359 tempbx = BX;
1360
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001361 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1362 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001363
1364 tempal = tempal & 0x0f;
1365
1366 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001367 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001368
Peter Huewea3d675c2012-02-09 21:11:47 +01001369 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001370 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001371 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001372 }
1373
1374 if (tempbx & 0x01)
1375 tempal = (tempal >> 4);
1376
1377 tempal = (tempal & 0x0f);
1378 }
1379
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001380 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001381
1382 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1383 if ((tempbx == 5) || (tempbx) == 7)
1384 tempcx = LCDDesDataLen2;
1385 else if ((tempbx == 3) || (tempbx == 8))
1386 tempcx = LVDSDesDataLen2;
1387 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001388
1389 switch (tempbx) {
1390 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001391 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001392 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001393 break;
1394 case 2:
1395 tempdi = XGI_EPLLCDDataPtr;
1396 break;
1397 case 3:
1398 tempdi = XGI_EPLLCDDesDataPtr;
1399 break;
1400 case 4:
1401 tempdi = XGI_LCDDataTable;
1402 break;
1403 case 5:
1404 tempdi = XGI_LCDDesDataTable;
1405 break;
1406 case 6:
1407 tempdi = XGI_EPLCHLCDRegPtr;
1408 break;
1409 case 7:
1410 case 8:
1411 case 9:
1412 tempdi = NULL;
1413 break;
1414 default:
1415 break;
1416 }
1417
1418 if (tempdi == NULL) /* OEMUtil */
1419 return NULL;
1420
1421 table = tempbx;
1422 i = 0;
1423
1424 while (tempdi[i].PANELID != 0xff) {
1425 tempdx = pVBInfo->LCDResInfo;
1426 if (tempbx & 0x0080) { /* OEMUtil */
1427 tempbx &= (~0x0080);
1428 tempdx = pVBInfo->LCDTypeInfo;
1429 }
1430
1431 if (pVBInfo->LCDInfo & EnableScalingLCD)
1432 tempdx &= (~PanelResInfo);
1433
1434 if (tempdi[i].PANELID == tempdx) {
1435 tempbx = tempdi[i].MASK;
1436 tempdx = pVBInfo->LCDInfo;
1437
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001438 if (modeflag & HalfDCLK)
1439 tempdx |= SetLCDLowResolution;
1440
1441 tempbx &= tempdx;
1442 if (tempbx == tempdi[i].CAP)
1443 break;
1444 }
1445 i++;
1446 }
1447
1448 if (table == 0) {
1449 switch (tempdi[i].DATAPTR) {
1450 case 0:
1451 return &XGI_LVDSCRT11024x768_1_H[tempal];
1452 break;
1453 case 1:
1454 return &XGI_LVDSCRT11024x768_2_H[tempal];
1455 break;
1456 case 2:
1457 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1458 break;
1459 case 3:
1460 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1461 break;
1462 case 4:
1463 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1464 break;
1465 case 5:
1466 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1467 break;
1468 case 6:
1469 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1470 break;
1471 case 7:
1472 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1473 break;
1474 case 8:
1475 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1476 break;
1477 case 9:
1478 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1479 break;
1480 case 10:
1481 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1482 break;
1483 default:
1484 break;
1485 }
1486 } else if (table == 1) {
1487 switch (tempdi[i].DATAPTR) {
1488 case 0:
1489 return &XGI_LVDSCRT11024x768_1_V[tempal];
1490 break;
1491 case 1:
1492 return &XGI_LVDSCRT11024x768_2_V[tempal];
1493 break;
1494 case 2:
1495 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1496 break;
1497 case 3:
1498 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1499 break;
1500 case 4:
1501 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1502 break;
1503 case 5:
1504 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1505 break;
1506 case 6:
1507 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1508 break;
1509 case 7:
1510 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1511 break;
1512 case 8:
1513 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1514 break;
1515 case 9:
1516 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1517 break;
1518 case 10:
1519 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1520 break;
1521 default:
1522 break;
1523 }
1524 } else if (table == 2) {
1525 switch (tempdi[i].DATAPTR) {
1526 case 0:
1527 return &XGI_LVDS1024x768Data_1[tempal];
1528 break;
1529 case 1:
1530 return &XGI_LVDS1024x768Data_2[tempal];
1531 break;
1532 case 2:
1533 return &XGI_LVDS1280x1024Data_1[tempal];
1534 break;
1535 case 3:
1536 return &XGI_LVDS1280x1024Data_2[tempal];
1537 break;
1538 case 4:
1539 return &XGI_LVDS1400x1050Data_1[tempal];
1540 break;
1541 case 5:
1542 return &XGI_LVDS1400x1050Data_2[tempal];
1543 break;
1544 case 6:
1545 return &XGI_LVDS1600x1200Data_1[tempal];
1546 break;
1547 case 7:
1548 return &XGI_LVDSNoScalingData[tempal];
1549 break;
1550 case 8:
1551 return &XGI_LVDS1024x768Data_1x75[tempal];
1552 break;
1553 case 9:
1554 return &XGI_LVDS1024x768Data_2x75[tempal];
1555 break;
1556 case 10:
1557 return &XGI_LVDS1280x1024Data_1x75[tempal];
1558 break;
1559 case 11:
1560 return &XGI_LVDS1280x1024Data_2x75[tempal];
1561 break;
1562 case 12:
1563 return &XGI_LVDSNoScalingDatax75[tempal];
1564 break;
1565 default:
1566 break;
1567 }
1568 } else if (table == 3) {
1569 switch (tempdi[i].DATAPTR) {
1570 case 0:
1571 return &XGI_LVDS1024x768Des_1[tempal];
1572 break;
1573 case 1:
1574 return &XGI_LVDS1024x768Des_3[tempal];
1575 break;
1576 case 2:
1577 return &XGI_LVDS1024x768Des_2[tempal];
1578 break;
1579 case 3:
1580 return &XGI_LVDS1280x1024Des_1[tempal];
1581 break;
1582 case 4:
1583 return &XGI_LVDS1280x1024Des_2[tempal];
1584 break;
1585 case 5:
1586 return &XGI_LVDS1400x1050Des_1[tempal];
1587 break;
1588 case 6:
1589 return &XGI_LVDS1400x1050Des_2[tempal];
1590 break;
1591 case 7:
1592 return &XGI_LVDS1600x1200Des_1[tempal];
1593 break;
1594 case 8:
1595 return &XGI_LVDSNoScalingDesData[tempal];
1596 break;
1597 case 9:
1598 return &XGI_LVDS1024x768Des_1x75[tempal];
1599 break;
1600 case 10:
1601 return &XGI_LVDS1024x768Des_3x75[tempal];
1602 break;
1603 case 11:
1604 return &XGI_LVDS1024x768Des_2x75[tempal];
1605 break;
1606 case 12:
1607 return &XGI_LVDS1280x1024Des_1x75[tempal];
1608 break;
1609 case 13:
1610 return &XGI_LVDS1280x1024Des_2x75[tempal];
1611 break;
1612 case 14:
1613 return &XGI_LVDSNoScalingDesDatax75[tempal];
1614 break;
1615 default:
1616 break;
1617 }
1618 } else if (table == 4) {
1619 switch (tempdi[i].DATAPTR) {
1620 case 0:
1621 return &XGI_ExtLCD1024x768Data[tempal];
1622 break;
1623 case 1:
1624 return &XGI_StLCD1024x768Data[tempal];
1625 break;
1626 case 2:
1627 return &XGI_CetLCD1024x768Data[tempal];
1628 break;
1629 case 3:
1630 return &XGI_ExtLCD1280x1024Data[tempal];
1631 break;
1632 case 4:
1633 return &XGI_StLCD1280x1024Data[tempal];
1634 break;
1635 case 5:
1636 return &XGI_CetLCD1280x1024Data[tempal];
1637 break;
1638 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001639 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001640 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001641 break;
1642 case 8:
1643 return &XGI_CetLCD1400x1050Data[tempal];
1644 break;
1645 case 9:
1646 return &XGI_ExtLCD1600x1200Data[tempal];
1647 break;
1648 case 10:
1649 return &XGI_StLCD1600x1200Data[tempal];
1650 break;
1651 case 11:
1652 return &XGI_NoScalingData[tempal];
1653 break;
1654 case 12:
1655 return &XGI_ExtLCD1024x768x75Data[tempal];
1656 break;
1657 case 13:
1658 return &XGI_ExtLCD1024x768x75Data[tempal];
1659 break;
1660 case 14:
1661 return &XGI_CetLCD1024x768x75Data[tempal];
1662 break;
1663 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001664 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001665 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001666 break;
1667 case 17:
1668 return &XGI_CetLCD1280x1024x75Data[tempal];
1669 break;
1670 case 18:
1671 return &XGI_NoScalingDatax75[tempal];
1672 break;
1673 default:
1674 break;
1675 }
1676 } else if (table == 5) {
1677 switch (tempdi[i].DATAPTR) {
1678 case 0:
1679 return &XGI_ExtLCDDes1024x768Data[tempal];
1680 break;
1681 case 1:
1682 return &XGI_StLCDDes1024x768Data[tempal];
1683 break;
1684 case 2:
1685 return &XGI_CetLCDDes1024x768Data[tempal];
1686 break;
1687 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001688 if ((pVBInfo->VBType & VB_SIS301LV) ||
1689 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001690 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1691 else
1692 return &XGI_ExtLCDDes1280x1024Data[tempal];
1693 break;
1694 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001695 if ((pVBInfo->VBType & VB_SIS301LV) ||
1696 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001697 return &XGI_StLCDDLDes1280x1024Data[tempal];
1698 else
1699 return &XGI_StLCDDes1280x1024Data[tempal];
1700 break;
1701 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001702 if ((pVBInfo->VBType & VB_SIS301LV) ||
1703 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001704 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1705 else
1706 return &XGI_CetLCDDes1280x1024Data[tempal];
1707 break;
1708 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001709 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001710 if ((pVBInfo->VBType & VB_SIS301LV) ||
1711 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001712 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001713 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001714 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001715 break;
1716 case 8:
1717 return &XGI_CetLCDDes1400x1050Data[tempal];
1718 break;
1719 case 9:
1720 return &XGI_CetLCDDes1400x1050Data2[tempal];
1721 break;
1722 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001723 if ((pVBInfo->VBType & VB_SIS301LV) ||
1724 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001725 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1726 else
1727 return &XGI_ExtLCDDes1600x1200Data[tempal];
1728 break;
1729 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001730 if ((pVBInfo->VBType & VB_SIS301LV) ||
1731 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001732 return &XGI_StLCDDLDes1600x1200Data[tempal];
1733 else
1734 return &XGI_StLCDDes1600x1200Data[tempal];
1735 break;
1736 case 12:
1737 return &XGI_NoScalingDesData[tempal];
1738 break;
1739 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001740 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001741 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001742 break;
1743 case 15:
1744 return &XGI_CetLCDDes1024x768x75Data[tempal];
1745 break;
1746 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001747 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001748 if ((pVBInfo->VBType & VB_SIS301LV) ||
1749 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001750 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001751 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001752 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001753 break;
1754 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001755 if ((pVBInfo->VBType & VB_SIS301LV) ||
1756 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001757 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1758 else
1759 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1760 break;
1761 case 19:
1762 return &XGI_NoScalingDesDatax75[tempal];
1763 break;
1764 default:
1765 break;
1766 }
1767 } else if (table == 6) {
1768 switch (tempdi[i].DATAPTR) {
1769 case 0:
1770 return &XGI_CH7017LV1024x768[tempal];
1771 break;
1772 case 1:
1773 return &XGI_CH7017LV1400x1050[tempal];
1774 break;
1775 default:
1776 break;
1777 }
1778 }
1779 return NULL;
1780}
1781
1782static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
1783 unsigned short ModeIdIndex,
1784 unsigned short RefreshRateTableIndex,
1785 struct vb_device_info *pVBInfo)
1786{
1787 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
1788 struct XGI330_TVDataTablStruct *tempdi = NULL;
1789
1790 tempbx = BX;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001791 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1792 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001793 tempal = tempal & 0x3f;
1794 table = tempbx;
1795
1796 switch (tempbx) {
1797 case 0:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001798 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001799 break;
1800 case 1:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001801 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001802 break;
1803 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03001804 case 6:
1805 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001806 break;
1807 case 3:
1808 tempdi = NULL;
1809 break;
1810 case 4:
1811 tempdi = XGI_TVDataTable;
1812 break;
1813 case 5:
1814 tempdi = NULL;
1815 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001816 default:
1817 break;
1818 }
1819
1820 if (tempdi == NULL) /* OEMUtil */
1821 return NULL;
1822
1823 tempdx = pVBInfo->TVInfo;
1824
1825 if (pVBInfo->VBInfo & SetInSlaveMode)
1826 tempdx = tempdx | SetTVLockMode;
1827
1828 if (modeflag & HalfDCLK)
1829 tempdx = tempdx | SetTVLowResolution;
1830
1831 i = 0;
1832
1833 while (tempdi[i].MASK != 0xffff) {
1834 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
1835 break;
1836 i++;
1837 }
1838
Aaro Koskinenebe33022011-11-27 23:03:18 +02001839 if (table == 0x04) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001840 switch (tempdi[i].DATAPTR) {
1841 case 0:
1842 return &XGI_ExtPALData[tempal];
1843 break;
1844 case 1:
1845 return &XGI_ExtNTSCData[tempal];
1846 break;
1847 case 2:
1848 return &XGI_StPALData[tempal];
1849 break;
1850 case 3:
1851 return &XGI_StNTSCData[tempal];
1852 break;
1853 case 4:
1854 return &XGI_ExtHiTVData[tempal];
1855 break;
1856 case 5:
1857 return &XGI_St2HiTVData[tempal];
1858 break;
1859 case 6:
1860 return &XGI_ExtYPbPr525iData[tempal];
1861 break;
1862 case 7:
1863 return &XGI_ExtYPbPr525pData[tempal];
1864 break;
1865 case 8:
1866 return &XGI_ExtYPbPr750pData[tempal];
1867 break;
1868 case 9:
1869 return &XGI_StYPbPr525iData[tempal];
1870 break;
1871 case 10:
1872 return &XGI_StYPbPr525pData[tempal];
1873 break;
1874 case 11:
1875 return &XGI_StYPbPr750pData[tempal];
1876 break;
1877 case 12: /* avoid system hang */
1878 return &XGI_ExtNTSCData[tempal];
1879 break;
1880 case 13:
1881 return &XGI_St1HiTVData[tempal];
1882 break;
1883 default:
1884 break;
1885 }
1886 } else if (table == 0x02) {
1887 switch (tempdi[i].DATAPTR) {
1888 case 0:
1889 return &XGI_CHTVUNTSCData[tempal];
1890 break;
1891 case 1:
1892 return &XGI_CHTVONTSCData[tempal];
1893 break;
1894 case 2:
1895 return &XGI_CHTVUPALData[tempal];
1896 break;
1897 case 3:
1898 return &XGI_CHTVOPALData[tempal];
1899 break;
1900 default:
1901 break;
1902 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001903 }
1904 return NULL;
1905}
1906
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001907static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301908 unsigned short RefreshRateTableIndex,
1909 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001910{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301911 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001912 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301914 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001915
Peter Huewea3d675c2012-02-09 21:11:47 +01001916 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe51f984b2012-06-14 00:21:51 +02001917 LCDPtr = (struct SiS_LVDSData *)XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301918 ModeNo, ModeIdIndex, RefreshRateTableIndex,
1919 pVBInfo);
1920 pVBInfo->VGAHT = LCDPtr->VGAHT;
1921 pVBInfo->VGAVT = LCDPtr->VGAVT;
1922 pVBInfo->HT = LCDPtr->LCDHT;
1923 pVBInfo->VT = LCDPtr->LCDVT;
1924 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001925
Peter Huewea3d675c2012-02-09 21:11:47 +01001926 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301927 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1928 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001929 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1930 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301931 pVBInfo->HDE = 1024;
1932 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001933 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001934 (pVBInfo->LCDResInfo ==
1935 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301936 pVBInfo->HDE = 1280;
1937 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001938 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301939 pVBInfo->HDE = 1400;
1940 pVBInfo->VDE = 1050;
1941 } else {
1942 pVBInfo->HDE = 1600;
1943 pVBInfo->VDE = 1200;
1944 }
1945 }
1946 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001947}
1948
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001949static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301950 unsigned short RefreshRateTableIndex,
1951 struct xgi_hw_device_info *HwDeviceExtension,
1952 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001953{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301954 unsigned char index;
1955 unsigned short tempbx, i;
1956 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1957 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001958
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001959 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301960 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001961
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001962 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001963
Peter Huewea3d675c2012-02-09 21:11:47 +01001964 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001965 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
1966 XGI_GetLcdPtr(tempbx, ModeNo,
1967 ModeIdIndex,
1968 RefreshRateTableIndex,
1969 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001970
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001971 for (i = 0; i < 8; i++)
1972 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301973 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001974
1975 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1976
1977 tempbx = 1;
1978
Peter Huewea3d675c2012-02-09 21:11:47 +01001979 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001980 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
1981 XGI_GetLcdPtr(
1982 tempbx,
1983 ModeNo,
1984 ModeIdIndex,
1985 RefreshRateTableIndex,
1986 pVBInfo);
1987 for (i = 0; i < 7; i++)
1988 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1989 }
1990
1991 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001992}
1993
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001994static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1995{
1996 unsigned char tempal, tempah, tempbl, i;
1997
Aaro Koskinen58839b02011-03-13 12:26:23 +02001998 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001999 tempal = tempah & 0x0F;
2000 tempah = tempah & 0xF0;
2001 i = 0;
2002 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2003
2004 while (tempbl != 0xFF) {
2005 if (tempbl & 0x80) { /* OEMUtil */
2006 tempal = tempah;
2007 tempbl = tempbl & ~(0x80);
2008 }
2009
2010 if (tempal == tempbl)
2011 break;
2012
2013 i++;
2014
2015 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2016 }
2017
2018 return i;
2019}
2020
2021static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2022{
2023 unsigned short tempah, tempal, tempbl, i;
2024
2025 tempal = pVBInfo->LCDResInfo;
2026 tempah = pVBInfo->LCDTypeInfo;
2027
2028 i = 0;
2029 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2030
2031 while (tempbl != 0xFF) {
2032 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2033 tempal = tempah;
2034 tempbl &= ~0x80;
2035 }
2036
2037 if (tempal == tempbl)
2038 break;
2039
2040 i++;
2041 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2042 }
2043
2044 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002045 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002046 pVBInfo->LCDTypeInfo = 0;
2047 i = 0;
2048 }
2049
2050 return i;
2051}
2052
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002053static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2054 unsigned short *VSyncWidth,
2055 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002056{
2057 unsigned short Index;
2058
2059 Index = XGI_GetLCDCapPtr(pVBInfo);
2060 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2061 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2062
2063 return;
2064}
2065
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002066static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302067 unsigned short RefreshRateTableIndex,
2068 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002069{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302070 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2071 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002072 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302073 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002074
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002075 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03002076 tempbx = 3;
2077 if (pVBInfo->LCDInfo & EnableScalingLCD)
2078 LCDPtr1 =
2079 (struct XGI330_LCDDataDesStruct2 *)
2080 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002081 tempbx,
2082 ModeNo,
2083 ModeIdIndex,
2084 RefreshRateTableIndex,
2085 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002086 else
2087 LCDPtr =
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002088 (struct XGI_LCDDesStruct *)
Aaro Koskinen66cface2011-08-31 21:46:13 +03002089 XGI_GetLcdPtr(
2090 tempbx,
2091 ModeNo,
2092 ModeIdIndex,
2093 RefreshRateTableIndex,
2094 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002095
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002096 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2097 push1 = tempbx;
2098 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002099
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002100 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002101 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2102 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002103 tempax = 1024;
2104 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002105 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2106 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002107 tempax = 1280;
2108 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002109 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002110 tempax = 1400;
2111 tempbx = 1050;
2112 } else {
2113 tempax = 1600;
2114 tempbx = 1200;
2115 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002116
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002117 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2118 pVBInfo->HDE = tempax;
2119 pVBInfo->VDE = tempbx;
2120 pVBInfo->VGAHDE = tempax;
2121 pVBInfo->VGAVDE = tempbx;
2122 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002123
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002124 tempax = pVBInfo->HT;
2125
2126 if (pVBInfo->LCDInfo & EnableScalingLCD)
2127 tempbx = LCDPtr1->LCDHDES;
2128 else
2129 tempbx = LCDPtr->LCDHDES;
2130
2131 tempcx = pVBInfo->HDE;
2132 tempbx = tempbx & 0x0fff;
2133 tempcx += tempbx;
2134
2135 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002136 tempcx -= tempax;
2137
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002138 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002139
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002140 tempcx = tempcx >> 3;
2141 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002142
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002143 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2144 (unsigned short) (tempbx & 0xff));
2145 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2146 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002147
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002148 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002149
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002150 if (pVBInfo->LCDInfo & EnableScalingLCD)
2151 tempbx = LCDPtr1->LCDHRS;
2152 else
2153 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002154
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002155 tempcx = push2;
2156
2157 if (pVBInfo->LCDInfo & EnableScalingLCD)
2158 tempcx = LCDPtr1->LCDHSync;
2159
2160 tempcx += tempbx;
2161
2162 if (tempcx >= tempax)
2163 tempcx -= tempax;
2164
2165 tempax = tempbx & 0x07;
2166 tempax = tempax >> 5;
2167 tempcx = tempcx >> 3;
2168 tempbx = tempbx >> 3;
2169
2170 tempcx &= 0x1f;
2171 tempax |= tempcx;
2172
2173 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2174 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2175 (unsigned short) (tempbx & 0xff));
2176
2177 tempax = pVBInfo->VT;
2178 if (pVBInfo->LCDInfo & EnableScalingLCD)
2179 tempbx = LCDPtr1->LCDVDES;
2180 else
2181 tempbx = LCDPtr->LCDVDES;
2182 tempcx = pVBInfo->VDE;
2183
2184 tempbx = tempbx & 0x0fff;
2185 tempcx += tempbx;
2186 if (tempcx >= tempax)
2187 tempcx -= tempax;
2188
2189 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2190 (unsigned short) (tempbx & 0xff));
2191 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2192 (unsigned short) (tempcx & 0xff));
2193
2194 tempbx = (tempbx >> 8) & 0x07;
2195 tempcx = (tempcx >> 8) & 0x07;
2196
2197 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2198 (unsigned short) ((tempcx << 3)
2199 | tempbx));
2200
2201 tempax = pVBInfo->VT;
2202 if (pVBInfo->LCDInfo & EnableScalingLCD)
2203 tempbx = LCDPtr1->LCDVRS;
2204 else
2205 tempbx = LCDPtr->LCDVRS;
2206
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002207 tempcx = push1;
2208
2209 if (pVBInfo->LCDInfo & EnableScalingLCD)
2210 tempcx = LCDPtr1->LCDVSync;
2211
2212 tempcx += tempbx;
2213 if (tempcx >= tempax)
2214 tempcx -= tempax;
2215
2216 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2217 (unsigned short) (tempbx & 0xff));
2218 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2219 (unsigned short) (tempcx & 0x0f));
2220
2221 tempax = ((tempbx >> 8) & 0x07) << 3;
2222
2223 tempbx = pVBInfo->VGAVDE;
2224 if (tempbx != pVBInfo->VDE)
2225 tempax |= 0x40;
2226
Peter Huewea3d675c2012-02-09 21:11:47 +01002227 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002228 tempax |= 0x40;
2229
2230 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2231 tempax);
2232
2233 tempcx = pVBInfo->VGAVT;
2234 tempbx = pVBInfo->VDE;
2235 tempax = pVBInfo->VGAVDE;
2236 tempcx -= tempax;
2237
2238 temp = tempax; /* 0430 ylshieh */
2239 temp1 = (temp << 18) / tempbx;
2240
2241 tempdx = (unsigned short) ((temp << 18) % tempbx);
2242
2243 if (tempdx != 0)
2244 temp1 += 1;
2245
2246 temp2 = temp1;
2247 push3 = temp2;
2248
2249 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2250 (unsigned short) (temp2 & 0xff));
2251 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2252 (unsigned short) ((temp2 >> 8) & 0xff));
2253
2254 tempbx = (unsigned short) (temp2 >> 16);
2255 tempax = tempbx & 0x03;
2256
2257 tempbx = pVBInfo->VGAVDE;
2258 if (tempbx == pVBInfo->VDE)
2259 tempax |= 0x04;
2260
2261 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2262
2263 if (pVBInfo->VBType & VB_XGI301C) {
2264 temp2 = push3;
2265 xgifb_reg_set(pVBInfo->Part4Port,
2266 0x3c,
2267 (unsigned short) (temp2 & 0xff));
2268 xgifb_reg_set(pVBInfo->Part4Port,
2269 0x3b,
2270 (unsigned short) ((temp2 >> 8) &
2271 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002272 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002273 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2274 ~0xc0,
2275 (unsigned short) ((tempbx &
2276 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002277
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002278 tempcx = pVBInfo->VGAVDE;
2279 if (tempcx == pVBInfo->VDE)
2280 xgifb_reg_and_or(pVBInfo->Part4Port,
2281 0x30, ~0x0c, 0x00);
2282 else
2283 xgifb_reg_and_or(pVBInfo->Part4Port,
2284 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302285 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002286
2287 tempcx = pVBInfo->VGAHDE;
2288 tempbx = pVBInfo->HDE;
2289
2290 temp1 = tempcx << 16;
2291
2292 tempax = (unsigned short) (temp1 / tempbx);
2293
2294 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2295 tempax = 65535;
2296
2297 temp3 = tempax;
2298 temp1 = pVBInfo->VGAHDE << 16;
2299
2300 temp1 /= temp3;
2301 temp3 = temp3 << 16;
2302 temp1 -= 1;
2303
2304 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2305
2306 tempax = (unsigned short) (temp3 & 0xff);
2307 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2308
2309 temp1 = pVBInfo->VGAVDE << 18;
2310 temp1 = temp1 / push3;
2311 tempbx = (unsigned short) (temp1 & 0xffff);
2312
Peter Huewe255aabd2012-02-09 21:11:44 +01002313 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002314 tempbx -= 1;
2315
2316 tempax = ((tempbx >> 8) & 0xff) << 3;
2317 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2318 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2319 (unsigned short) (tempax & 0xff));
2320 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2321 (unsigned short) (tempbx & 0xff));
2322
2323 temp3 = temp3 >> 16;
2324
2325 if (modeflag & HalfDCLK)
2326 temp3 = temp3 >> 1;
2327
2328 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2329 (unsigned short) ((temp3 >> 8) & 0xff));
2330 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2331 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002332}
2333
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002334/* --------------------------------------------------------------------- */
2335/* Function : XGI_GETLCDVCLKPtr */
2336/* Input : */
2337/* Output : al -> VCLK Index */
2338/* Description : */
2339/* --------------------------------------------------------------------- */
2340static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2341 struct vb_device_info *pVBInfo)
2342{
2343 unsigned short index;
2344
Peter Huewea3d675c2012-02-09 21:11:47 +01002345 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002346 index = XGI_GetLCDCapPtr1(pVBInfo);
2347
2348 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2349 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2350 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2351 } else { /* LCDA */
2352 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2353 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2354 }
2355 }
2356 return;
2357}
2358
2359static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2360 unsigned short ModeNo, unsigned short ModeIdIndex,
2361 struct vb_device_info *pVBInfo)
2362{
2363
2364 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002365 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002366
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002367 /* si+Ext_ResInfo */
2368 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002369
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002370 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2371 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002372 index = XGI_GetLCDCapPtr(pVBInfo);
2373 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2374
Peter Huewea3d675c2012-02-09 21:11:47 +01002375 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002376 return tempal;
2377
2378 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002379 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002380 (VB_SIS301B |
2381 VB_SIS302B |
2382 VB_SIS301LV |
2383 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002384 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002385 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002386 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002387 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002388 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002389 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002390 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002391 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002392 tempal = TVCLKBASE_315 +
2393 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002394
2395 }
2396 return tempal;
2397 }
2398
Peter Huewe599801f2012-02-09 21:11:45 +01002399 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002400 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002401 return tempal;
2402 }
2403
Peter Huewe599801f2012-02-09 21:11:45 +01002404 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002405 tempal = YPbPr525pVCLK;
2406 return tempal;
2407 }
2408
2409 tempal = NTSC1024VCLK;
2410
2411 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002412 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002413 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002414 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002415 }
2416
2417 if (pVBInfo->VBInfo & SetCRT2ToTV)
2418 return tempal;
2419 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002420 } /* {End of VB} */
2421
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002422 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002423 tempal = tempal >> 2;
2424 tempal &= 0x03;
2425
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002426 /* for Dot8 Scaling LCD */
2427 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002428 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2429
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002430 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2431 return tempal;
2432}
2433
2434static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2435 unsigned char *di_1, struct vb_device_info *pVBInfo)
2436{
Peter Huewe6896b942012-02-09 21:11:46 +01002437 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2438 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002439 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
2440 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002441 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2442 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2443 }
2444 } else {
2445 *di_0 = XGI_VCLKData[tempal].SR2B;
2446 *di_1 = XGI_VCLKData[tempal].SR2C;
2447 }
2448}
2449
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002450static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302451 unsigned short RefreshRateTableIndex,
2452 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002453{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302454 unsigned char di_0, di_1, tempal;
2455 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002456
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302457 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2458 pVBInfo);
2459 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2460 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002461
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302462 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002463 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302464 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002465 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302466 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002467 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2468 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302469 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002470 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2471 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302472 }
2473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002474}
2475
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002476static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302477 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002478{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302479 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002480
Peter Huewe6896b942012-02-09 21:11:46 +01002481 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2482 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302483 tempcl = 0;
2484 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002485 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002486
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302487 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002488 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302489 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002490 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302491 if (!(temp & 0x40))
2492 tempcl |= ActiveCRT1;
2493 }
2494 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002495
Aaro Koskinen58839b02011-03-13 12:26:23 +02002496 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302497 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002498
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302499 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002500 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002501 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302502 if (tempax & 0x04)
2503 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302505 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002506
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302507 if (!(tempcl & ActiveLCD))
2508 if (temp == 0x01)
2509 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002510
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302511 if (temp == 0x04)
2512 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002513
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302514 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002515 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002516
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302517 if (!(temp & 0x08))
2518 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302520 if (!(temp & 0x04))
2521 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002522
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302523 if (temp & 0x02)
2524 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002525
Peter Huewe599801f2012-02-09 21:11:45 +01002526 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302527 if (temp & 0x01)
2528 tempch |= ActiveHiTV;
2529 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530
Peter Huewe599801f2012-02-09 21:11:45 +01002531 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002532 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302533 pVBInfo->Part2Port,
2534 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002535
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302536 if (temp & 0x10)
2537 tempch |= ActiveYPbPr;
2538 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302540 if (tempch != 0)
2541 tempcl |= ActiveTV;
2542 }
2543 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002544
Aaro Koskinen58839b02011-03-13 12:26:23 +02002545 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302546 if (tempcl & ActiveLCD) {
2547 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2548 if (temp & ActiveTV)
2549 tempcl |= ActiveTV;
2550 }
2551 }
2552 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002553 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002554 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302556 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002557 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302558 } else {
2559 return;
2560 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002561}
2562
Bill Pemberton80adad82010-06-17 13:10:51 -04002563void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002564{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302565 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002566
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002567 if (pVBInfo->IF_DEF_LVDS != 0)
2568 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002569
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002570 tempbx = VB_SIS302B;
2571 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2572 if (flag == 0x02)
2573 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002574
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002575 tempbx = VB_SIS301;
2576 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2577 if (flag < 0xB0)
2578 goto finish;
2579
2580 tempbx = VB_SIS301B;
2581 if (flag < 0xC0)
2582 goto bigger_than_0xB0;
2583
2584 tempbx = VB_XGI301C;
2585 if (flag < 0xD0)
2586 goto bigger_than_0xB0;
2587
2588 tempbx = VB_SIS301LV;
2589 if (flag < 0xE0)
2590 goto bigger_than_0xB0;
2591
2592 tempbx = VB_SIS302LV;
2593 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2594 if (tempah != 0xFF)
2595 tempbx = VB_XGI301C;
2596
2597bigger_than_0xB0:
2598 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2599 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2600 if (!(flag & 0x02))
2601 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002603
2604finish:
2605 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002606}
2607
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002608static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302609 struct xgi_hw_device_info *HwDeviceExtension,
2610 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002611{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302612 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002613
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002614 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302615 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002616 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302617 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002618
Miguel Gómezf9317352012-07-06 12:40:48 +02002619 if (!(pVBInfo->VBType & 0xFFFF))
2620 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002621
Miguel Gómezf9317352012-07-06 12:40:48 +02002622 /* Check Display Device */
2623 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2624 tempbx = tempbx | temp;
2625 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2626 push = temp;
2627 push = push << 8;
2628 tempax = temp << 8;
2629 tempbx = tempbx | tempax;
2630 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2631 | SetInSlaveMode | DisableCRT2Display);
2632 temp = 0xFFFF ^ temp;
2633 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002634
Miguel Gómezf9317352012-07-06 12:40:48 +02002635 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002636
Miguel Gómezf9317352012-07-06 12:40:48 +02002637 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002638
Miguel Gómezf9317352012-07-06 12:40:48 +02002639 if (((HwDeviceExtension->jChipType >= XG20) ||
2640 (HwDeviceExtension->jChipType >= XG40)) &&
2641 (pVBInfo->IF_DEF_LVDS == 0)) {
2642 if (pVBInfo->VBType &
2643 (VB_SIS302B |
2644 VB_SIS301LV |
2645 VB_SIS302LV |
2646 VB_XGI301C)) {
2647 if (temp & EnableDualEdge) {
2648 tempbx |= SetCRT2ToDualEdge;
2649 if (temp & SetToLCDA)
2650 tempbx |= XGI_SetCRT2ToLCDA;
2651 }
2652 }
2653 }
2654 }
2655
2656 if (pVBInfo->IF_DEF_YPbPr == 1) {
2657 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2658 ((pVBInfo->VBType & VB_SIS301LV) ||
2659 (pVBInfo->VBType & VB_SIS302LV) ||
2660 (pVBInfo->VBType & VB_XGI301C)))) {
2661 if (temp & SetYPbPr) {
2662 if (pVBInfo->IF_DEF_HiVision == 1) {
2663 /* shampoo add for new
2664 * scratch */
2665 temp = xgifb_reg_get(
2666 pVBInfo->P3d4,
2667 0x35);
2668 temp &= YPbPrMode;
2669 tempbx |= SetCRT2ToHiVision;
2670
2671 if (temp != YPbPrMode1080i) {
2672 tempbx &=
2673 (~SetCRT2ToHiVision);
2674 tempbx |=
2675 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302676 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302677 }
2678 }
2679 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002680 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002681
Miguel Gómezf9317352012-07-06 12:40:48 +02002682 tempax = push; /* restore CR31 */
2683
2684 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302685 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002686 if (pVBInfo->IF_DEF_HiVision == 1)
2687 temp = 0x09FC;
2688 else
2689 temp = 0x097C;
2690 } else {
2691 if (pVBInfo->IF_DEF_HiVision == 1)
2692 temp = 0x01FC;
2693 else
2694 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302695 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002696 } else { /* 3nd party chip */
2697 temp = SetCRT2ToLCD;
2698 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Miguel Gómezf9317352012-07-06 12:40:48 +02002700 if (!(tempbx & temp)) {
2701 tempax |= DisableCRT2Display;
2702 tempbx = 0;
2703 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002704
Miguel Gómezf9317352012-07-06 12:40:48 +02002705 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302706 if (!(pVBInfo->VBType & VB_NoLCD)) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002707 if (tempbx & XGI_SetCRT2ToLCDA) {
2708 if (tempbx & SetSimuScanMode)
2709 tempbx &= (~(SetCRT2ToLCD |
2710 SetCRT2ToRAMDAC |
2711 SwitchCRT2));
2712 else
2713 tempbx &= (~(SetCRT2ToLCD |
2714 SetCRT2ToRAMDAC |
2715 SetCRT2ToTV |
2716 SwitchCRT2));
2717 }
2718 }
2719 }
2720
2721 /* shampoo add */
2722 /* for driver abnormal */
2723 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2724 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2725 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002726 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002727 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002728 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002729 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002730 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302731 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002732 } else {
2733 tempbx &= (~(SetCRT2ToRAMDAC |
2734 SetCRT2ToLCD |
2735 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302736 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002737 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002738
Miguel Gómezf9317352012-07-06 12:40:48 +02002739 if (!(pVBInfo->VBType & VB_NoLCD)) {
2740 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002741 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002742 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002743 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002744 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002745 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302746 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002747 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002748
Miguel Gómezf9317352012-07-06 12:40:48 +02002749 if (tempbx & SetCRT2ToSCART) {
2750 tempbx &= (0xFF00 |
2751 SetCRT2ToSCART |
2752 SwitchCRT2 |
2753 SetSimuScanMode);
2754 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2755 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002756
Miguel Gómezf9317352012-07-06 12:40:48 +02002757 if (pVBInfo->IF_DEF_YPbPr == 1) {
2758 if (tempbx & SetCRT2ToYPbPr525750)
2759 tempbx &= (0xFF00 |
2760 SwitchCRT2 |
2761 SetSimuScanMode);
2762 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002763
Miguel Gómezf9317352012-07-06 12:40:48 +02002764 if (pVBInfo->IF_DEF_HiVision == 1) {
2765 if (tempbx & SetCRT2ToHiVision)
2766 tempbx &= (0xFF00 |
2767 SetCRT2ToHiVision |
2768 SwitchCRT2 |
2769 SetSimuScanMode);
2770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002771
Miguel Gómezf9317352012-07-06 12:40:48 +02002772 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2773 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2774 tempbx = DisableCRT2Display;
2775 }
2776
2777 if (!(tempbx & DisableCRT2Display)) {
2778 if ((!(tempbx & DriverMode)) ||
2779 (!(modeflag & CRT2Mode))) {
2780 if (pVBInfo->IF_DEF_LCDA == 1) {
2781 if (!(tempbx & XGI_SetCRT2ToLCDA))
2782 tempbx |= (SetInSlaveMode |
2783 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302784 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002785 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Miguel Gómezf9317352012-07-06 12:40:48 +02002787 /* LCD+TV can't support in slave mode
2788 * (Force LCDA+TV->LCDB) */
2789 if ((tempbx & SetInSlaveMode) &&
2790 (tempbx & XGI_SetCRT2ToLCDA)) {
2791 tempbx ^= (SetCRT2ToLCD |
2792 XGI_SetCRT2ToLCDA |
2793 SetCRT2ToDualEdge);
2794 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302795 }
2796 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302798 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002799}
2800
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002801static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302802 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002803{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302804 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002805
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302806 tempbx = 0;
2807 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302809 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002810 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2811 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302813 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002814 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302815 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002816 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002817 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002818 TVSetPALM |
2819 TVSetPALN |
2820 TVSetPAL);
2821 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002822 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002823 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302824 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002825 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002826 TVSetNTSCJ |
2827 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302828 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302830 if (pVBInfo->IF_DEF_LVDS == 0) {
2831 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002832 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302833 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302835 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002836 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002837 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302838 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002839
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302840 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002841 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302843 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002844 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302845 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002846 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302847 }
2848 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302850 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002851 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2852 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302855 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002856 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2857 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302858 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002859
Peter Huewe599801f2012-02-09 21:11:45 +01002860 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002861 (modeflag > 13) &&
2862 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302863 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302865 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002866
Peter Huewe599801f2012-02-09 21:11:45 +01002867 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302868 if (pVBInfo->VBInfo & SetInSlaveMode)
2869 tempbx &= (~RPLLDIV2XO);
2870 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002871 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01002872 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302873 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002874 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002875 (VB_SIS301B |
2876 VB_SIS302B |
2877 VB_SIS301LV |
2878 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002879 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302880 if (tempbx & TVSimuMode)
2881 tempbx &= (~RPLLDIV2XO);
2882 }
2883 }
2884 }
2885 }
2886 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002887}
2888
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002889static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2890 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002891{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302892 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302894 pVBInfo->LCDResInfo = 0;
2895 pVBInfo->LCDTypeInfo = 0;
2896 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002897
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002898 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2899 /* si+Ext_ResInfo // */
2900 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002901 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302902 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302904 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002905 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002906
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002907 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002908 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302909 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002910 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002911 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302912 tempax &= 0x0F;
2913 else
2914 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302916 if ((resinfo == 6) || (resinfo == 9)) {
2917 if (tempax >= 3)
2918 tempbx |= PanelRef75Hz;
2919 } else if ((resinfo == 7) || (resinfo == 8)) {
2920 if (tempax >= 4)
2921 tempbx |= PanelRef75Hz;
2922 }
2923 }
2924 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002927
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302928 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002929
Peter Huewea3d675c2012-02-09 21:11:47 +01002930 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302931 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002932
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302933 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002934
Aaro Koskinen58839b02011-03-13 12:26:23 +02002935 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302939 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002940
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302941 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002942
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302945 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002946 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002947 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302948 tempbx |= SetLCDDualLink;
2949 }
2950 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002951
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302952 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002953 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002954 & SetCRT2ToLCD) && (resinfo == 9) &&
2955 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002956 /*
2957 * set to center in 1280x1024 LCDB
2958 * for Panel_1400x1050
2959 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002960 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302961 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302963 if (pVBInfo->IF_DEF_ExpLink == 1) {
2964 if (modeflag & HalfDCLK) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302965 if (!(tempbx & SetLCDtoNonExpanding)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002966 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302967 } else {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002968 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2969 if (resinfo == 4) {/* 512x384 */
2970 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302971 }
2972 }
2973 }
2974 }
2975 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302977 if (pVBInfo->VBInfo & SetInSlaveMode) {
2978 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002979 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302980 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002981 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302982 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302984 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302986 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002987}
2988
Bill Pemberton108afbf2010-06-17 13:10:47 -04002989unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302990 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002991{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002992 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2993 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2994 break;
2995 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2996 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302999 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003000}
3001
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003002static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3003{
3004 unsigned char ujRet = 0;
3005 unsigned char i = 0;
3006
3007 for (i = 0; i < 8; i++) {
3008 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003009 ujRet |= (ujDate >> i) & 1;
3010 }
3011
3012 return ujRet;
3013}
3014
3015/*----------------------------------------------------------------------------*/
3016/* output */
3017/* bl[5] : LVDS signal */
3018/* bl[1] : LVDS backlight */
3019/* bl[0] : LVDS VDD */
3020/*----------------------------------------------------------------------------*/
3021static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3022{
3023 unsigned char CR4A, temp;
3024
Aaro Koskinen58839b02011-03-13 12:26:23 +02003025 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003026 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003027
Aaro Koskinen58839b02011-03-13 12:26:23 +02003028 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003029
3030 temp = XG21GPIODataTransfer(temp);
3031 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003032 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003033 return temp;
3034}
3035
3036/*----------------------------------------------------------------------------*/
3037/* output */
3038/* bl[5] : LVDS signal */
3039/* bl[1] : LVDS backlight */
3040/* bl[0] : LVDS VDD */
3041/*----------------------------------------------------------------------------*/
3042static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3043{
3044 unsigned char CR4A, CRB4, temp;
3045
Aaro Koskinen58839b02011-03-13 12:26:23 +02003046 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003047 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003048
Aaro Koskinen58839b02011-03-13 12:26:23 +02003049 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003050
3051 temp &= 0x0C;
3052 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003053 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003054 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003055 temp |= ((CRB4 & 0x04) << 3);
3056 return temp;
3057}
3058
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003059/*----------------------------------------------------------------------------*/
3060/* input */
3061/* bl[5] : 1;LVDS signal on */
3062/* bl[1] : 1;LVDS backlight on */
3063/* bl[0] : 1:LVDS VDD on */
3064/* bh: 100000b : clear bit 5, to set bit5 */
3065/* 000010b : clear bit 1, to set bit1 */
3066/* 000001b : clear bit 0, to set bit0 */
3067/*----------------------------------------------------------------------------*/
3068static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3069 struct vb_device_info *pVBInfo)
3070{
3071 unsigned char CR4A, temp;
3072
3073 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3074 tempbh &= 0x23;
3075 tempbl &= 0x23;
3076 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3077
3078 if (tempbh & 0x20) {
3079 temp = (tempbl >> 4) & 0x02;
3080
3081 /* CR B4[1] */
3082 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3083
3084 }
3085
3086 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3087
3088 temp = XG21GPIODataTransfer(temp);
3089 temp &= ~tempbh;
3090 temp |= tempbl;
3091 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3092}
3093
Aaro Koskinen776115a2011-11-27 23:03:10 +02003094static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3095 struct vb_device_info *pVBInfo)
3096{
3097 unsigned char CR4A, temp;
3098 unsigned short tempbh0, tempbl0;
3099
3100 tempbh0 = tempbh;
3101 tempbl0 = tempbl;
3102 tempbh0 &= 0x20;
3103 tempbl0 &= 0x20;
3104 tempbh0 >>= 3;
3105 tempbl0 >>= 3;
3106
3107 if (tempbh & 0x20) {
3108 temp = (tempbl >> 4) & 0x02;
3109
3110 /* CR B4[1] */
3111 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3112
3113 }
3114 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3115
3116 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3117 tempbh &= 0x03;
3118 tempbl &= 0x03;
3119 tempbh <<= 2;
3120 tempbl <<= 2; /* GPIOC,GPIOD */
3121 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3122 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3123}
3124
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003125static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3126 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303127 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003128{
3129
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003130 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303131 if (pXGIHWDE->jChipType == XG21) {
3132 if (pVBInfo->IF_DEF_LVDS == 1) {
3133 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003134 /* LVDS VDD on */
3135 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003136 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303137 }
3138 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003139 /* LVDS signal on */
3140 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003141 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003142 /* LVDS backlight on */
3143 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303144 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003145 /* DVO/DVI signal on */
3146 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303147 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303149 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303151 if (pXGIHWDE->jChipType == XG27) {
3152 if (pVBInfo->IF_DEF_LVDS == 1) {
3153 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003154 /* LVDS VDD on */
3155 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003156 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303157 }
3158 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003159 /* LVDS signal on */
3160 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003161 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003162 /* LVDS backlight on */
3163 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303164 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003165 /* DVO/DVI signal on */
3166 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303167 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303169 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003170}
3171
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003172void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3173 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303174 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003175{
3176
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303177 if (pXGIHWDE->jChipType == XG21) {
3178 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003179 /* LVDS backlight off */
3180 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003181 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303182 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003183 /* DVO/DVI signal off */
3184 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303185 }
3186 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303188 if (pXGIHWDE->jChipType == XG27) {
3189 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003190 /* LVDS backlight off */
3191 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003192 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003194
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303195 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003196 /* DVO/DVI signal off */
3197 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303198 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003199
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003200 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003201}
3202
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003203static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003204{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003205 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303206 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003207
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003208 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303209 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003210}
3211
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003212static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003213{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003214 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003215}
3216
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003217static void XGI_SaveCRT2Info(unsigned short ModeNo,
3218 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003219{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303220 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003221
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003222 /* reserve CR34 for CRT1 Mode No */
3223 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303224 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3225 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003226 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003227}
3228
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003229static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3230 unsigned short ModeIdIndex,
3231 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003232{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303233 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003234
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003235 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003236 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3237 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3238 /* si+St_ModeFlag */
3239 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003240
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003241 if (modeflag & HalfDCLK)
3242 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003243
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003244 if (modeflag & DoubleScanMode)
3245 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003246
Miguel Gómez3339db82012-07-06 12:40:49 +02003247 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3248 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003249
Miguel Gómez3339db82012-07-06 12:40:49 +02003250 if (pVBInfo->IF_DEF_LVDS == 0) {
3251 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3252 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3253 if (yres == 1024)
3254 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303255 }
3256 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003257
Miguel Gómez3339db82012-07-06 12:40:49 +02003258 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3259 if (yres == 400)
3260 yres = 405;
3261 else if (yres == 350)
3262 yres = 360;
3263
3264 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3265 if (yres == 360)
3266 yres = 375;
3267 }
3268 }
3269
3270 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3271 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3272 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3273 if (yres == 350)
3274 yres = 357;
3275 else if (yres == 400)
3276 yres = 420;
3277 else if (yres == 480)
3278 yres = 525;
3279 }
3280 }
3281 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303282 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003283
Miguel Gómez3339db82012-07-06 12:40:49 +02003284 if (xres == 720)
3285 xres = 640;
3286
3287exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303288 pVBInfo->VGAHDE = xres;
3289 pVBInfo->HDE = xres;
3290 pVBInfo->VGAVDE = yres;
3291 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003292}
3293
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003294static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003295{
3296
Peter Huewea3d675c2012-02-09 21:11:47 +01003297 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003298 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303299 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303301 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003302}
3303
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003304static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3305 unsigned short ModeIdIndex,
3306 unsigned short RefreshRateTableIndex,
3307 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003308{
3309 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003310 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003311
3312 pVBInfo->RVBHCMAX = 1;
3313 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003314 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3315 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3316 CRT1Index &= IndexMask;
3317 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3318 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3319 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3320 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3321 tempcx = (unsigned short)
3322 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3323 tempcx &= 0x0100;
3324 tempcx = tempcx << 2;
3325 tempbx |= tempcx;
3326 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003327
3328 if (temp1 & 0x01)
3329 tempbx |= 0x0100;
3330
3331 if (temp1 & 0x20)
3332 tempbx |= 0x0200;
3333 tempax += 5;
3334
3335 if (modeflag & Charx8Dot)
3336 tempax *= 8;
3337 else
3338 tempax *= 9;
3339
3340 pVBInfo->VGAHT = tempax;
3341 pVBInfo->HT = tempax;
3342 tempbx++;
3343 pVBInfo->VGAVT = tempbx;
3344 pVBInfo->VT = tempbx;
3345}
3346
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003347static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303348 unsigned short RefreshRateTableIndex,
3349 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003350{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003352
Peter Huewefc39dcb2012-01-15 19:22:12 +01003353 struct SiS_LCDData *LCDPtr = NULL;
3354 struct SiS_TVData *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003355
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003356 /* si+Ext_ResInfo */
3357 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3358 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303359 pVBInfo->NewFlickerMode = 0;
3360 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303362 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3363 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3364 pVBInfo);
3365 return;
3366 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003367
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303368 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003369
Peter Huewea3d675c2012-02-09 21:11:47 +01003370 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003371 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303372 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3373 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303375 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3376 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3377 pVBInfo->VGAHT = LCDPtr->VGAHT;
3378 pVBInfo->VGAVT = LCDPtr->VGAVT;
3379 pVBInfo->HT = LCDPtr->LCDHT;
3380 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003381
Peter Huewe255aabd2012-02-09 21:11:44 +01003382 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 tempax = 1024;
3384 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003385
Peter Huewea3d675c2012-02-09 21:11:47 +01003386 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303387 if (pVBInfo->VGAVDE == 357)
3388 tempbx = 527;
3389 else if (pVBInfo->VGAVDE == 420)
3390 tempbx = 620;
3391 else if (pVBInfo->VGAVDE == 525)
3392 tempbx = 775;
3393 else if (pVBInfo->VGAVDE == 600)
3394 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303395 else
3396 tempbx = 768;
3397 } else
3398 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003399 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 tempax = 1024;
3401 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003402 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303403 tempax = 1280;
3404 if (pVBInfo->VGAVDE == 360)
3405 tempbx = 768;
3406 else if (pVBInfo->VGAVDE == 375)
3407 tempbx = 800;
3408 else if (pVBInfo->VGAVDE == 405)
3409 tempbx = 864;
3410 else
3411 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003412 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303413 tempax = 1280;
3414 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003415 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303416 tempax = 1280;
3417 if (pVBInfo->VGAVDE == 350)
3418 tempbx = 700;
3419 else if (pVBInfo->VGAVDE == 400)
3420 tempbx = 800;
3421 else if (pVBInfo->VGAVDE == 1024)
3422 tempbx = 960;
3423 else
3424 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003425 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303426 tempax = 1400;
3427 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003428
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303429 if (pVBInfo->VGAVDE == 1024) {
3430 tempax = 1280;
3431 tempbx = 1024;
3432 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003433 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 tempax = 1600;
3435 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003436 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303437 if (pVBInfo->VGAVDE == 350)
3438 tempbx = 875;
3439 else if (pVBInfo->VGAVDE == 400)
3440 tempbx = 1000;
3441 }
3442 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303444 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3445 tempax = pVBInfo->VGAHDE;
3446 tempbx = pVBInfo->VGAVDE;
3447 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003448
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303449 pVBInfo->HDE = tempax;
3450 pVBInfo->VDE = tempbx;
3451 return;
3452 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003453
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303454 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
3455 tempbx = 4;
Peter Huewefc39dcb2012-01-15 19:22:12 +01003456 TVPtr = (struct SiS_TVData *) XGI_GetTVPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303457 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3458 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3461 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3462 pVBInfo->VGAHT = TVPtr->VGAHT;
3463 pVBInfo->VGAVT = TVPtr->VGAVT;
3464 pVBInfo->HDE = TVPtr->TVHDE;
3465 pVBInfo->VDE = TVPtr->TVVDE;
3466 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3467 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003468
Peter Huewe599801f2012-02-09 21:11:45 +01003469 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303470 if (resinfo == 0x08)
3471 pVBInfo->NewFlickerMode = 0x40;
3472 else if (resinfo == 0x09)
3473 pVBInfo->NewFlickerMode = 0x40;
3474 else if (resinfo == 0x12)
3475 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003476
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303477 if (pVBInfo->VGAVDE == 350)
3478 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 tempax = ExtHiTVHT;
3481 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003482
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303483 if (pVBInfo->VBInfo & SetInSlaveMode) {
3484 if (pVBInfo->TVInfo & TVSimuMode) {
3485 tempax = StHiTVHT;
3486 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003487
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303488 if (!(modeflag & Charx8Dot)) {
3489 tempax = StHiTextTVHT;
3490 tempbx = StHiTextTVVT;
3491 }
3492 }
3493 }
Peter Huewe599801f2012-02-09 21:11:45 +01003494 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3495 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3497 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3498 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003499
Peter Huewe599801f2012-02-09 21:11:45 +01003500 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303501 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3502 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003503 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303504 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3505 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3506 if (pVBInfo->TVInfo & NTSC1024x768)
3507 tempax = NTSC1024x768HT;
3508 }
3509 } else {
3510 tempax = PALHT;
3511 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003512 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303513 tempax = NTSCHT;
3514 tempbx = NTSCVT;
3515 if (pVBInfo->TVInfo & NTSC1024x768)
3516 tempax = NTSC1024x768HT;
3517 }
3518 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303520 pVBInfo->HT = tempax;
3521 pVBInfo->VT = tempbx;
3522 return;
3523 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003524}
3525
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003526static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303527 unsigned short RefreshRateTableIndex,
3528 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003529{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003530 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003531
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303532 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3533 pVBInfo);
3534 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3535 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003536
Peter Huewe6896b942012-02-09 21:11:46 +01003537 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303538 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003539 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3540 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3541 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303542 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003543 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3544 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303545 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003546
Aaro Koskinen8104e322011-03-13 12:26:22 +02003547 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303549 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003550 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303551 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003552 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003553}
3554
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003555static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3556 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003557{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003558 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3559 short index;
3560 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303561
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003562 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003563 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003565 if (index < 0)
3566 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303567
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003568 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303569}
3570
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003571static unsigned short XGI_GetOffset(unsigned short ModeNo,
3572 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303573 unsigned short RefreshRateTableIndex,
3574 struct xgi_hw_device_info *HwDeviceExtension,
3575 struct vb_device_info *pVBInfo)
3576{
3577 unsigned short temp, colordepth, modeinfo, index, infoflag,
3578 ColorDepth[] = { 0x01, 0x02, 0x04 };
3579
3580 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003581 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303582
3583 index = (modeinfo >> 8) & 0xFF;
3584
3585 temp = pVBInfo->ScreenOffset[index];
3586
3587 if (infoflag & InterlaceMode)
3588 temp = temp << 1;
3589
3590 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3591
3592 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3593 temp = ModeNo - 0x7C;
3594 colordepth = ColorDepth[temp];
3595 temp = 0x6B;
3596 if (infoflag & InterlaceMode)
3597 temp = temp << 1;
3598 return temp * colordepth;
3599 } else {
3600 return temp * colordepth;
3601 }
3602}
3603
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003604static void XGI_SetCRT2Offset(unsigned short ModeNo,
3605 unsigned short ModeIdIndex,
3606 unsigned short RefreshRateTableIndex,
3607 struct xgi_hw_device_info *HwDeviceExtension,
3608 struct vb_device_info *pVBInfo)
3609{
3610 unsigned short offset;
3611 unsigned char temp;
3612
3613 if (pVBInfo->VBInfo & SetInSlaveMode)
3614 return;
3615
3616 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3617 HwDeviceExtension, pVBInfo);
3618 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003619 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003620 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003621 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003622 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003623 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003624}
3625
Randy Dunlap89229672010-08-10 08:46:44 -07003626static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003627{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003628 /* threshold high ,disable auto threshold */
3629 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3630 /* threshold low default 04h */
3631 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003632}
3633
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003634static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303635 struct xgi_hw_device_info *HwDeviceExtension,
3636 unsigned short RefreshRateTableIndex,
3637 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003638{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303639 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003640
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003641 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3642 CRT1Index &= IndexMask;
3643 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303645 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3646 HwDeviceExtension, pVBInfo);
3647 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303649 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003650 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003651
Aaro Koskinen8104e322011-03-13 12:26:22 +02003652 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3653 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003654}
3655
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003656static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303657 struct xgi_hw_device_info *HwDeviceExtension,
3658 unsigned short RefreshRateTableIndex,
3659 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003660{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303661 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3662 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003663
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003664 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3665 CRT1Index &= IndexMask;
3666 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3667 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303669 /* bainy change table name */
3670 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003671 /* BTVGA2HT 0x08,0x09 */
3672 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003673 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303674 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003675 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003676 /* BTVGA2HDEE 0x0A,0x0C */
3677 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003678 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303679 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3680 pushbx = pVBInfo->VGAHDE / 2 + 16;
3681 tempcx = tempcx >> 1;
3682 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3683 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003684
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303685 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3686 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003687 tempbx |= ((pVBInfo->
3688 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3689 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303690 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3691 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3692 tempcx &= 0x1F;
3693 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3694 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3695 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3696 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003697
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303698 tempbx += 4;
3699 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003700
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 if (tempcx > (pVBInfo->VGAHT / 2))
3702 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003705
Aaro Koskinen8104e322011-03-13 12:26:22 +02003706 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303707 } else {
3708 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003709 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303710 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003711 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003712 /* BTVGA2HDEE 0x0A,0x0C */
3713 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003714 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303715 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3716 pushbx = pVBInfo->VGAHDE + 16;
3717 tempcx = tempcx >> 1;
3718 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3719 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303721 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3722 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003723 tempbx |= ((pVBInfo->
3724 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3725 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303726 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3727 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3728 tempcx &= 0x1F;
3729 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3730 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3731 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3732 tempbx += 16;
3733 tempcx += 16;
3734 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003735
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303736 if (tempcx > pVBInfo->VGAHT)
3737 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303739 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003740 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303741 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3744 tempbx = pushbx;
3745 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3746 tempax |= (tempbx & 0xFF00);
3747 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003748 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303749 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003750 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303751 tempcx = (pVBInfo->VGAVT - 1);
3752 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003753
Aaro Koskinen8104e322011-03-13 12:26:22 +02003754 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303755 tempbx = pVBInfo->VGAVDE - 1;
3756 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003757 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303758 temp = ((tempbx & 0xFF00) << 3) >> 8;
3759 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003760 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303762 tempax = pVBInfo->VGAVDE;
3763 tempbx = pVBInfo->VGAVDE;
3764 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003765 /* BTVGA2VRS 0x10,0x11 */
3766 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3767 /* BTVGA2VRE 0x11 */
3768 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303770 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3771 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3772 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303774 if (temp & 0x04)
3775 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303777 if (temp & 0x080)
3778 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303780 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303782 if (temp & 0x08)
3783 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003784
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303785 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3786 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3787 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303789 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003790 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303791 temp = ((tempbx & 0xFF00) >> 8) << 4;
3792 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003793 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303794 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303796 if (modeflag & DoubleScanMode)
3797 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303799 if (modeflag & HalfDCLK)
3800 tempax |= 0x40;
3801
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003802 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003803}
3804
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003805static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3806{
3807 unsigned long tempax, tempbx;
3808
3809 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3810 & 0xFFFF;
3811 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3812 tempax = (tempax * pVBInfo->HT) / tempbx;
3813
3814 return (unsigned short) tempax;
3815}
3816
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003817static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303818 struct xgi_hw_device_info *HwDeviceExtension,
3819 unsigned short RefreshRateTableIndex,
3820 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003821{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303822 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3823 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003824
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003825 /* si+Ext_ResInfo */
3826 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3827 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3828 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3829 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303831 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3832 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303834 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003835 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303836 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003837
Peter Huewe6896b942012-02-09 21:11:46 +01003838 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303839 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303843 if (modeflag & HalfDCLK)
3844 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303846 tempax = (tempax / tempcx) - 1;
3847 tempbx |= ((tempax & 0x00FF) << 8);
3848 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003849 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303851 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303853 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003854 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3855 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303856 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003857
Peter Huewe599801f2012-02-09 21:11:45 +01003858 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01003859 if (pVBInfo->VBType & VB_SIS301LV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
3861 if (resinfo == 7)
3862 temp -= 2;
3863 }
3864 } else if (resinfo == 7) {
3865 temp -= 2;
3866 }
3867 }
3868 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003869
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003870 /* 0x05 Horizontal Display Start */
3871 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3872 /* 0x06 Horizontal Blank end */
3873 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003874
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303875 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3876 if (pVBInfo->VBInfo & SetCRT2ToTV)
3877 tempax = pVBInfo->VGAHT;
3878 else
3879 tempax = XGI_GetVGAHT2(pVBInfo);
3880 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303882 if (tempax >= pVBInfo->VGAHT)
3883 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303885 if (modeflag & HalfDCLK)
3886 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303888 tempax = (tempax / tempcx) - 5;
3889 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003890 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303891 temp = (tempbx & 0x00FF) - 1;
3892 if (!(modeflag & HalfDCLK)) {
3893 temp -= 6;
3894 if (pVBInfo->TVInfo & TVSimuMode) {
3895 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003896 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303897 }
3898 }
3899 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303900 tempbx = (tempbx & 0xFF00) >> 8;
3901 tempcx = (tempcx + tempbx) >> 1;
3902 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303904 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3905 temp -= 1;
3906 if (!(modeflag & HalfDCLK)) {
3907 if ((modeflag & Charx8Dot)) {
3908 temp += 4;
3909 if (pVBInfo->VGAHDE >= 800)
3910 temp -= 6;
3911 }
3912 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003913 } else if (!(modeflag & HalfDCLK)) {
3914 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003915 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003916 pVBInfo->VGAHDE >= 800) {
3917 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003918 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003919 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003920 (pVBInfo->LCDInfo & LCDNonExpanding))
3921 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303922 }
3923 }
3924 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003925
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003926 /* 0x07 Horizontal Retrace Start */
3927 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3928 /* 0x08 Horizontal Retrace End */
3929 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303931 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3932 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003933 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303934 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003935 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303936 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003937 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303938 0x08, 0x03);
3939 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003940 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303941 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003942 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303943 0x08, 0x02);
3944 }
3945 }
3946 }
3947 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003948
Aaro Koskinen8104e322011-03-13 12:26:22 +02003949 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003950 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003951 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303953 tempbx = pVBInfo->VGAVT;
3954 push1 = tempbx;
3955 tempcx = 0x121;
3956 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303958 if (tempbx == 357)
3959 tempbx = 350;
3960 if (tempbx == 360)
3961 tempbx = 350;
3962 if (tempbx == 375)
3963 tempbx = 350;
3964 if (tempbx == 405)
3965 tempbx = 400;
3966 if (tempbx == 525)
3967 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303969 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003970
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003972 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003973 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303974 if (tempbx == 350)
3975 tempbx += 5;
3976 if (tempbx == 480)
3977 tempbx += 5;
3978 }
3979 }
3980 }
3981 tempbx--;
3982 temp = tempbx & 0x00FF;
3983 tempbx--;
3984 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003985 /* 0x10 vertical Blank Start */
3986 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303987 tempbx = push2;
3988 tempbx--;
3989 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003990 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303992 if (tempbx & 0x0100)
3993 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303997 if (modeflag & DoubleScanMode)
3998 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304000 if (tempbx & 0x0200)
4001 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004002
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304003 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004004 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304006 if (tempbx & 0x0400)
4007 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004008
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004009 /* 0x11 Vertival Blank End */
4010 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304011
4012 tempax = push1;
4013 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4014 tempax = tempax >> 2;
4015 push1 = tempax; /* push ax */
4016
4017 if (resinfo != 0x09) {
4018 tempax = tempax << 1;
4019 tempbx += tempax;
4020 }
4021
Peter Huewe599801f2012-02-09 21:11:45 +01004022 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02004023 if ((pVBInfo->VBType & VB_SIS301LV) &&
4024 !(pVBInfo->TVInfo & TVSetHiVision)) {
4025 if ((pVBInfo->TVInfo & TVSimuMode) &&
4026 (pVBInfo->TVInfo & TVSetPAL)) {
4027 if (!(pVBInfo->VBType & VB_SIS301LV) ||
4028 !(pVBInfo->TVInfo &
4029 (TVSetYPbPr525p |
4030 TVSetYPbPr750p |
4031 TVSetHiVision)))
4032 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304033 }
4034 } else {
4035 tempbx -= 10;
4036 }
4037 } else {
4038 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004039 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01004040 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004041 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004042 (TVSetYPbPr525p |
4043 TVSetYPbPr750p |
4044 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304045 tempbx += 40;
4046 } else {
4047 tempbx += 40;
4048 }
4049 }
4050 }
4051 }
4052 tempax = push1;
4053 tempax = tempax >> 2;
4054 tempax++;
4055 tempax += tempbx;
4056 push1 = tempax; /* push ax */
4057
Peter Huewe599801f2012-02-09 21:11:45 +01004058 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304059 if (tempbx <= 513) {
4060 if (tempax >= 513)
4061 tempbx = 513;
4062 }
4063 }
4064
4065 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004066 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304067 tempbx--;
4068 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004069 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304070
4071 if (tempbx & 0x0100)
4072 tempcx |= 0x0008;
4073
4074 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004075 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304076
4077 tempbx++;
4078
4079 if (tempbx & 0x0100)
4080 tempcx |= 0x0004;
4081
4082 if (tempbx & 0x0200)
4083 tempcx |= 0x0080;
4084
4085 if (tempbx & 0x0400)
4086 tempcx |= 0x0C00;
4087
4088 tempbx = push1; /* pop ax */
4089 temp = tempbx & 0x00FF;
4090 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004091 /* 0x0D vertical Retrace End */
4092 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304093
4094 if (tempbx & 0x0010)
4095 tempcx |= 0x2000;
4096
4097 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004098 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304099 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004100 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304101 tempax = modeflag;
4102 temp = (tempax & 0xFF00) >> 8;
4103
4104 temp = (temp >> 1) & 0x09;
4105
Peter Huewe6896b942012-02-09 21:11:46 +01004106 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304107 temp |= 0x01;
4108
Aaro Koskinen8104e322011-03-13 12:26:22 +02004109 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4110 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4111 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304112
4113 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4114 temp = 0x80;
4115 else
4116 temp = 0x00;
4117
Aaro Koskinen8104e322011-03-13 12:26:22 +02004118 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304119
4120 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004121}
4122
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004123static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304124 unsigned short RefreshRateTableIndex,
4125 struct xgi_hw_device_info *HwDeviceExtension,
4126 struct vb_device_info *pVBInfo)
4127{
4128 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4129 modeflag, resinfo, crt2crtc;
4130 unsigned char *TimingPoint;
4131
4132 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4133
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004134 /* si+Ext_ResInfo */
4135 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4136 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4137 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304138
4139 tempax = 0;
4140
4141 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4142 tempax |= 0x0800;
4143
4144 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4145 tempax |= 0x0400;
4146
4147 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4148 tempax |= 0x0200;
4149
Peter Huewe599801f2012-02-09 21:11:45 +01004150 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304151 tempax |= 0x1000;
4152
Peter Huewe599801f2012-02-09 21:11:45 +01004153 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304154 tempax |= 0x0100;
4155
Peter Huewe599801f2012-02-09 21:11:45 +01004156 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304157 tempax &= 0xfe00;
4158
4159 tempax = (tempax & 0xff00) >> 8;
4160
Aaro Koskinen8104e322011-03-13 12:26:22 +02004161 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304162 TimingPoint = pVBInfo->NTSCTiming;
4163
Peter Huewe599801f2012-02-09 21:11:45 +01004164 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304165 TimingPoint = pVBInfo->PALTiming;
4166
Peter Huewe599801f2012-02-09 21:11:45 +01004167 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304168 TimingPoint = pVBInfo->HiTVExtTiming;
4169
4170 if (pVBInfo->VBInfo & SetInSlaveMode)
4171 TimingPoint = pVBInfo->HiTVSt2Timing;
4172
4173 if (pVBInfo->SetFlag & TVSimuMode)
4174 TimingPoint = pVBInfo->HiTVSt1Timing;
4175
4176 if (!(modeflag & Charx8Dot))
4177 TimingPoint = pVBInfo->HiTVTextTiming;
4178 }
4179
Peter Huewe599801f2012-02-09 21:11:45 +01004180 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4181 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304182 TimingPoint = pVBInfo->YPbPr525iTiming;
4183
Peter Huewe599801f2012-02-09 21:11:45 +01004184 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304185 TimingPoint = pVBInfo->YPbPr525pTiming;
4186
Peter Huewe599801f2012-02-09 21:11:45 +01004187 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304188 TimingPoint = pVBInfo->YPbPr750pTiming;
4189 }
4190
4191 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004192 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304193
4194 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004195 /* di->temp2[j] */
4196 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197
4198 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004199 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304200
4201 temp = pVBInfo->NewFlickerMode;
4202 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004203 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304204
Peter Huewe599801f2012-02-09 21:11:45 +01004205 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304206 tempax = 950;
4207
Peter Huewe599801f2012-02-09 21:11:45 +01004208 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304209 tempax = 520;
4210 else
4211 tempax = 440;
4212
4213 if (pVBInfo->VDE <= tempax) {
4214 tempax -= pVBInfo->VDE;
4215 tempax = tempax >> 2;
4216 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4217 push1 = tempax;
4218 temp = (tempax & 0xFF00) >> 8;
4219 temp += (unsigned short) TimingPoint[0];
4220
Peter Huewe6896b942012-02-09 21:11:46 +01004221 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4222 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304223 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4224 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004225 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304226 tempcx = pVBInfo->VGAHDE;
4227 if (tempcx >= 1024) {
4228 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004229 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304230 temp = 0x19; /* PAL */
4231 }
4232 }
4233 }
4234
Aaro Koskinen8104e322011-03-13 12:26:22 +02004235 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304236 tempax = push1;
4237 temp = (tempax & 0xFF00) >> 8;
4238 temp += TimingPoint[1];
4239
Peter Huewe6896b942012-02-09 21:11:46 +01004240 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4241 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304242 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4243 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004244 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304245 tempcx = pVBInfo->VGAHDE;
4246 if (tempcx >= 1024) {
4247 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004248 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304249 temp = 0x52; /* PAL */
4250 }
4251 }
4252 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004253 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304254 }
4255
4256 /* 301b */
4257 tempcx = pVBInfo->HT;
4258
4259 if (XGI_IsLCDDualLink(pVBInfo))
4260 tempcx = tempcx >> 1;
4261
4262 tempcx -= 2;
4263 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004264 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304265
4266 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004267 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304268
4269 tempcx = pVBInfo->HT >> 1;
4270 push1 = tempcx; /* push cx */
4271 tempcx += 7;
4272
Peter Huewe599801f2012-02-09 21:11:45 +01004273 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304274 tempcx -= 4;
4275
4276 temp = tempcx & 0x00FF;
4277 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004278 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304279
4280 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4281 tempbx += tempcx;
4282 push2 = tempbx;
4283 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004284 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304285 temp = (tempbx & 0xFF00) >> 8;
4286 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004287 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304288
4289 tempbx = push2;
4290 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004291 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292 tempbx = tempbx - 4;
4293 tempcx = tempbx;
4294 }
4295
4296 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004297 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304298
4299 j += 2;
4300 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4301 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004302 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304303 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004304 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304305
4306 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004307 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 tempcx -= 4;
4309
4310 temp = tempcx & 0xFF;
4311 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004312 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304313
4314 tempcx = push1; /* pop cx */
4315 j += 2;
4316 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4317 tempcx -= temp;
4318 temp = tempcx & 0x00FF;
4319 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004320 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304321
4322 tempcx -= 11;
4323
4324 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4325 tempax = XGI_GetVGAHT2(pVBInfo);
4326 tempcx = tempax - 1;
4327 }
4328 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004329 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304330
4331 tempbx = pVBInfo->VDE;
4332
4333 if (pVBInfo->VGAVDE == 360)
4334 tempbx = 746;
4335 if (pVBInfo->VGAVDE == 375)
4336 tempbx = 746;
4337 if (pVBInfo->VGAVDE == 405)
4338 tempbx = 853;
4339
4340 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004341 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004342 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004343 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004344 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304345 tempbx = tempbx >> 1;
4346 } else
4347 tempbx = tempbx >> 1;
4348 }
4349
4350 tempbx -= 2;
4351 temp = tempbx & 0x00FF;
4352
Peter Huewe599801f2012-02-09 21:11:45 +01004353 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004354 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004355 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304356 if (pVBInfo->VBInfo & SetInSlaveMode) {
4357 if (ModeNo == 0x2f)
4358 temp += 1;
4359 }
4360 }
4361 } else {
4362 if (pVBInfo->VBInfo & SetInSlaveMode) {
4363 if (ModeNo == 0x2f)
4364 temp += 1;
4365 }
4366 }
4367 }
4368
Aaro Koskinen8104e322011-03-13 12:26:22 +02004369 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370
4371 temp = (tempcx & 0xFF00) >> 8;
4372 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4373
Peter Huewe599801f2012-02-09 21:11:45 +01004374 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004375 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004376 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304377 temp |= 0x10;
4378
4379 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4380 temp |= 0x20;
4381 }
4382 } else {
4383 temp |= 0x10;
4384 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4385 temp |= 0x20;
4386 }
4387 }
4388
Aaro Koskinen8104e322011-03-13 12:26:22 +02004389 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304390
Peter Huewe6896b942012-02-09 21:11:46 +01004391 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4392 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304393 tempbx = pVBInfo->VDE;
4394 tempcx = tempbx - 2;
4395
4396 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004397 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4398 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304399 tempbx = tempbx >> 1;
4400 }
4401
Peter Huewe6896b942012-02-09 21:11:46 +01004402 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304403 temp = 0;
4404 if (tempcx & 0x0400)
4405 temp |= 0x20;
4406
4407 if (tempbx & 0x0400)
4408 temp |= 0x40;
4409
Aaro Koskinen8104e322011-03-13 12:26:22 +02004410 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304411 }
4412
4413 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004414 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304415 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004416 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304417 }
4418
4419 tempbx = tempbx & 0x00FF;
4420
4421 if (!(modeflag & HalfDCLK)) {
4422 tempcx = pVBInfo->VGAHDE;
4423 if (tempcx >= pVBInfo->HDE) {
4424 tempbx |= 0x2000;
4425 tempax &= 0x00FF;
4426 }
4427 }
4428
4429 tempcx = 0x0101;
4430
4431 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4432 if (pVBInfo->VGAHDE >= 1024) {
4433 tempcx = 0x1920;
4434 if (pVBInfo->VGAHDE >= 1280) {
4435 tempcx = 0x1420;
4436 tempbx = tempbx & 0xDFFF;
4437 }
4438 }
4439 }
4440
4441 if (!(tempbx & 0x2000)) {
4442 if (modeflag & HalfDCLK)
4443 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4444
4445 push1 = tempbx;
4446 tempeax = pVBInfo->VGAHDE;
4447 tempebx = (tempcx & 0xFF00) >> 8;
4448 longtemp = tempeax * tempebx;
4449 tempecx = tempcx & 0x00FF;
4450 longtemp = longtemp / tempecx;
4451
4452 /* 301b */
4453 tempecx = 8 * 1024;
4454
Peter Huewe6896b942012-02-09 21:11:46 +01004455 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4456 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304457 tempecx = tempecx * 8;
4458 }
4459
4460 longtemp = longtemp * tempecx;
4461 tempecx = pVBInfo->HDE;
4462 temp2 = longtemp % tempecx;
4463 tempeax = longtemp / tempecx;
4464 if (temp2 != 0)
4465 tempeax += 1;
4466
4467 tempax = (unsigned short) tempeax;
4468
4469 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004470 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4471 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304472 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4473 }
4474 /* end 301b */
4475
4476 tempbx = push1;
4477 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4478 | (tempbx & 0x00FF));
4479 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4480 | (tempax & 0x00FF));
4481 temp = (tempax & 0xFF00) >> 8;
4482 } else {
4483 temp = (tempax & 0x00FF) >> 8;
4484 }
4485
Aaro Koskinen8104e322011-03-13 12:26:22 +02004486 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304487 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004488 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304489 temp = tempcx & 0x00FF;
4490
4491 if (tempbx & 0x2000)
4492 temp = 0;
4493
4494 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4495 temp |= 0x18;
4496
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004497 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004498 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304499 tempbx = 0x0382;
4500 tempcx = 0x007e;
4501 } else {
4502 tempbx = 0x0369;
4503 tempcx = 0x0061;
4504 }
4505
4506 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004507 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004509 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510
4511 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4512 temp = temp << 2;
4513 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4514
Peter Huewe599801f2012-02-09 21:11:45 +01004515 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304516 temp |= 0x10;
4517
Peter Huewe599801f2012-02-09 21:11:45 +01004518 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304519 temp |= 0x20;
4520
Peter Huewe599801f2012-02-09 21:11:45 +01004521 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304522 temp |= 0x60;
4523 }
4524
Aaro Koskinen8104e322011-03-13 12:26:22 +02004525 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004526 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004527 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304528
Peter Huewe599801f2012-02-09 21:11:45 +01004529 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304530 if (pVBInfo->TVInfo & NTSC1024x768) {
4531 TimingPoint = XGI_NTSC1024AdjTime;
4532 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004533 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304534 TimingPoint[j]);
4535 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004536 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304537 }
4538 }
4539
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004540 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304541 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004542 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004543 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304544 0x08); /* PALM Mode */
4545 }
4546
Peter Huewe599801f2012-02-09 21:11:45 +01004547 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004548 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 0x01);
4550 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004551 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304552
Aaro Koskinendc505562011-03-13 12:26:26 +02004553 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304554 }
4555
Peter Huewe599801f2012-02-09 21:11:45 +01004556 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304557 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004558 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304559 }
4560
4561 if (pVBInfo->VBInfo & SetCRT2ToTV)
4562 return;
4563}
4564
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004565static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304566 struct xgi_hw_device_info *HwDeviceExtension,
4567 unsigned short RefreshRateTableIndex,
4568 struct vb_device_info *pVBInfo)
4569{
4570 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4571 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4572
4573 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4574
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004575 /* si+Ext_ResInfo */
4576 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4577 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4578 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4579 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304580
4581 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4582 return;
4583
4584 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4585
4586 if (XGI_IsLCDDualLink(pVBInfo))
4587 tempbx = tempbx >> 1;
4588
4589 tempbx -= 1;
4590 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004591 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304592 temp = (tempbx & 0xFF00) >> 8;
4593 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004594 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304595 temp = 0x01;
4596
Aaro Koskinen8104e322011-03-13 12:26:22 +02004597 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304598 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4599 push1 = tempbx;
4600 tempbx--;
4601 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004602 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304603 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004604 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304605
4606 tempcx = pVBInfo->VT - 1;
4607 push2 = tempcx + 1;
4608 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004609 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304610 temp = (tempcx & 0xFF00) >> 8;
4611 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004612 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004613 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4614 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4615 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4616 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304617
4618 /* Customized LCDB Des no add */
4619 tempbx = 5;
4620 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
4621 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4622 tempah = pVBInfo->LCDResInfo;
4623 tempah &= PanelResInfo;
4624
Peter Huewe255aabd2012-02-09 21:11:44 +01004625 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 tempbx = 1024;
4627 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004628 } else if ((tempah == Panel_1280x1024) ||
4629 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304630 tempbx = 1280;
4631 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004632 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304633 tempbx = 1400;
4634 tempcx = 1050;
4635 } else {
4636 tempbx = 1600;
4637 tempcx = 1200;
4638 }
4639
4640 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4641 tempbx = pVBInfo->HDE;
4642 tempcx = pVBInfo->VDE;
4643 }
4644
4645 pushbx = tempbx;
4646 tempax = pVBInfo->VT;
4647 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4648 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4649 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4650 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4651 tempbx = pVBInfo->LCDVDES;
4652 tempcx += tempbx;
4653
4654 if (tempcx >= tempax)
4655 tempcx -= tempax; /* lcdvdes */
4656
4657 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004658 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304659 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004660 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4662 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4663 tempah = tempch;
4664 tempah = tempah << 3;
4665 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004666 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304667
4668 /* getlcdsync() */
4669 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4670 tempcx = tempbx;
4671 tempax = pVBInfo->VT;
4672 tempbx = pVBInfo->LCDVRS;
4673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304674 tempcx += tempbx;
4675 if (tempcx >= tempax)
4676 tempcx -= tempax;
4677
4678 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004679 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304680 temp = (tempbx & 0xFF00) >> 8;
4681 temp = temp << 4;
4682 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004683 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304684 tempcx = pushbx;
4685 tempax = pVBInfo->HT;
4686 tempbx = pVBInfo->LCDHDES;
4687 tempbx &= 0x0FFF;
4688
4689 if (XGI_IsLCDDualLink(pVBInfo)) {
4690 tempax = tempax >> 1;
4691 tempbx = tempbx >> 1;
4692 tempcx = tempcx >> 1;
4693 }
4694
Peter Huewe6896b942012-02-09 21:11:46 +01004695 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304696 tempbx += 1;
4697
4698 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4699 tempbx += 1;
4700
4701 tempcx += tempbx;
4702
4703 if (tempcx >= tempax)
4704 tempcx -= tempax;
4705
4706 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004707 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304708 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004709 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004711 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304712 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004713 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304714
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304715 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4716 tempcx = tempax;
4717 tempax = pVBInfo->HT;
4718 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304719 if (XGI_IsLCDDualLink(pVBInfo)) {
4720 tempax = tempax >> 1;
4721 tempbx = tempbx >> 1;
4722 tempcx = tempcx >> 1;
4723 }
4724
Peter Huewe6896b942012-02-09 21:11:46 +01004725 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304726 tempbx += 1;
4727
4728 tempcx += tempbx;
4729
4730 if (tempcx >= tempax)
4731 tempcx -= tempax;
4732
4733 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004734 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304735
4736 temp = (tempbx & 0xFF00) >> 8;
4737 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004738 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304739 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004740 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304741
Peter Huewea3d675c2012-02-09 21:11:47 +01004742 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304743 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004744 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4745 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304746 | VB_XGI301C)) {
4747 temp = 0xC6;
4748 } else
4749 temp = 0xC4;
4750
Aaro Koskinen8104e322011-03-13 12:26:22 +02004751 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4752 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304753 }
4754
4755 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004756 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4757 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304758 | VB_XGI301C)) {
4759 temp = 0x4F;
4760 } else
4761 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004762 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304763 }
4764 }
4765}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004766
4767/* --------------------------------------------------------------------- */
4768/* Function : XGI_GetTap4Ptr */
4769/* Input : */
4770/* Output : di -> Tap4 Reg. Setting Pointer */
4771/* Description : */
4772/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004773static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304774 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004775{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304778 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304780 if (tempcx == 0) {
4781 tempax = pVBInfo->VGAHDE;
4782 tempbx = pVBInfo->HDE;
4783 } else {
4784 tempax = pVBInfo->VGAVDE;
4785 tempbx = pVBInfo->VDE;
4786 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004787
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004788 if (tempax <= tempbx)
4789 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304790 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004791 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Peter Huewe599801f2012-02-09 21:11:45 +01004793 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304794 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004795
Peter Huewe599801f2012-02-09 21:11:45 +01004796 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4797 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4798 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004799 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004800 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304801 Tap4TimingPtr = YPbPr750pTap4Timing;
4802 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004803
Peter Huewe599801f2012-02-09 21:11:45 +01004804 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004805 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807 i = 0;
4808 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4809 if (Tap4TimingPtr[i].DE == tempax)
4810 break;
4811 i++;
4812 }
4813 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004814}
4815
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004816static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004817{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304818 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304822 if (!(pVBInfo->VBType & VB_XGI301C))
4823 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004824
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304825 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4826 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004827 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004828
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004829 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004830 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004831 /* Set Vertical Scaling */
4832 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304833 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004834 xgifb_reg_set(pVBInfo->Part2Port,
4835 i,
4836 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304837 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004838
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004839 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004840 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004841 /* Enable V.Scaling */
4842 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304843 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004844 /* Enable H.Scaling */
4845 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004846}
4847
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004848static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304849 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004850{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 unsigned short i;
4852 unsigned char *tempdi;
4853 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004854
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004855 /* si+Ext_ResInfo */
4856 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004857
Aaro Koskinen8104e322011-03-13 12:26:22 +02004858 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004859 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004860 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4861 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304862 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004863 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4864 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304867 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4868 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004869
Peter Huewe599801f2012-02-09 21:11:45 +01004870 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004871 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4872 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4873 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304874 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004875
Peter Huewe599801f2012-02-09 21:11:45 +01004876 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4877 & SetCRT2ToYPbPr525750)) {
4878 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304879 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004880
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304881 tempdi = pVBInfo->HiTVGroup3Data;
4882 if (pVBInfo->SetFlag & TVSimuMode) {
4883 tempdi = pVBInfo->HiTVGroup3Simu;
4884 if (!(modeflag & Charx8Dot))
4885 tempdi = pVBInfo->HiTVGroup3Text;
4886 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004887
Peter Huewe599801f2012-02-09 21:11:45 +01004888 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304889 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004890
Peter Huewe599801f2012-02-09 21:11:45 +01004891 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304892 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304894 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004895 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304897 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004898 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004899 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304900 }
4901 }
4902 return;
4903} /* {end of XGI_SetGroup3} */
4904
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004905static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304906 unsigned short RefreshRateTableIndex,
4907 struct xgi_hw_device_info *HwDeviceExtension,
4908 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004909{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304910 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304912 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004913
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004914 /* si+Ext_ResInfo */
4915 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304916 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004917 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004918
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304919 tempbx = pVBInfo->RVBHCMAX;
4920 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004921 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304922 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4923 tempcx = pVBInfo->VGAHT - 1;
4924 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004925 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004926
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304927 temp = ((tempcx & 0xFF00) >> 8) << 3;
4928 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304930 tempcx = pVBInfo->VGAVT - 1;
4931 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4932 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004933
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304934 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004935 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304936 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004937 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004938 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304939 tempcx = pVBInfo->VBInfo;
4940 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304942 if (modeflag & HalfDCLK)
4943 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304945 if (XGI_IsLCDDualLink(pVBInfo))
4946 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004947
Peter Huewe599801f2012-02-09 21:11:45 +01004948 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304949 temp = 0;
4950 if (tempbx <= 1024)
4951 temp = 0xA0;
4952 if (tempbx == 1280)
4953 temp = 0xC0;
4954 } else if (tempcx & SetCRT2ToTV) {
4955 temp = 0xA0;
4956 if (tempbx <= 800)
4957 temp = 0x80;
4958 } else {
4959 temp = 0x80;
4960 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4961 temp = 0;
4962 if (tempbx > 800)
4963 temp = 0x60;
4964 }
4965 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004966
Peter Huewe599801f2012-02-09 21:11:45 +01004967 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304968 temp = 0x00;
4969 if (pVBInfo->VGAHDE == 1280)
4970 temp = 0x40;
4971 if (pVBInfo->VGAHDE == 1024)
4972 temp = 0x20;
4973 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004974 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304976 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004977
Peter Huewe599801f2012-02-09 21:11:45 +01004978 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304979 if (!(temp & 0xE000))
4980 tempbx = tempbx >> 1;
4981 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304983 tempcx = pVBInfo->RVBHRS;
4984 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004985 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304987 tempeax = pVBInfo->VGAVDE;
4988 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004989
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304990 if (tempeax <= tempebx) {
4991 tempcx = (tempcx & (~0x4000));
4992 tempeax = pVBInfo->VGAVDE;
4993 } else {
4994 tempeax -= tempebx;
4995 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304997 templong = (tempeax * 256 * 1024) % tempebx;
4998 tempeax = (tempeax * 256 * 1024) / tempebx;
4999 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305001 if (templong != 0)
5002 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305004 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005005 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005006
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305007 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005008 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305009 tempbx = (unsigned short) (tempebx >> 16);
5010 temp = tempbx & 0x00FF;
5011 temp = temp << 4;
5012 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005013 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005014
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305015 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005016 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5017 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305018 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005019 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305020 tempax = pVBInfo->VGAHDE;
5021 if (modeflag & HalfDCLK)
5022 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005023
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305024 if (XGI_IsLCDDualLink(pVBInfo))
5025 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005026
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305027 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5028 if (tempax > 800)
5029 tempax -= 800;
5030 } else {
5031 if (pVBInfo->VGAHDE > 800) {
5032 if (pVBInfo->VGAHDE == 1024)
5033 tempax = (tempax * 25 / 32) - 1;
5034 else
5035 tempax = (tempax * 20 / 32) - 1;
5036 }
5037 }
5038 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005039
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305040 temp = (tempax & 0xFF00) >> 8;
5041 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005042 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005044 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005045
Peter Huewe599801f2012-02-09 21:11:45 +01005046 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305047 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005048 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305050 }
5051 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005052
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305053 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5054 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01005055 | TVSetYPbPr525p | TVSetYPbPr750p
5056 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305057 temp |= 0x0001;
5058 if ((pVBInfo->VBInfo & SetInSlaveMode)
5059 && (!(pVBInfo->TVInfo
5060 & TVSimuMode)))
5061 temp &= (~0x0001);
5062 }
5063 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005064
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005065 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305066 tempbx = pVBInfo->HT;
5067 if (XGI_IsLCDDualLink(pVBInfo))
5068 tempbx = tempbx >> 1;
5069 tempbx = (tempbx >> 1) - 2;
5070 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005071 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305072 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005073 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305074 }
5075 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005076
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305077 if (pVBInfo->ISXPDOS == 0)
5078 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5079 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005080}
5081
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005082static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5083{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005084 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005085}
5086
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005087static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305088 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005089{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305090 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305092 Pindex = pVBInfo->Part5Port;
5093 Pdata = pVBInfo->Part5Port + 1;
5094 if (pVBInfo->ModeType == ModeVGA) {
5095 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005096 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305097 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305098 }
5099 }
5100 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005101}
5102
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005103static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305104 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005105{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005106 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005107}
5108
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005109static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305110 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005111{
5112
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005113 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005114}
5115
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005116static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5117 unsigned short ModeNo, unsigned short ModeIdIndex,
5118 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005119{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005120 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005121
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005122 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005123 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5124 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5125 /* si+St_ModeFlag */
5126 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305128 if (!(modeflag & Charx8Dot)) {
5129 xres /= 9;
5130 xres *= 8;
5131 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005132
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005133 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5134 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005135
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005136 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5137 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005138
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005139 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305140 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005141
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005142 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305143 return 0;
5144
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005145 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5146 yres != xgifb_info->lvds_data.LVDSVDE) {
5147 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
5148 if (colordepth > 2)
5149 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305150 }
5151 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005152}
5153
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005154static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5155 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005156 unsigned short ModeNo,
5157 unsigned short ModeIdIndex,
5158 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005159{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305160 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005161 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5163 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5164 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005165
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005166 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005167 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305168 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005169 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005170
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005171 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005172
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005173 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005174 /* SR35[7] FP VSync polarity */
5175 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5176 /* SR30[5] FP HSync polarity */
5177 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005178
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005179 if (chip_id == XG27)
5180 XGI_SetXG27FPBits(pVBInfo);
5181 else
5182 XGI_SetXG21FPBits(pVBInfo);
5183
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005184 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005185 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5186 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5187 /* si+St_ModeFlag */
5188 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305190 if (!(modeflag & Charx8Dot))
5191 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005192
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005193 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005194
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005195 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305197 if (LVDSHBS > LVDSHT)
5198 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005199
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005200 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305201 if (LVDSHRS > LVDSHT)
5202 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005203
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005204 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305205 if (LVDSHRE > LVDSHT)
5206 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005207
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005208 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005209
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005210 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005211
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005212 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005213 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305214 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005215
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305216 if (LVDSVBS > LVDSVT)
5217 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005218
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005219 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305220 if (LVDSVRS > LVDSVT)
5221 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005222
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005223 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305224 if (LVDSVRE > LVDSVT)
5225 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005226
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005227 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005228
Aaro Koskinen58839b02011-03-13 12:26:23 +02005229 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005230 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305232 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005233 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305235 /* HT SR0B[1:0] CR00 */
5236 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005237 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005238 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305240 /* HBS SR0B[5:4] CR02 */
5241 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005242 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005243 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305245 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5246 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005247 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5248 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5249 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 /* HRS SR0B[7:6] CR04 */
5252 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005253 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005254 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005255
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305256 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5257 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005258 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005259 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005260
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305261 /* HRE SR0C[2] CR05[4:0] */
5262 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005263 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5264 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305266 /* Panel HRE SR2F[7:2] */
5267 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005268 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305270 /* VT SR0A[0] CR07[5][0] CR06 */
5271 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005272 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5273 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5274 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005275 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305277 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5278 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005279 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5280 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5281 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005282 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305284 /* VBE SR0A[4] CR16 */
5285 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005286 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005287 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005288
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305289 /* VRS SR0A[3] CR7[7][2] CR10 */
5290 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005291 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5292 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5293 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005294 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005295
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005296 if (chip_id == XG27) {
5297 /* Panel VRS SR35[2:0] SR34[7:0] */
5298 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5299 (value & 0x700) >> 8);
5300 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5301 } else {
5302 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5303 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5304 (value & 0x600) >> 9);
5305 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5306 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5307 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005308
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305309 /* VRE SR0A[5] CR11[3:0] */
5310 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005311 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5312 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305314 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005315 if (chip_id == XG27)
5316 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5317 (value << 2) & 0xFC);
5318 else
5319 /* SR3F[7] has to be 0, h/w bug */
5320 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5321 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005322
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305323 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005324
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005325 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005326 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005327 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005328 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005329 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305330 value += 0x10;
5331 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005332
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305333 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005334 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005335 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005336 /* set data, panning = 0, shift left 1 dot*/
5337 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005338
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005339 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005340 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305341
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005342 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305343 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005344
5345}
5346
5347/* --------------------------------------------------------------------- */
5348/* Function : XGI_IsLCDON */
5349/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005350/* Output : 0 : Skip PSC Control */
5351/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005352/* Description : */
5353/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005354static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005355{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305356 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005357
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305358 tempax = pVBInfo->VBInfo;
5359 if (tempax & SetCRT2ToDualEdge)
5360 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005361 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305362 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305364 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005365}
5366
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005367/* --------------------------------------------------------------------- */
5368/* Function : XGI_DisableChISLCD */
5369/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005370/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005371/* Description : */
5372/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005373static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005374{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305375 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305377 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005378 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305380 if (tempbx & (EnableChA | DisableChA)) {
5381 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5382 return 0;
5383 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005384
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305385 if (!(tempbx & (EnableChB | DisableChB)))
5386 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005387
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305388 if (tempah & 0x01) /* Chk LCDB Mode */
5389 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305391 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005392}
5393
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005394/* --------------------------------------------------------------------- */
5395/* Function : XGI_EnableChISLCD */
5396/* Input : */
5397/* Output : 0 -> Not LCD mode */
5398/* Description : */
5399/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005400static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005401{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305402 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305404 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005405 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 if (tempbx & (EnableChA | DisableChA)) {
5408 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5409 return 0;
5410 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305412 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005413 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005414
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305415 if (tempah & 0x01) /* Chk LCDB Mode */
5416 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305418 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005419}
5420
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005421static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5422 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305423 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005424{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005425 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005426
Peter Huewe6896b942012-02-09 21:11:46 +01005427 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5428 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005430 if (!(pVBInfo->VBInfo &
5431 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005432 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305433 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5434 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005435 if (!(pVBInfo->VBInfo &
5436 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005437 /* Disable Channel B */
5438 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305440 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005441 /* force to disable Cahnnel */
5442 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305444 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005445 /* Force to disable Channel B */
5446 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305447 }
5448 }
5449 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005450
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005451 /* disable part4_1f */
5452 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005453
Peter Huewe6896b942012-02-09 21:11:46 +01005454 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005455 if (((pVBInfo->VBInfo &
5456 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5457 || (XGI_DisableChISLCD(pVBInfo))
5458 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005459 /* LVDS Driver power down */
5460 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005464 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305465 | SetSimuScanMode))) {
5466 if (pVBInfo->SetFlag & GatingCRT)
5467 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005468 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305469 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005470
Peter Huewea3d675c2012-02-09 21:11:47 +01005471 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305472 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005473 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005474 /* Power down */
5475 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305476 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005477
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005478 /* disable TV as primary VGA swap */
5479 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005480
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305481 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005482 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005483
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005484 if ((pVBInfo->SetFlag & DisableChB) ||
5485 (pVBInfo->VBInfo &
5486 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005487 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005488 (pVBInfo->VBInfo &
5489 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005490 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005491
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005492 if ((pVBInfo->SetFlag & DisableChB) ||
5493 (pVBInfo->VBInfo &
5494 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005495 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005496 (pVBInfo->VBInfo &
5497 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5498 /* save Part1 index 0 */
5499 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5500 /* BTDAC = 1, avoid VB reset */
5501 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5502 /* disable CRT2 */
5503 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5504 /* restore Part1 index 0 */
5505 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305506 }
5507 } else { /* {301} */
5508 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005509 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5510 /* Disable CRT2 */
5511 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5512 /* Disable TV asPrimary VGA swap */
5513 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305514 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005515
Peter Huewea3d675c2012-02-09 21:11:47 +01005516 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305517 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005518 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305519 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005520}
5521
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005522/* --------------------------------------------------------------------- */
5523/* Function : XGI_GetTVPtrIndex */
5524/* Input : */
5525/* Output : */
5526/* Description : bx 0 : ExtNTSC */
5527/* 1 : StNTSC */
5528/* 2 : ExtPAL */
5529/* 3 : StPAL */
5530/* 4 : ExtHiTV */
5531/* 5 : StHiTV */
5532/* 6 : Ext525i */
5533/* 7 : St525i */
5534/* 8 : Ext525p */
5535/* 9 : St525p */
5536/* A : Ext750p */
5537/* B : St750p */
5538/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005539static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005540{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305541 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005542
Peter Huewe599801f2012-02-09 21:11:45 +01005543 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305544 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005545 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305546 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005547 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305548 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005549 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305550 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005551 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305552 tempbx = 10;
5553 if (pVBInfo->TVInfo & TVSimuMode)
5554 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305556 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005557}
5558
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005559/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005560/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005561/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005562/* Output : bx 0 : NTSC */
5563/* 1 : PAL */
5564/* 2 : PALM */
5565/* 3 : PALN */
5566/* 4 : NTSC1024x768 */
5567/* 5 : PAL-M 1024x768 */
5568/* 6-7: reserved */
5569/* cl 0 : YFilter1 */
5570/* 1 : YFilter2 */
5571/* ch 0 : 301A */
5572/* 1 : 301B/302B/301LV/302LV */
5573/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005574/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005575static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5576 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005577{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005578 *tempbx = 0;
5579 *tempcl = 0;
5580 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005581
Peter Huewe599801f2012-02-09 21:11:45 +01005582 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005583 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005584
Peter Huewe599801f2012-02-09 21:11:45 +01005585 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005586 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005587
Peter Huewe599801f2012-02-09 21:11:45 +01005588 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005589 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005590
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005591 if (pVBInfo->TVInfo & NTSC1024x768) {
5592 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005593 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005594 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305595 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005596
Peter Huewe6896b942012-02-09 21:11:46 +01005597 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5598 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005599 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5600 & TVSimuMode)) {
5601 *tempbx += 8;
5602 *tempcl += 1;
5603 }
5604 }
5605
Peter Huewe6896b942012-02-09 21:11:46 +01005606 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5607 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005608 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005609}
5610
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005611static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005612{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305613 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005614
Peter Huewe6896b942012-02-09 21:11:46 +01005615 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5616 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005617 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305618 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305619 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005620 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305622 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5623 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005624 if (pVBInfo->VBInfo &
5625 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005626 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005627
Peter Huewea3d675c2012-02-09 21:11:47 +01005628 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305629 tempbl = tempbh;
5630 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305632 tempbl &= 0x0F;
5633 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005634 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305636 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5637 | SetCRT2ToTV)) { /* Channel B */
5638 tempah &= 0xF0;
5639 tempah |= tempbl;
5640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005641
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005642 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5643 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305644 tempah &= 0x0F;
5645 tempah |= tempbh;
5646 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005647 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 }
5649 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5650 tempbl = 0;
5651 tempbh = 0;
5652 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005653 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305654 tempah &= 0x0f;
5655 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005656 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305657 tempah);
5658 }
5659 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005660}
5661
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005662static void XGI_SetLCDCap_A(unsigned short tempcx,
5663 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005664{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305665 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005666
Aaro Koskinen58839b02011-03-13 12:26:23 +02005667 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305669 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005670 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005671 /* Enable Dither */
5672 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005673 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305674 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005675 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305676 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005677 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305678 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005679}
5680
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681/* --------------------------------------------------------------------- */
5682/* Function : XGI_SetLCDCap_B */
5683/* Input : cx -> LCD Capability */
5684/* Output : */
5685/* Description : */
5686/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005687static void XGI_SetLCDCap_B(unsigned short tempcx,
5688 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005689{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305690 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005691 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305692 (unsigned short) (((tempcx & 0x00ff) >> 6)
5693 | 0x0c));
5694 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005695 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305696 (unsigned short) (((tempcx & 0x00ff) >> 6)
5697 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005698}
5699
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005700static void XGI_LongWait(struct vb_device_info *pVBInfo)
5701{
5702 unsigned short i;
5703
5704 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5705
5706 if (!(i & 0xC0)) {
5707 for (i = 0; i < 0xFFFF; i++) {
5708 if (!(inb(pVBInfo->P3da) & 0x08))
5709 break;
5710 }
5711
5712 for (i = 0; i < 0xFFFF; i++) {
5713 if ((inb(pVBInfo->P3da) & 0x08))
5714 break;
5715 }
5716 }
5717}
5718
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005719static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005720{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305721 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305723 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005724
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005725 /* disable down spectrum D[4] */
5726 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305727 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005728 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305729 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005730
Aaro Koskinen8104e322011-03-13 12:26:22 +02005731 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305732 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005733 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305734 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005735 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305736 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005737 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305738 pVBInfo->LCDCapList[index].Spectrum_34);
5739 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005740 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005741}
5742
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005743static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5744{
5745 unsigned short tempcx;
5746
5747 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5748
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005749 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005750 (VB_SIS301B |
5751 VB_SIS302B |
5752 VB_SIS301LV |
5753 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005754 VB_XGI301C)) { /* 301LV/302LV only */
5755 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005756 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005757 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005758 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005759 (unsigned char) (tempcx & 0x1F));
5760 }
5761 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005762 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005763 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5764 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5765 | EnablePLLSPLOW)) >> 8));
5766 }
5767
Peter Huewe6896b942012-02-09 21:11:46 +01005768 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5769 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005770 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5771 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005772 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005773 XGI_SetLCDCap_A(tempcx, pVBInfo);
5774
Peter Huewe6896b942012-02-09 21:11:46 +01005775 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005776 if (tempcx & EnableSpectrum)
5777 SetSpectrum(pVBInfo);
5778 }
5779 } else {
5780 /* LVDS,CH7017 */
5781 XGI_SetLCDCap_A(tempcx, pVBInfo);
5782 }
5783}
5784
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005785/* --------------------------------------------------------------------- */
5786/* Function : XGI_SetAntiFlicker */
5787/* Input : */
5788/* Output : */
5789/* Description : Set TV Customized Param. */
5790/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005791static void XGI_SetAntiFlicker(unsigned short ModeNo,
5792 unsigned short ModeIdIndex,
5793 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005794{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005795 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305797 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005798
Peter Huewe599801f2012-02-09 21:11:45 +01005799 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305800 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305802 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5803 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305804 tempah = TVAntiFlickList[tempbx];
5805 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005806
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005807 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005808}
5809
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005810static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5811 unsigned short ModeIdIndex,
5812 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005813{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005814 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305816 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305818 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5819 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305820 tempah = TVEdgeList[tempbx];
5821 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005822
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005823 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005824}
5825
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005826static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005827{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305828 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305830 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305832 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305834 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5835 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005836
Aaro Koskinen8104e322011-03-13 12:26:22 +02005837 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305838 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005839 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305840 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005841 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305842 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005843 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305844 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005845}
5846
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005847static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005849{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305850 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005851
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305852 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305854 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305856 switch (tempbx) {
5857 case 0x00:
5858 case 0x04:
5859 filterPtr = NTSCYFilter1;
5860 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305862 case 0x01:
5863 filterPtr = PALYFilter1;
5864 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005865
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305866 case 0x02:
5867 case 0x05:
5868 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305869 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005870 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305871 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005872
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305873 case 0x08:
5874 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305875 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305876 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305877 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005878 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305879 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005880
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305881 default:
5882 return;
5883 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005884
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005885 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305886 if (tempcl == 0)
5887 index = tempal * 4;
5888 else
5889 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305891 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005892 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5893 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5894 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5895 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305896 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005897 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5898 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5899 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5900 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305901 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005902
Peter Huewe6896b942012-02-09 21:11:46 +01005903 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5904 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005905 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5906 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5907 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305908 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005909}
5910
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005911/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005912/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005913/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005914/* Output : */
5915/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005916/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005917static void XGI_OEM310Setting(unsigned short ModeNo,
5918 unsigned short ModeIdIndex,
5919 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005920{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005921 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005922
Peter Huewea3d675c2012-02-09 21:11:47 +01005923 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005924 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005925
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005926 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005927 XGI_SetPhaseIncr(pVBInfo);
5928 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5929 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005930
Peter Huewe6896b942012-02-09 21:11:46 +01005931 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005932 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305933 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005934}
5935
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005936/* --------------------------------------------------------------------- */
5937/* Function : XGI_SetCRT2ModeRegs */
5938/* Input : */
5939/* Output : */
5940/* Description : Origin code for crt2group */
5941/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005942static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305943 struct xgi_hw_device_info *HwDeviceExtension,
5944 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005945{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305946 unsigned short tempbl;
5947 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005948
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305949 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305951 tempah = 0;
5952 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005953 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305954 tempah &= ~0x10; /* BTRAMDAC */
5955 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305957 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5958 | SetCRT2ToLCD)) {
5959 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005960 tempcl = pVBInfo->ModeType;
5961 tempcl -= ModeVGA;
5962 if (tempcl >= 0) {
5963 /* BT Color */
5964 tempah = (0x008 >> tempcl);
5965 if (tempah == 0)
5966 tempah = 1;
5967 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305968 }
5969 if (pVBInfo->VBInfo & SetInSlaveMode)
5970 tempah ^= 0x50; /* BTDAC */
5971 }
5972 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005973
Aaro Koskinen8104e322011-03-13 12:26:22 +02005974 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305975 tempah = 0x08;
5976 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005977
Miguel Gómeze123e462012-07-06 12:40:52 +02005978 if (pVBInfo->VBInfo & DisableCRT2Display)
5979 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005980
Miguel Gómeze123e462012-07-06 12:40:52 +02005981 tempah = 0x00;
5982 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005983
Miguel Gómeze123e462012-07-06 12:40:52 +02005984 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5985 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5986 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005987
Miguel Gómeze123e462012-07-06 12:40:52 +02005988 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5989 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5990 tempbl &= 0xf7;
5991 tempah |= 0x01;
5992 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305993 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005994
Miguel Gómeze123e462012-07-06 12:40:52 +02005995 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5996 tempbl &= 0xf7;
5997 tempah |= 0x01;
5998 }
5999
6000 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
6001 goto reg_and_or;
6002
6003 tempbl &= 0xf8;
6004 tempah = 0x01;
6005
6006 if (!(pVBInfo->VBInfo & SetInSlaveMode))
6007 tempah |= 0x02;
6008
6009 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6010 tempah = tempah ^ 0x05;
6011 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
6012 tempah = tempah ^ 0x01;
6013 }
6014
6015 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6016 tempah |= 0x08;
6017
6018reg_and_or:
6019 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
6020
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306021 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006022 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306023 tempah &= (~0x08);
6024 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
6025 & SetInSlaveMode))) {
6026 tempah |= 0x010;
6027 }
6028 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006029
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306030 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306031 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006032 if (pVBInfo->VBInfo & DriverMode)
6033 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306034 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006035
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006036 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306037 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006038
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306039 if (pVBInfo->LCDInfo & SetLCDDualLink)
6040 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306042 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306043 if (pVBInfo->TVInfo & RPLLDIV2XO)
6044 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306045 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006046
Peter Huewe255aabd2012-02-09 21:11:44 +01006047 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
6048 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306049 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006050
Peter Huewe255aabd2012-02-09 21:11:44 +01006051 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306052 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Aaro Koskinen8104e322011-03-13 12:26:22 +02006054 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306055 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056
Peter Huewe6896b942012-02-09 21:11:46 +01006057 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6058 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306059 tempah = 0;
6060 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306062 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6063 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01006064 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306065 tempah |= 0x04; /* shampoo 0129 */
6066 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006067
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006068 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306069 tempah = 0x00;
6070 tempbl = 0xcf;
6071 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6072 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6073 tempah |= 0x30;
6074 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006075
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006076 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306077 tempah = 0;
6078 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306080 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6081 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6082 tempah |= 0xc0;
6083 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006084 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306085 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306087 tempah = 0;
6088 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01006089 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306090 tempbl = 0xff;
6091 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6092 tempah |= 0x80;
6093 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006094
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006095 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006096
Peter Huewe6896b942012-02-09 21:11:46 +01006097 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306098 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006099 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6100 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306101 }
6102 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006103}
6104
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306106void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6107 struct vb_device_info *pVBInfo)
6108{
6109
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006110 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006111
6112}
6113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306114void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6115 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006116{
6117
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006118 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006119
6120}
6121
Bill Pemberton80adad82010-06-17 13:10:51 -04006122unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006123{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306124 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306126 if (pVBInfo->IF_DEF_LVDS == 1) {
6127 return 1;
6128 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006129 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306130 if ((flag == 1) || (flag == 2))
6131 return 1; /* 301b */
6132 else
6133 return 0;
6134 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006135}
6136
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006137unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6138 unsigned short ModeNo, unsigned short ModeIdIndex,
6139 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006140{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006141 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6142 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6143 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006144
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006145 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006146
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006147 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006148
Aaro Koskinen58839b02011-03-13 12:26:23 +02006149 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006150 index = index >> pVBInfo->SelectCRT2Rate;
6151 index &= 0x0F;
6152
6153 if (pVBInfo->LCDInfo & LCDNonExpanding)
6154 index = 0;
6155
6156 if (index > 0)
6157 index--;
6158
6159 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006160 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006161 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006162 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6163 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006164 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006165 /* 301b */
6166 temp = LCDARefreshIndex[
6167 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006168 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006169 temp = LCDRefreshIndex[
6170 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006171
6172 if (index > temp)
6173 index = temp;
6174 } else {
6175 index = 0;
6176 }
6177 }
6178 }
6179
6180 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6181 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6182 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006183 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6184 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006185 index++;
6186 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006187 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006188 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6189 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006190 index++;
6191 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006192 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6193 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006194 index++;
6195 }
6196 }
6197
6198 i = 0;
6199 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006200 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6201 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006202 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006203 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6204 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006205 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006206 if (temp < pVBInfo->ModeType)
6207 break;
6208 i++;
6209 index--;
6210
6211 } while (index != 0xFFFF);
6212 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6213 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006214 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6215 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006216 if (temp & InterlaceMode)
6217 i++;
6218 }
6219 }
6220 i--;
6221 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
6222 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
6223 RefreshRateTableIndex, &i, pVBInfo);
6224 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02006225 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006226}
6227
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006228static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306229 struct xgi_hw_device_info *HwDeviceExtension,
6230 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006231{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006232 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006233
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006234 pVBInfo->SetFlag |= ProgrammingCRT2;
6235 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6236 ModeIdIndex, pVBInfo);
6237 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6238 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6239 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6240 HwDeviceExtension, pVBInfo);
6241 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6242 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006243}
6244
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006245static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006246 struct xgi_hw_device_info *HwDeviceExtension,
6247 struct vb_device_info *pVBInfo)
6248{
6249 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6250
6251 tempbx = pVBInfo->VBInfo;
6252 pVBInfo->SetFlag |= ProgrammingCRT2;
6253 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6254 pVBInfo->SelectCRT2Rate = 4;
6255 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6256 ModeIdIndex, pVBInfo);
6257 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6258 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6259 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6260 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6261 RefreshRateTableIndex, pVBInfo);
6262 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6263 RefreshRateTableIndex, pVBInfo);
6264 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6265 RefreshRateTableIndex, pVBInfo);
6266 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6267 HwDeviceExtension, pVBInfo);
6268 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6269 RefreshRateTableIndex, pVBInfo);
6270 XGI_SetTap4Regs(pVBInfo);
6271 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6272 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6273 HwDeviceExtension, pVBInfo);
6274 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6275 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6276 XGI_AutoThreshold(pVBInfo);
6277 return 1;
6278}
6279
6280void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6281{
6282 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6283 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6284 0x05, 0x00 };
6285
6286 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6287
6288 unsigned char CR17, CR63, SR31;
6289 unsigned short temp;
6290 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6291
6292 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006293 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006294
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006295 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006296 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006297 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006298 pVBInfo->P3d4, 0x53) | 0x02));
6299
Aaro Koskinen58839b02011-03-13 12:26:23 +02006300 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6301 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6302 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006303
Aaro Koskinen8104e322011-03-13 12:26:22 +02006304 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6305 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006306
Aaro Koskinen58839b02011-03-13 12:26:23 +02006307 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006308 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006309
Aaro Koskinen58839b02011-03-13 12:26:23 +02006310 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006311 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006312
Aaro Koskinen58839b02011-03-13 12:26:23 +02006313 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006314 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006315 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006316 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006317
Aaro Koskinen8104e322011-03-13 12:26:22 +02006318 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006319
6320 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006321 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006322
6323 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006324 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006325 CRTCData[i]);
6326
6327 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006328 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006329 CRTCData[i]);
6330
6331 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006332 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006333 CRTCData[i]);
6334
Aaro Koskinen8104e322011-03-13 12:26:22 +02006335 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006336 & 0xE0));
6337
Aaro Koskinen8104e322011-03-13 12:26:22 +02006338 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6339 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6340 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006341
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006342 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006343
6344 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006345 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6346 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6347 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006348 }
6349
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006350 mdelay(1);
6351
6352 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006353 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006354
6355 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006356 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006357 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006358 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006359
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006360 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006361 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006362
6363 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006364 outb(0, (pVBInfo->P3c8 + 1));
6365 outb(0, (pVBInfo->P3c8 + 1));
6366 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006367 }
6368
Aaro Koskinen8104e322011-03-13 12:26:22 +02006369 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6370 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6371 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006372
Aaro Koskinen58839b02011-03-13 12:26:23 +02006373 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006374 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006375 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006376}
6377
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006378static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6379 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006380 struct vb_device_info *pVBInfo)
6381{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006382 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006383
Peter Huewe6896b942012-02-09 21:11:46 +01006384 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6385 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006386 if (!(pVBInfo->SetFlag & DisableChA)) {
6387 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006388 /* Power on */
6389 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006390 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006391 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6392 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006393 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006394 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006395 }
6396 }
6397 }
6398
6399 if (!(pVBInfo->SetFlag & DisableChB)) {
6400 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6401 & (SetCRT2ToLCD | SetCRT2ToTV
6402 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006403 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006404 pVBInfo->P3c4, 0x32);
6405 tempah &= 0xDF;
6406 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006407 if (!(pVBInfo->VBInfo &
6408 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006409 tempah |= 0x20;
6410 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006411 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006412 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006413
Aaro Koskinen58839b02011-03-13 12:26:23 +02006414 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006415 pVBInfo->Part1Port, 0x2E);
6416
6417 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006418 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006419 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006420 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006421 }
6422 }
6423
6424 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6425 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006426 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006427 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006428 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006429 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006430 if (XGI_EnableChISLCD(pVBInfo) ||
6431 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006432 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006433 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006434 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006435 pVBInfo->Part4Port,
6436 0x2A,
6437 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006438 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006439 /* LVDS Driver power on */
6440 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006441 }
6442 }
6443
6444 tempah = 0x00;
6445
6446 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6447 tempah = 0xc0;
6448
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006449 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6450 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6451 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6452 tempah = tempah & 0x40;
6453 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6454 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006455
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006456 if (pVBInfo->SetFlag & DisableChB)
6457 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006458
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006459 if (pVBInfo->SetFlag & DisableChA)
6460 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006461
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006462 if (pVBInfo->SetFlag & EnableChB)
6463 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006464
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006465 if (pVBInfo->SetFlag & EnableChA)
6466 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006467 }
6468 }
6469
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006470 /* EnablePart4_1F */
6471 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006472
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006473 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006474 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006475 XGI_DisableGatingCRT(HwDeviceExtension,
6476 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006477 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6478 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006479 }
6480 }
6481 } /* 301 */
6482 else { /* LVDS */
6483 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006484 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006485 /* enable CRT2 */
6486 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006487
Aaro Koskinen58839b02011-03-13 12:26:23 +02006488 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006489 0x2E);
6490 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006491 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006492
Aaro Koskinendc505562011-03-13 12:26:26 +02006493 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006494 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006495 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006496}
6497
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006498static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6499 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006500 unsigned short ModeNo, unsigned short ModeIdIndex,
6501 struct vb_device_info *pVBInfo)
6502{
Aaro Koskinena1579612012-04-07 01:14:05 +03006503 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006504
Aaro Koskinena1579612012-04-07 01:14:05 +03006505 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006506 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006507 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6508 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6509 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006510 XGI_ClearExt1Regs(pVBInfo);
6511
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006512 if (HwDeviceExtension->jChipType == XG27) {
6513 if (pVBInfo->IF_DEF_LVDS == 0)
6514 XGI_SetDefaultVCLK(pVBInfo);
6515 }
6516
6517 temp = ~ProgrammingCRT2;
6518 pVBInfo->SetFlag &= temp;
6519 pVBInfo->SelectCRT2Rate = 0;
6520
Peter Huewe6896b942012-02-09 21:11:46 +01006521 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6522 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006523 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006524 | SetInSlaveMode)) {
6525 pVBInfo->SetFlag |= ProgrammingCRT2;
6526 }
6527 }
6528
6529 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6530 ModeIdIndex, pVBInfo);
6531 if (RefreshRateTableIndex != 0xFFFF) {
6532 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6533 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6534 pVBInfo, HwDeviceExtension);
6535 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6536 RefreshRateTableIndex, pVBInfo);
6537 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6538 HwDeviceExtension, pVBInfo);
6539 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6540 RefreshRateTableIndex, pVBInfo);
6541 }
6542
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006543 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006544 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006545 if (temp & 0xA0) {
6546
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006547 if (HwDeviceExtension->jChipType == XG27)
6548 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6549 RefreshRateTableIndex, pVBInfo);
6550 else
6551 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6552 RefreshRateTableIndex, pVBInfo);
6553
6554 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6555 RefreshRateTableIndex);
6556
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006557 xgifb_set_lcd(HwDeviceExtension->jChipType,
6558 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006559
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006560 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006561 xgifb_set_lvds(xgifb_info,
6562 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006563 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006564 }
6565 }
6566
6567 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6568 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6569 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6570 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006571 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006572}
6573
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006574unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6575 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006576 unsigned short ModeNo)
6577{
6578 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006579 struct vb_device_info VBINF;
6580 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006581 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006582 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006583 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006584
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006585 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006586 pVBInfo->IF_DEF_YPbPr = 0;
6587 pVBInfo->IF_DEF_HiVision = 0;
6588 pVBInfo->IF_DEF_CRT2Monitor = 0;
6589 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006590 } else {
6591 pVBInfo->IF_DEF_YPbPr = 1;
6592 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006593 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006594 }
6595
6596 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6597 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6598 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6599 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6600 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6601 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6602 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6603 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6604 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6605 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6606 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6607 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6608 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006609 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6610 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6611 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6612 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6613 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006614
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006615 /* for x86 Linux, XG21 LVDS */
6616 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006617 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006618 pVBInfo->IF_DEF_LVDS = 1;
6619 }
6620 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006621 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6622 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006623 pVBInfo->IF_DEF_LVDS = 1;
6624 }
6625 }
6626
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006627 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006628 XGI_GetVBType(pVBInfo);
6629
6630 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006631 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006632 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006633 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006634
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006635 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006636 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6637
6638 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6639
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006640 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006641 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6642 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6643 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006644 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006645
Peter Huewea3d675c2012-02-09 21:11:47 +01006646 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006647 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006648 ModeIdIndex, pVBInfo);
6649
Peter Huewea3d675c2012-02-09 21:11:47 +01006650 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006651 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6652 HwDeviceExtension, pVBInfo);
6653 }
6654 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01006655 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006656 XGI_SetCRT1Group(xgifb_info,
6657 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006658 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006659 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006660 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6661 HwDeviceExtension,
6662 pVBInfo);
6663 }
6664 }
6665 }
6666
Peter Huewe6896b942012-02-09 21:11:46 +01006667 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006668 switch (HwDeviceExtension->ujVBChipID) {
6669 case VB_CHIP_301:
6670 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6671 pVBInfo); /*add for CRT2 */
6672 break;
6673
6674 case VB_CHIP_302:
6675 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6676 pVBInfo); /*add for CRT2 */
6677 break;
6678
6679 default:
6680 break;
6681 }
6682 }
6683
6684 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6685 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006686 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006687 } /* !XG20 */
6688 else {
6689 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006690 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006691 ModeIdIndex,
6692 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006693 return 0;
6694
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006695 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006696 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006697
6698 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006699 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006700
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006701 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006702
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006703 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6704 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006705
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006706 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006707 }
6708
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006709 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6710
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006711 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006712 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006713
6714 return 1;
6715}