blob: 3cba143f3ca12c636c8f1e7fc18caa14ca8b05aa [file] [log] [blame]
Aaro Koskinend80aaa02011-02-17 23:29:14 +02001#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_util.h"
6#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02007#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020010#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
Aaro Koskinen624554d2011-10-11 21:47:35 +030012static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040013 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020023
Bill Pemberton80adad82010-06-17 13:10:51 -040024void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020025{
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030026 pVBInfo->StandTable = (struct SiS_StandTable_S *) &XGI330_StandTable;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053027 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
28 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
29 pVBInfo->XGINEWUB_CRT1Table
30 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031
Peter Huewefc39dcb2012-01-15 19:22:12 +010032 pVBInfo->MCLKData = (struct SiS_MCLKData *) XGI340New_MCLKData;
Aaro Koskinen06587332011-03-13 12:26:10 +020033 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Peter Huewefc39dcb2012-01-15 19:22:12 +010034 pVBInfo->VCLKData = (struct SiS_VCLKData *) XGI_VCLKData;
35 pVBInfo->VBVCLKData = (struct SiS_VBVCLKData *) XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053036 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Peter Huewefc39dcb2012-01-15 19:22:12 +010037 pVBInfo->StResInfo = (struct SiS_StResInfo_S *) XGI330_StResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053038 pVBInfo->ModeResInfo
Peter Huewefc39dcb2012-01-15 19:22:12 +010039 = (struct SiS_ModeResInfo_S *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053041 pVBInfo->LCDResInfo = 0;
42 pVBInfo->LCDTypeInfo = 0;
43 pVBInfo->LCDInfo = 0;
44 pVBInfo->VBInfo = 0;
45 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 pVBInfo->SR15 = XGI340_SR13;
48 pVBInfo->CR40 = XGI340_cr41;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053049 pVBInfo->CR6B = XGI340_CR6B;
50 pVBInfo->CR6E = XGI340_CR6E;
51 pVBInfo->CR6F = XGI340_CR6F;
52 pVBInfo->CR89 = XGI340_CR89;
53 pVBInfo->AGPReg = XGI340_AGPReg;
54 pVBInfo->SR16 = XGI340_SR16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020055
Peter Huewe6d12dae2012-06-14 00:21:52 +020056 pVBInfo->SR21 = 0xa3;
57 pVBInfo->SR22 = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053059 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
60 pVBInfo->PALTiming = XGI330_PALTiming;
61 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
62 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
63 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
64 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
65 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
66 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
67 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
68 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
69 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
70 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
71 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
72 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053074 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
75 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
76 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053078 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010079 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053080 pVBInfo->LCDCapList = XGI_LCDDLCapList;
81 else
82 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053084 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020085 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053087 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040088 unsigned char temp;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053089 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +010090 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053091 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020092 pVBInfo->XGINew_CR97 = 0xc1;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040093 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040095 /*Z11m DDR*/
96 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
97 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
98 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020099 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
102}
103
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800104static void XGI_SetSeqRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800105 unsigned short ModeIdIndex,
106 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200107{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530108 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200110
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300111 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200112
Aaro Koskinen8104e322011-03-13 12:26:22 +0200113 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300114 tempah = pVBInfo->StandTable->SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200115
Peter Huewea3d675c2012-02-09 21:11:47 +0100116 i = XGI_SetCRT2ToLCDA;
117 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530118 tempah |= 0x01;
119 } else {
120 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
121 if (pVBInfo->VBInfo & SetInSlaveMode)
122 tempah |= 0x01;
123 }
124 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200127 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530129 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800130 /* Get SR2,3,4 from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300131 SRdata = pVBInfo->StandTable->SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200132 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200134}
135
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200136static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800137 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200138{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530139 unsigned char CRTCdata;
140 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200141
Aaro Koskinen58839b02011-03-13 12:26:23 +0200142 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530143 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200144 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530146 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800147 /* Get CRTC from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300148 CRTCdata = pVBInfo->StandTable->CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200149 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200151}
152
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800153static void XGI_SetATTRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800154 unsigned short ModeIdIndex,
155 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200156{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530157 unsigned char ARdata;
158 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200159
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300160 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530162 for (i = 0; i <= 0x13; i++) {
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300163 ARdata = pVBInfo->StandTable->ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200164
165 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
166 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
167 ARdata = 0;
168 } else {
169 if ((pVBInfo->VBInfo &
170 (SetCRT2ToTV | SetCRT2ToLCD)) &&
171 (pVBInfo->VBInfo & SetInSlaveMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530172 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 }
174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200176 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200177 outb(i, pVBInfo->P3c0); /* set index */
178 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200181 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200182 outb(0x14, pVBInfo->P3c0); /* set index */
183 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200184 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200185 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186}
187
Aaro Koskinena1579612012-04-07 01:14:05 +0300188static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200189{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530190 unsigned char GRdata;
191 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530193 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800194 /* Get GR from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300195 GRdata = pVBInfo->StandTable->GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200196 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530197 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530199 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200200 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530201 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200202 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530203 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200204}
205
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200206static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530210 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200211 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212}
213
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200214static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200215{
216
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200217 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200218 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
219 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200221 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200222 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
223 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200224
Aaro Koskinendc505562011-03-13 12:26:26 +0200225 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530226 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227}
228
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200229static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530230 unsigned short ModeIdIndex,
231 unsigned short RefreshRateTableIndex, unsigned short *i,
232 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200233{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530234 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300236 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530237 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
238 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
239 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530241 if (pVBInfo->IF_DEF_LVDS == 0) {
242 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
243 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530245 if (pVBInfo->VBType & VB_XGI301C)
246 tempax |= SupportCRT2in301C;
247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800249 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100250 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530251 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200252
Miguel Gómez3b175622012-07-06 12:40:46 +0200253 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
254 pVBInfo->LCDResInfo != Panel_1280x960 &&
255 (pVBInfo->LCDInfo & LCDNonExpanding) &&
256 resinfo >= 9)
257 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530258 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200259
Peter Huewe599801f2012-02-09 21:11:45 +0100260 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300261 tempax |= SupportHiVision;
262 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
263 ((resinfo == 4) ||
264 (resinfo == 3 &&
265 (pVBInfo->SetFlag & TVSimuMode)) ||
266 (resinfo > 7)))
Miguel Gómez3b175622012-07-06 12:40:46 +0200267 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530268 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800269 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
270 SetCRT2ToSVIDEO |
271 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100272 SetCRT2ToYPbPr525750 |
273 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530274 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200275
Miguel Gómez3b175622012-07-06 12:40:46 +0200276 if (pVBInfo->VBType & (VB_SIS301B |
277 VB_SIS302B |
278 VB_SIS301LV |
279 VB_SIS302LV |
280 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530281 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200282
Miguel Gómez3b175622012-07-06 12:40:46 +0200283 if (!(pVBInfo->VBInfo & TVSetPAL) &&
284 (modeflag & NoSupportSimuTV) &&
285 (pVBInfo->VBInfo & SetInSlaveMode) &&
286 (!(pVBInfo->VBInfo & SetNotSimuMode)))
287 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530288 }
289 }
290 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530291 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
292 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530294 if (resinfo > 0x08)
295 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200296
Peter Huewe255aabd2012-02-09 21:11:44 +0100297 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530298 if (resinfo > 0x07)
299 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 if (resinfo == 0x04)
302 return 0; /* 512x384 */
303 }
304 }
305 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200306
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800307 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
308 tempbx; (*i)--) {
309 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
310 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530311 if (infoflag & tempax)
312 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 if ((*i) == 0)
315 break;
316 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530318 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800319 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
320 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
322 != tempbx) {
323 return 0;
324 }
325
326 if (infoflag & tempax)
327 return 1;
328 }
329 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200330}
331
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200332static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530333 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200334{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530335 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200336
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800337 /* di+0x00 */
338 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530339 sync &= 0xC0;
340 temp = 0x2F;
341 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200342 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200343}
344
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200345static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530346 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200347{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530348 unsigned char data, data1, pushax;
349 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200350
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800351 /* unlock cr0-7 */
352 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200354 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200357 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200358
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530359 for (i = 0x01; i <= 0x04; i++) {
360 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200361 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530362 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530364 for (i = 0x05; i <= 0x06; i++) {
365 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200366 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530367 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Aaro Koskinen58839b02011-03-13 12:26:23 +0200369 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530370 j &= 0x1F;
371 data = pVBInfo->TimingH[0].data[7];
372 data &= 0xE0;
373 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200374 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530376 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200377 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530378 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200379 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200380 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530381 data1 = data;
382 data1 &= 0xE0;
383 data &= 0x1F;
384 if (data == 0) {
385 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200386 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530387 0x0c);
388 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200389 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 data = pushax;
391 }
392 data = data - 1;
393 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200394 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200395 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530396 data = data >> 5;
397 data = data + 3;
398 if (data > 7)
399 data = data - 7;
400 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200401 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200403}
404
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800405static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
406 unsigned short ModeNo,
407 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200408{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530409 unsigned char data;
410 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 for (i = 0x00; i <= 0x01; i++) {
413 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200414 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530415 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530417 for (i = 0x02; i <= 0x03; i++) {
418 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200419 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530420 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 for (i = 0x04; i <= 0x05; i++) {
423 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Aaro Koskinen58839b02011-03-13 12:26:23 +0200427 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530428 j &= 0xC0;
429 data = pVBInfo->TimingV[0].data[6];
430 data &= 0x3F;
431 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200432 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530434 data = pVBInfo->TimingV[0].data[6];
435 data &= 0x80;
436 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200437
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300438 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530439 i &= DoubleScanMode;
440 if (i)
441 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200442
Aaro Koskinen58839b02011-03-13 12:26:23 +0200443 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530444 j &= 0x5F;
445 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200446 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200447}
448
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200449static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
450 unsigned short RefreshRateTableIndex,
451 struct vb_device_info *pVBInfo,
452 struct xgi_hw_device_info *HwDeviceExtension)
453{
454 unsigned char index, data;
455 unsigned short i;
456
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800457 /* Get index */
458 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200459 index = index & IndexMask;
460
Aaro Koskinen58839b02011-03-13 12:26:23 +0200461 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200462 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200463 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200464
465 for (i = 0; i < 8; i++)
466 pVBInfo->TimingH[0].data[i]
467 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
468
469 for (i = 0; i < 7; i++)
470 pVBInfo->TimingV[0].data[i]
471 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
472
473 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
474
475 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
476
477 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200478 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200479}
480
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200481/* --------------------------------------------------------------------- */
482/* Function : XGI_SetXG21CRTC */
483/* Input : Stand or enhance CRTC table */
484/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
485/* Description : Set LCD timing */
486/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200487static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530488 unsigned short RefreshRateTableIndex,
489 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200490{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300491 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530492 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200493
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300494 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
495 /* Tempax: CR4 HRS */
496 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
497 Tempcx = Tempax; /* Tempcx: HRS */
498 /* SR2E[7:0]->HRS */
499 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300501 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
502 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
503 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
504 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
505 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800506
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300507 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
508 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200509
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300510 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
511 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
512 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
513 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200514
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300515 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
516 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300518 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
519 if (Tempax < Tempcx) /* HRE < HRS */
520 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200521
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300522 Temp2 &= 0xFF;
523 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
524 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
525 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
526 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
527 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
528 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
529 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200530
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300531 /* CR10 VRS */
532 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
533 Tempbx = Tempax; /* Tempbx: VRS */
534 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
535 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
536 /* CR7[2][7] VRE */
537 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
538 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
539 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
540 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
541 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
542 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200543
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300544 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
545 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
546 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
547 Tempax &= 0x80;
548 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
549 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
550 /* Tempax: SRA */
551 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
552 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
553 Temp2 = Tempax;
554 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
555 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200556
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300557 /* Tempax: CR11 VRE */
558 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
559 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
560 /* Tempbx: SRA */
561 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
562 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
563 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
564 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
565 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
566 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200567
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300568 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
569 if (Tempax < Temp3) /* VRE < VRS */
570 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200571
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300572 Temp2 &= 0xFF;
573 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
574 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
575 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
576 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
577 Tempbx = (unsigned char) Temp1;
578 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
579 Tempax &= 0x7F;
580 /* SR3F D[7:2]->VRE D[1:0]->VRS */
581 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200582}
583
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800584static void XGI_SetXG27CRTC(unsigned short ModeNo,
585 unsigned short ModeIdIndex,
586 unsigned short RefreshRateTableIndex,
587 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200588{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300589 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200590
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300591 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
592 /* Tempax: CR4 HRS */
593 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
594 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
595 /* SR2E[7:0]->HRS */
596 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200597
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300598 /* SR0B */
599 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
600 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
601 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200602
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300603 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
604 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
605 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300607 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
608 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
609 Tempax <<= 3; /* Tempax[5]: HRE[5] */
610 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200611
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300612 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
613 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200614
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300615 /* Tempax: CR4 HRS */
616 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
617 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
618 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
619 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200620
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300621 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
622 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
623 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
624 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
625 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
626 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
627 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200628
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300629 /* CR10 VRS */
630 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
631 /* SR34[7:0]->VRS[7:0] */
632 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200633
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300634 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
635 /* CR7[7][2] VRS[9][8] */
636 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
637 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
638 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
639 Tempax >>= 2; /* Tempax[0]: VRS[8] */
640 /* SR35[0]: VRS[8] */
641 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
642 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
643 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
644 /* Tempax: SR0A */
645 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
646 Tempax &= 0x08; /* SR0A[3] VRS[10] */
647 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200648
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300649 /* Tempax: CR11 VRE */
650 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
651 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
652 /* Tempbx: SR0A */
653 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
654 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
655 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
656 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
657 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
658 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
659 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200660
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300661 if (Tempbx <= Tempcx) /* VRE <= VRS */
662 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200663
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300664 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
665 Tempax = (Tempbx << 2) & 0xFF;
666 /* SR3F[7:2]:VRE[5:0] */
667 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
668 Tempax = Tempcx >> 8;
669 /* SR35[2:0]:VRS[10:8] */
670 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200671}
672
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200673static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
674{
675 unsigned char temp;
676
677 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
678 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
679 temp = (temp & 3) << 6;
680 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
681 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
682 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
683 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
684
685}
686
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300687static void xgifb_set_lcd(int chip_id,
688 struct vb_device_info *pVBInfo,
689 unsigned short RefreshRateTableIndex,
690 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200691{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300692 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400693 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530695 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200696
Aaro Koskinen8104e322011-03-13 12:26:22 +0200697 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
698 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
699 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
700 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300701
702 if (chip_id == XG27) {
703 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
704 if ((Temp & 0x03) == 0) { /* dual 12 */
705 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
706 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
707 }
708 }
709
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300710 if (chip_id == XG27) {
711 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530712 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300713 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
714 if (Temp & 0x01) {
715 /* 18 bits FP */
716 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
717 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
718 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530719 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200721 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722
Aaro Koskinendc505562011-03-13 12:26:26 +0200723 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
724 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200725
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300726 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
727 if (Data & 0x4000)
728 /* Hsync polarity */
729 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
730 if (Data & 0x8000)
731 /* Vsync polarity */
732 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200733}
734
735/* --------------------------------------------------------------------- */
736/* Function : XGI_UpdateXG21CRTC */
737/* Input : */
738/* Output : CRT1 CRTC */
739/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
740/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800741static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
742 struct vb_device_info *pVBInfo,
743 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200744{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300745 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200746
Aaro Koskinendc505562011-03-13 12:26:26 +0200747 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300748 if (ModeNo == 0x2E &&
749 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
750 RES640x480x60))
751 index = 12;
752 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800753 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300754 index = 13;
755 else if (ModeNo == 0x2F)
756 index = 14;
757 else if (ModeNo == 0x50)
758 index = 15;
759 else if (ModeNo == 0x59)
760 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530762 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200763 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530764 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200765 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530766 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200767 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530768 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200769 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530770 pVBInfo->UpdateCRT1[index].CR16);
771 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200772}
773
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200774static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530775 unsigned short ModeNo, unsigned short ModeIdIndex,
776 unsigned short RefreshRateTableIndex,
777 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200778{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400779 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530781 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300783 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200784
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300785 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
786 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
787 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530789 if (modeflag & HalfDCLK)
790 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200791
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300792 if (modeflag & HalfDCLK)
793 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300795 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300797 if (temp & InterlaceMode)
798 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200799
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300800 if (modeflag & DoubleScanMode)
801 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200802
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530803 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530805 tempax /= tempcx;
806 tempax -= 1;
807 tempbx -= 1;
808 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200809 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
810 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530811 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200812 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
813 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200814 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530815 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200816 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530817 tempax = 0;
818 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530820 if (tempbx & 0x01)
821 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530823 if (tempbx & 0x02)
824 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200825
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200826 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200827 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530828 data &= 0xFF;
829 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530831 if (tempbx & 0x04)
832 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200833
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200834 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200835 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200836}
837
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800838static void XGI_SetCRT1Offset(unsigned short ModeNo,
839 unsigned short ModeIdIndex,
840 unsigned short RefreshRateTableIndex,
841 struct xgi_hw_device_info *HwDeviceExtension,
842 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200843{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530844 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530846 /* GetOffset */
847 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
848 temp = temp >> 8;
849 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530851 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
852 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 if (temp2)
855 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530857 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200858
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530859 switch (temp2) {
860 case 0:
861 temp2 = 1;
862 break;
863 case 1:
864 temp2 = 2;
865 break;
866 case 2:
867 temp2 = 4;
868 break;
869 case 3:
870 temp2 = 4;
871 break;
872 case 4:
873 temp2 = 6;
874 break;
875 case 5:
876 temp2 = 8;
877 break;
878 default:
879 break;
880 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530882 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
883 temp = temp * temp2 + temp2 / 2;
884 else
885 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530887 /* SetOffset */
888 DisplayUnit = temp;
889 temp2 = temp;
890 temp = temp >> 8; /* ah */
891 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200892 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530893 i &= 0xF0;
894 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200895 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530897 temp = (unsigned char) temp2;
898 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200899 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 /* SetDisplayUnit */
902 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
903 temp2 &= InterlaceMode;
904 if (temp2)
905 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 DisplayUnit = DisplayUnit << 5;
908 ah = (DisplayUnit & 0xff00) >> 8;
909 al = DisplayUnit & 0x00ff;
910 if (al == 0)
911 ah += 1;
912 else
913 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200914
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530915 if (HwDeviceExtension->jChipType >= XG20)
916 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
917 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200918
Aaro Koskinen8104e322011-03-13 12:26:22 +0200919 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200920}
921
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200922static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
923 unsigned short ModeIdIndex,
924 unsigned short RefreshRateTableIndex,
925 struct xgi_hw_device_info *HwDeviceExtension,
926 struct vb_device_info *pVBInfo)
927{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200928 unsigned short CRT2Index, VCLKIndex;
929 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200930
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300931 /* si+Ext_ResInfo */
932 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
933 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
934 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200935
936 if (pVBInfo->IF_DEF_LVDS == 0) {
937 CRT2Index = CRT2Index >> 6; /* for LCD */
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200938 if (pVBInfo->VBInfo &
939 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100940 if (pVBInfo->LCDResInfo != Panel_1024x768)
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200941 /* LCDXlat2VCLK */
942 VCLKIndex = VCLK108_2_315 + 5;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200943 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200944 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100945 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200946 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200947 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200948 else
Peter Huewe95072592012-06-14 00:21:48 +0200949 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200950
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200951 if (pVBInfo->SetFlag & TVSimuMode) {
952 if (modeflag & Charx8Dot) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200953 VCLKIndex = TVCLKBASE_315_25 +
954 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200955 } else {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200956 VCLKIndex = TVCLKBASE_315_25 +
957 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200958 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200959 }
960
961 /* 301lv */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300962 if (pVBInfo->VBType & VB_SIS301LV) {
963 if (pVBInfo->SetFlag & RPLLDIV2XO)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200964 VCLKIndex = YPbPr525iVCLK_2;
965 else
966 VCLKIndex = YPbPr525iVCLK;
967 }
968 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200969 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200970 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200971 else
Peter Huewe95072592012-06-14 00:21:48 +0200972 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200973 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300974 /* di+Ext_CRTVCLK */
975 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800976 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300977 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200978 }
979 } else { /* LVDS */
Peter Huewe255aabd2012-02-09 21:11:44 +0100980 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
981 (pVBInfo->LCDResInfo == Panel_320x480))
Peter Huewef477d3e2012-06-14 00:21:47 +0200982 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +0300983 else
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200984 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK,
985 LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200986 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200987
988 return VCLKIndex;
989}
990
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800991static void XGI_SetCRT1VCLK(unsigned short ModeNo,
992 unsigned short ModeIdIndex,
993 struct xgi_hw_device_info *HwDeviceExtension,
994 unsigned short RefreshRateTableIndex,
995 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200996{
Bill Pemberton108afbf2010-06-17 13:10:47 -0400997 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301000 if (pVBInfo->IF_DEF_LVDS == 1) {
1001 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001002 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001003 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1004 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301005 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001006 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301007 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001008 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001009 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1010 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001011 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301012 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1013 RefreshRateTableIndex, HwDeviceExtension,
1014 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001015 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001016 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301017 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301019 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001020 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1021 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301022 } else {
1023 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001024 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001025 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1026 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301027 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001028 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301029 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001030 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301031 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001032
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301033 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001034 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1035 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001036 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001037 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001038 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 index = data;
1040 index &= 0xE0;
1041 data &= 0x1F;
1042 data = data << 1;
1043 data += 1;
1044 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001045 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301046 }
1047 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001048}
1049
Aaro Koskinene85f2032011-11-27 23:03:07 +02001050static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1051{
1052 unsigned char temp;
1053
1054 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1055 temp = (temp & 1) << 6;
1056 /* SR06[6] 18bit Dither */
1057 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1058 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1059 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1060
1061}
1062
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001063static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301064 struct xgi_hw_device_info *HwDeviceExtension,
1065 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001066{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301067 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001068
Aaro Koskinen58839b02011-03-13 12:26:23 +02001069 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301070 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001071 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001072
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001073 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1074 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1075 data &= 0xC0;
1076 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1077 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1078 data |= 0x01;
1079 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001080
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301081 if (HwDeviceExtension->jChipType == XG21)
1082 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001083}
1084
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001085static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1086 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1087 struct vb_device_info *pVBInfo)
1088{
1089 unsigned short data, data2 = 0;
1090 short VCLK;
1091
1092 unsigned char index;
1093
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001094 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1095 index &= IndexMask;
1096 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001097
Aaro Koskinen58839b02011-03-13 12:26:23 +02001098 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001099 data &= 0xf3;
1100 if (VCLK >= 200)
1101 data |= 0x0c; /* VCLK > 200 */
1102
1103 if (HwDeviceExtension->jChipType >= XG20)
1104 data &= ~0x04; /* 2 pixel mode */
1105
Aaro Koskinen8104e322011-03-13 12:26:22 +02001106 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001107
1108 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001109 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001110 data &= 0xE7;
1111 if (VCLK < 200)
1112 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001113 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001114 }
1115
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001116 data2 = 0x00;
1117
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001118 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001119 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001120 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001121
1122}
1123
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001124static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301125 unsigned short ModeNo, unsigned short ModeIdIndex,
1126 unsigned short RefreshRateTableIndex,
1127 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301129 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1130 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001131
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001132 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1133 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001134
Aaro Koskinen58839b02011-03-13 12:26:23 +02001135 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001136 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001137
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001138 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001140 data2 |= 0x02;
1141 data3 = pVBInfo->ModeType - ModeVGA;
1142 data3 = data3 << 2;
1143 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301144 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301146 if (data)
1147 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001148
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001149 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001150 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001151 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301153 data = 0x0000;
1154 if (infoflag & InterlaceMode) {
1155 if (xres == 1024)
1156 data = 0x0035;
1157 else if (xres == 1280)
1158 data = 0x0048;
1159 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001162 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301163 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001164 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301166 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001167 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301169 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 if (modeflag & LineCompareOff)
1172 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001173
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001174 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301175 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001176 data = data ^ 0x60;
1177 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001178 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301180 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1181 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
Aaro Koskinen58839b02011-03-13 12:26:23 +02001183 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301185 if (HwDeviceExtension->jChipType == XG27) {
1186 if (data & 0x40)
1187 data = 0x2c;
1188 else
1189 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001190 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001191 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301192 } else if (HwDeviceExtension->jChipType >= XG20) {
1193 if (data & 0x40)
1194 data = 0x33;
1195 else
1196 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001197 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1198 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301199 } else {
1200 if (data & 0x40)
1201 data = 0x2c;
1202 else
1203 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001204 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301205 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001206
1207}
1208
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001209static void XGI_WriteDAC(unsigned short dl,
1210 unsigned short ah,
1211 unsigned short al,
1212 unsigned short dh,
1213 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001214{
1215 unsigned short temp, bh, bl;
1216
1217 bh = ah;
1218 bl = al;
1219
1220 if (dl != 0) {
1221 temp = bh;
1222 bh = dh;
1223 dh = temp;
1224 if (dl == 1) {
1225 temp = bl;
1226 bl = dh;
1227 dh = temp;
1228 } else {
1229 temp = bl;
1230 bl = bh;
1231 bh = temp;
1232 }
1233 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001234 outb((unsigned short) dh, pVBInfo->P3c9);
1235 outb((unsigned short) bh, pVBInfo->P3c9);
1236 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001237}
1238
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001239static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301240 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001241{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001242 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1243 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001244
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001245 outb(0xFF, pVBInfo->P3c6);
1246 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001248 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301249 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301251 for (k = 0; k < 3; k++) {
1252 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301254 if (data & 0x01)
1255 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301257 if (data & 0x02)
1258 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001260 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301261 data = data >> 2;
1262 }
1263 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001264
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001265 for (i = 16; i < 32; i++) {
1266 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001267
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001268 for (k = 0; k < 3; k++)
1269 outb(data, pVBInfo->P3c9);
1270 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001271
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001272 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001273
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001274 for (m = 0; m < 9; m++) {
1275 di = si;
1276 bx = si + 0x04;
1277 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001278
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001279 for (n = 0; n < 3; n++) {
1280 for (o = 0; o < 5; o++) {
1281 dh = table[si];
1282 ah = table[di];
1283 al = table[bx];
1284 si++;
1285 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301286 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001287
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001288 si -= 2;
1289
1290 for (o = 0; o < 3; o++) {
1291 dh = table[bx];
1292 ah = table[di];
1293 al = table[si];
1294 si--;
1295 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1296 }
1297
1298 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301299 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001300
1301 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301302 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001303}
1304
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001305static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1306 unsigned short ModeIdIndex,
1307 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001308{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301309 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001310
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001311 /* si+Ext_ResInfo */
1312 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001313
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001314 /* si+Ext_ResInfo */
1315 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001316
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001317 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1318 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001319
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001320 if (modeflag & HalfDCLK)
1321 xres = xres << 1;
1322
1323 if (modeflag & DoubleScanMode)
1324 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301326 if (xres == 720)
1327 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301329 pVBInfo->VGAHDE = xres;
1330 pVBInfo->HDE = xres;
1331 pVBInfo->VGAVDE = yres;
1332 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001333}
1334
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001335static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1336 unsigned short ModeIdIndex,
1337 unsigned short RefreshRateTableIndex,
1338 struct vb_device_info *pVBInfo)
1339{
1340 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1341
1342 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1343
1344 tempbx = BX;
1345
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001346 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1347 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001348
1349 tempal = tempal & 0x0f;
1350
1351 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001352 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001353
Peter Huewea3d675c2012-02-09 21:11:47 +01001354 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001355 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001356 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001357 }
1358
1359 if (tempbx & 0x01)
1360 tempal = (tempal >> 4);
1361
1362 tempal = (tempal & 0x0f);
1363 }
1364
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001365 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001366
1367 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1368 if ((tempbx == 5) || (tempbx) == 7)
1369 tempcx = LCDDesDataLen2;
1370 else if ((tempbx == 3) || (tempbx == 8))
1371 tempcx = LVDSDesDataLen2;
1372 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001373
1374 switch (tempbx) {
1375 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001376 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001377 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001378 break;
1379 case 2:
1380 tempdi = XGI_EPLLCDDataPtr;
1381 break;
1382 case 3:
1383 tempdi = XGI_EPLLCDDesDataPtr;
1384 break;
1385 case 4:
1386 tempdi = XGI_LCDDataTable;
1387 break;
1388 case 5:
1389 tempdi = XGI_LCDDesDataTable;
1390 break;
1391 case 6:
1392 tempdi = XGI_EPLCHLCDRegPtr;
1393 break;
1394 case 7:
1395 case 8:
1396 case 9:
1397 tempdi = NULL;
1398 break;
1399 default:
1400 break;
1401 }
1402
1403 if (tempdi == NULL) /* OEMUtil */
1404 return NULL;
1405
1406 table = tempbx;
1407 i = 0;
1408
1409 while (tempdi[i].PANELID != 0xff) {
1410 tempdx = pVBInfo->LCDResInfo;
1411 if (tempbx & 0x0080) { /* OEMUtil */
1412 tempbx &= (~0x0080);
1413 tempdx = pVBInfo->LCDTypeInfo;
1414 }
1415
1416 if (pVBInfo->LCDInfo & EnableScalingLCD)
1417 tempdx &= (~PanelResInfo);
1418
1419 if (tempdi[i].PANELID == tempdx) {
1420 tempbx = tempdi[i].MASK;
1421 tempdx = pVBInfo->LCDInfo;
1422
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001423 if (modeflag & HalfDCLK)
1424 tempdx |= SetLCDLowResolution;
1425
1426 tempbx &= tempdx;
1427 if (tempbx == tempdi[i].CAP)
1428 break;
1429 }
1430 i++;
1431 }
1432
1433 if (table == 0) {
1434 switch (tempdi[i].DATAPTR) {
1435 case 0:
1436 return &XGI_LVDSCRT11024x768_1_H[tempal];
1437 break;
1438 case 1:
1439 return &XGI_LVDSCRT11024x768_2_H[tempal];
1440 break;
1441 case 2:
1442 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1443 break;
1444 case 3:
1445 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1446 break;
1447 case 4:
1448 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1449 break;
1450 case 5:
1451 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1452 break;
1453 case 6:
1454 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1455 break;
1456 case 7:
1457 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1458 break;
1459 case 8:
1460 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1461 break;
1462 case 9:
1463 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1464 break;
1465 case 10:
1466 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1467 break;
1468 default:
1469 break;
1470 }
1471 } else if (table == 1) {
1472 switch (tempdi[i].DATAPTR) {
1473 case 0:
1474 return &XGI_LVDSCRT11024x768_1_V[tempal];
1475 break;
1476 case 1:
1477 return &XGI_LVDSCRT11024x768_2_V[tempal];
1478 break;
1479 case 2:
1480 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1481 break;
1482 case 3:
1483 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1484 break;
1485 case 4:
1486 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1487 break;
1488 case 5:
1489 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1490 break;
1491 case 6:
1492 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1493 break;
1494 case 7:
1495 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1496 break;
1497 case 8:
1498 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1499 break;
1500 case 9:
1501 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1502 break;
1503 case 10:
1504 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1505 break;
1506 default:
1507 break;
1508 }
1509 } else if (table == 2) {
1510 switch (tempdi[i].DATAPTR) {
1511 case 0:
1512 return &XGI_LVDS1024x768Data_1[tempal];
1513 break;
1514 case 1:
1515 return &XGI_LVDS1024x768Data_2[tempal];
1516 break;
1517 case 2:
1518 return &XGI_LVDS1280x1024Data_1[tempal];
1519 break;
1520 case 3:
1521 return &XGI_LVDS1280x1024Data_2[tempal];
1522 break;
1523 case 4:
1524 return &XGI_LVDS1400x1050Data_1[tempal];
1525 break;
1526 case 5:
1527 return &XGI_LVDS1400x1050Data_2[tempal];
1528 break;
1529 case 6:
1530 return &XGI_LVDS1600x1200Data_1[tempal];
1531 break;
1532 case 7:
1533 return &XGI_LVDSNoScalingData[tempal];
1534 break;
1535 case 8:
1536 return &XGI_LVDS1024x768Data_1x75[tempal];
1537 break;
1538 case 9:
1539 return &XGI_LVDS1024x768Data_2x75[tempal];
1540 break;
1541 case 10:
1542 return &XGI_LVDS1280x1024Data_1x75[tempal];
1543 break;
1544 case 11:
1545 return &XGI_LVDS1280x1024Data_2x75[tempal];
1546 break;
1547 case 12:
1548 return &XGI_LVDSNoScalingDatax75[tempal];
1549 break;
1550 default:
1551 break;
1552 }
1553 } else if (table == 3) {
1554 switch (tempdi[i].DATAPTR) {
1555 case 0:
1556 return &XGI_LVDS1024x768Des_1[tempal];
1557 break;
1558 case 1:
1559 return &XGI_LVDS1024x768Des_3[tempal];
1560 break;
1561 case 2:
1562 return &XGI_LVDS1024x768Des_2[tempal];
1563 break;
1564 case 3:
1565 return &XGI_LVDS1280x1024Des_1[tempal];
1566 break;
1567 case 4:
1568 return &XGI_LVDS1280x1024Des_2[tempal];
1569 break;
1570 case 5:
1571 return &XGI_LVDS1400x1050Des_1[tempal];
1572 break;
1573 case 6:
1574 return &XGI_LVDS1400x1050Des_2[tempal];
1575 break;
1576 case 7:
1577 return &XGI_LVDS1600x1200Des_1[tempal];
1578 break;
1579 case 8:
1580 return &XGI_LVDSNoScalingDesData[tempal];
1581 break;
1582 case 9:
1583 return &XGI_LVDS1024x768Des_1x75[tempal];
1584 break;
1585 case 10:
1586 return &XGI_LVDS1024x768Des_3x75[tempal];
1587 break;
1588 case 11:
1589 return &XGI_LVDS1024x768Des_2x75[tempal];
1590 break;
1591 case 12:
1592 return &XGI_LVDS1280x1024Des_1x75[tempal];
1593 break;
1594 case 13:
1595 return &XGI_LVDS1280x1024Des_2x75[tempal];
1596 break;
1597 case 14:
1598 return &XGI_LVDSNoScalingDesDatax75[tempal];
1599 break;
1600 default:
1601 break;
1602 }
1603 } else if (table == 4) {
1604 switch (tempdi[i].DATAPTR) {
1605 case 0:
1606 return &XGI_ExtLCD1024x768Data[tempal];
1607 break;
1608 case 1:
1609 return &XGI_StLCD1024x768Data[tempal];
1610 break;
1611 case 2:
1612 return &XGI_CetLCD1024x768Data[tempal];
1613 break;
1614 case 3:
1615 return &XGI_ExtLCD1280x1024Data[tempal];
1616 break;
1617 case 4:
1618 return &XGI_StLCD1280x1024Data[tempal];
1619 break;
1620 case 5:
1621 return &XGI_CetLCD1280x1024Data[tempal];
1622 break;
1623 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001624 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001625 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001626 break;
1627 case 8:
1628 return &XGI_CetLCD1400x1050Data[tempal];
1629 break;
1630 case 9:
1631 return &XGI_ExtLCD1600x1200Data[tempal];
1632 break;
1633 case 10:
1634 return &XGI_StLCD1600x1200Data[tempal];
1635 break;
1636 case 11:
1637 return &XGI_NoScalingData[tempal];
1638 break;
1639 case 12:
1640 return &XGI_ExtLCD1024x768x75Data[tempal];
1641 break;
1642 case 13:
1643 return &XGI_ExtLCD1024x768x75Data[tempal];
1644 break;
1645 case 14:
1646 return &XGI_CetLCD1024x768x75Data[tempal];
1647 break;
1648 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001649 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001650 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001651 break;
1652 case 17:
1653 return &XGI_CetLCD1280x1024x75Data[tempal];
1654 break;
1655 case 18:
1656 return &XGI_NoScalingDatax75[tempal];
1657 break;
1658 default:
1659 break;
1660 }
1661 } else if (table == 5) {
1662 switch (tempdi[i].DATAPTR) {
1663 case 0:
1664 return &XGI_ExtLCDDes1024x768Data[tempal];
1665 break;
1666 case 1:
1667 return &XGI_StLCDDes1024x768Data[tempal];
1668 break;
1669 case 2:
1670 return &XGI_CetLCDDes1024x768Data[tempal];
1671 break;
1672 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001673 if ((pVBInfo->VBType & VB_SIS301LV) ||
1674 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001675 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1676 else
1677 return &XGI_ExtLCDDes1280x1024Data[tempal];
1678 break;
1679 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001680 if ((pVBInfo->VBType & VB_SIS301LV) ||
1681 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001682 return &XGI_StLCDDLDes1280x1024Data[tempal];
1683 else
1684 return &XGI_StLCDDes1280x1024Data[tempal];
1685 break;
1686 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001687 if ((pVBInfo->VBType & VB_SIS301LV) ||
1688 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001689 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1690 else
1691 return &XGI_CetLCDDes1280x1024Data[tempal];
1692 break;
1693 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001694 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001695 if ((pVBInfo->VBType & VB_SIS301LV) ||
1696 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001697 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001698 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001699 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001700 break;
1701 case 8:
1702 return &XGI_CetLCDDes1400x1050Data[tempal];
1703 break;
1704 case 9:
1705 return &XGI_CetLCDDes1400x1050Data2[tempal];
1706 break;
1707 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001708 if ((pVBInfo->VBType & VB_SIS301LV) ||
1709 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001710 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1711 else
1712 return &XGI_ExtLCDDes1600x1200Data[tempal];
1713 break;
1714 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001715 if ((pVBInfo->VBType & VB_SIS301LV) ||
1716 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001717 return &XGI_StLCDDLDes1600x1200Data[tempal];
1718 else
1719 return &XGI_StLCDDes1600x1200Data[tempal];
1720 break;
1721 case 12:
1722 return &XGI_NoScalingDesData[tempal];
1723 break;
1724 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001725 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001726 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001727 break;
1728 case 15:
1729 return &XGI_CetLCDDes1024x768x75Data[tempal];
1730 break;
1731 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001732 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001733 if ((pVBInfo->VBType & VB_SIS301LV) ||
1734 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001735 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001736 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001737 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001738 break;
1739 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001740 if ((pVBInfo->VBType & VB_SIS301LV) ||
1741 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001742 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1743 else
1744 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1745 break;
1746 case 19:
1747 return &XGI_NoScalingDesDatax75[tempal];
1748 break;
1749 default:
1750 break;
1751 }
1752 } else if (table == 6) {
1753 switch (tempdi[i].DATAPTR) {
1754 case 0:
1755 return &XGI_CH7017LV1024x768[tempal];
1756 break;
1757 case 1:
1758 return &XGI_CH7017LV1400x1050[tempal];
1759 break;
1760 default:
1761 break;
1762 }
1763 }
1764 return NULL;
1765}
1766
1767static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
1768 unsigned short ModeIdIndex,
1769 unsigned short RefreshRateTableIndex,
1770 struct vb_device_info *pVBInfo)
1771{
1772 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
1773 struct XGI330_TVDataTablStruct *tempdi = NULL;
1774
1775 tempbx = BX;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001776 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1777 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001778 tempal = tempal & 0x3f;
1779 table = tempbx;
1780
1781 switch (tempbx) {
1782 case 0:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001783 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001784 break;
1785 case 1:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001786 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001787 break;
1788 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03001789 case 6:
1790 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001791 break;
1792 case 3:
1793 tempdi = NULL;
1794 break;
1795 case 4:
1796 tempdi = XGI_TVDataTable;
1797 break;
1798 case 5:
1799 tempdi = NULL;
1800 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001801 default:
1802 break;
1803 }
1804
1805 if (tempdi == NULL) /* OEMUtil */
1806 return NULL;
1807
1808 tempdx = pVBInfo->TVInfo;
1809
1810 if (pVBInfo->VBInfo & SetInSlaveMode)
1811 tempdx = tempdx | SetTVLockMode;
1812
1813 if (modeflag & HalfDCLK)
1814 tempdx = tempdx | SetTVLowResolution;
1815
1816 i = 0;
1817
1818 while (tempdi[i].MASK != 0xffff) {
1819 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
1820 break;
1821 i++;
1822 }
1823
Aaro Koskinenebe33022011-11-27 23:03:18 +02001824 if (table == 0x04) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001825 switch (tempdi[i].DATAPTR) {
1826 case 0:
1827 return &XGI_ExtPALData[tempal];
1828 break;
1829 case 1:
1830 return &XGI_ExtNTSCData[tempal];
1831 break;
1832 case 2:
1833 return &XGI_StPALData[tempal];
1834 break;
1835 case 3:
1836 return &XGI_StNTSCData[tempal];
1837 break;
1838 case 4:
1839 return &XGI_ExtHiTVData[tempal];
1840 break;
1841 case 5:
1842 return &XGI_St2HiTVData[tempal];
1843 break;
1844 case 6:
1845 return &XGI_ExtYPbPr525iData[tempal];
1846 break;
1847 case 7:
1848 return &XGI_ExtYPbPr525pData[tempal];
1849 break;
1850 case 8:
1851 return &XGI_ExtYPbPr750pData[tempal];
1852 break;
1853 case 9:
1854 return &XGI_StYPbPr525iData[tempal];
1855 break;
1856 case 10:
1857 return &XGI_StYPbPr525pData[tempal];
1858 break;
1859 case 11:
1860 return &XGI_StYPbPr750pData[tempal];
1861 break;
1862 case 12: /* avoid system hang */
1863 return &XGI_ExtNTSCData[tempal];
1864 break;
1865 case 13:
1866 return &XGI_St1HiTVData[tempal];
1867 break;
1868 default:
1869 break;
1870 }
1871 } else if (table == 0x02) {
1872 switch (tempdi[i].DATAPTR) {
1873 case 0:
1874 return &XGI_CHTVUNTSCData[tempal];
1875 break;
1876 case 1:
1877 return &XGI_CHTVONTSCData[tempal];
1878 break;
1879 case 2:
1880 return &XGI_CHTVUPALData[tempal];
1881 break;
1882 case 3:
1883 return &XGI_CHTVOPALData[tempal];
1884 break;
1885 default:
1886 break;
1887 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001888 }
1889 return NULL;
1890}
1891
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001892static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301893 unsigned short RefreshRateTableIndex,
1894 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001895{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301896 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001897 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301899 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001900
Peter Huewea3d675c2012-02-09 21:11:47 +01001901 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe51f984b2012-06-14 00:21:51 +02001902 LCDPtr = (struct SiS_LVDSData *)XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301903 ModeNo, ModeIdIndex, RefreshRateTableIndex,
1904 pVBInfo);
1905 pVBInfo->VGAHT = LCDPtr->VGAHT;
1906 pVBInfo->VGAVT = LCDPtr->VGAVT;
1907 pVBInfo->HT = LCDPtr->LCDHT;
1908 pVBInfo->VT = LCDPtr->LCDVT;
1909 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001910
Peter Huewea3d675c2012-02-09 21:11:47 +01001911 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301912 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1913 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001914 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1915 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301916 pVBInfo->HDE = 1024;
1917 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001918 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001919 (pVBInfo->LCDResInfo ==
1920 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301921 pVBInfo->HDE = 1280;
1922 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001923 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301924 pVBInfo->HDE = 1400;
1925 pVBInfo->VDE = 1050;
1926 } else {
1927 pVBInfo->HDE = 1600;
1928 pVBInfo->VDE = 1200;
1929 }
1930 }
1931 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001932}
1933
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001934static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301935 unsigned short RefreshRateTableIndex,
1936 struct xgi_hw_device_info *HwDeviceExtension,
1937 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001938{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301939 unsigned char index;
1940 unsigned short tempbx, i;
1941 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1942 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001943
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001944 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301945 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001946
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001947 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001948
Peter Huewea3d675c2012-02-09 21:11:47 +01001949 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001950 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
1951 XGI_GetLcdPtr(tempbx, ModeNo,
1952 ModeIdIndex,
1953 RefreshRateTableIndex,
1954 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001955
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001956 for (i = 0; i < 8; i++)
1957 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301958 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001959
1960 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1961
1962 tempbx = 1;
1963
Peter Huewea3d675c2012-02-09 21:11:47 +01001964 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001965 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
1966 XGI_GetLcdPtr(
1967 tempbx,
1968 ModeNo,
1969 ModeIdIndex,
1970 RefreshRateTableIndex,
1971 pVBInfo);
1972 for (i = 0; i < 7; i++)
1973 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1974 }
1975
1976 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001977}
1978
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001979static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1980{
1981 unsigned char tempal, tempah, tempbl, i;
1982
Aaro Koskinen58839b02011-03-13 12:26:23 +02001983 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001984 tempal = tempah & 0x0F;
1985 tempah = tempah & 0xF0;
1986 i = 0;
1987 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1988
1989 while (tempbl != 0xFF) {
1990 if (tempbl & 0x80) { /* OEMUtil */
1991 tempal = tempah;
1992 tempbl = tempbl & ~(0x80);
1993 }
1994
1995 if (tempal == tempbl)
1996 break;
1997
1998 i++;
1999
2000 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2001 }
2002
2003 return i;
2004}
2005
2006static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2007{
2008 unsigned short tempah, tempal, tempbl, i;
2009
2010 tempal = pVBInfo->LCDResInfo;
2011 tempah = pVBInfo->LCDTypeInfo;
2012
2013 i = 0;
2014 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2015
2016 while (tempbl != 0xFF) {
2017 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2018 tempal = tempah;
2019 tempbl &= ~0x80;
2020 }
2021
2022 if (tempal == tempbl)
2023 break;
2024
2025 i++;
2026 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2027 }
2028
2029 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002030 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002031 pVBInfo->LCDTypeInfo = 0;
2032 i = 0;
2033 }
2034
2035 return i;
2036}
2037
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002038static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2039 unsigned short *VSyncWidth,
2040 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002041{
2042 unsigned short Index;
2043
2044 Index = XGI_GetLCDCapPtr(pVBInfo);
2045 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2046 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2047
2048 return;
2049}
2050
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002051static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302052 unsigned short RefreshRateTableIndex,
2053 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002054{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302055 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2056 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002057 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302058 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002059
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002060 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03002061 tempbx = 3;
2062 if (pVBInfo->LCDInfo & EnableScalingLCD)
2063 LCDPtr1 =
2064 (struct XGI330_LCDDataDesStruct2 *)
2065 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002066 tempbx,
2067 ModeNo,
2068 ModeIdIndex,
2069 RefreshRateTableIndex,
2070 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002071 else
2072 LCDPtr =
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002073 (struct XGI_LCDDesStruct *)
Aaro Koskinen66cface2011-08-31 21:46:13 +03002074 XGI_GetLcdPtr(
2075 tempbx,
2076 ModeNo,
2077 ModeIdIndex,
2078 RefreshRateTableIndex,
2079 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002080
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002081 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2082 push1 = tempbx;
2083 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002084
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002085 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002086 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2087 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002088 tempax = 1024;
2089 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002090 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2091 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002092 tempax = 1280;
2093 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002094 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002095 tempax = 1400;
2096 tempbx = 1050;
2097 } else {
2098 tempax = 1600;
2099 tempbx = 1200;
2100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002101
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002102 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2103 pVBInfo->HDE = tempax;
2104 pVBInfo->VDE = tempbx;
2105 pVBInfo->VGAHDE = tempax;
2106 pVBInfo->VGAVDE = tempbx;
2107 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002108
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002109 tempax = pVBInfo->HT;
2110
2111 if (pVBInfo->LCDInfo & EnableScalingLCD)
2112 tempbx = LCDPtr1->LCDHDES;
2113 else
2114 tempbx = LCDPtr->LCDHDES;
2115
2116 tempcx = pVBInfo->HDE;
2117 tempbx = tempbx & 0x0fff;
2118 tempcx += tempbx;
2119
2120 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002121 tempcx -= tempax;
2122
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002123 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002124
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002125 tempcx = tempcx >> 3;
2126 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002127
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002128 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2129 (unsigned short) (tempbx & 0xff));
2130 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2131 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002132
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002133 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002134
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002135 if (pVBInfo->LCDInfo & EnableScalingLCD)
2136 tempbx = LCDPtr1->LCDHRS;
2137 else
2138 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002139
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002140 tempcx = push2;
2141
2142 if (pVBInfo->LCDInfo & EnableScalingLCD)
2143 tempcx = LCDPtr1->LCDHSync;
2144
2145 tempcx += tempbx;
2146
2147 if (tempcx >= tempax)
2148 tempcx -= tempax;
2149
2150 tempax = tempbx & 0x07;
2151 tempax = tempax >> 5;
2152 tempcx = tempcx >> 3;
2153 tempbx = tempbx >> 3;
2154
2155 tempcx &= 0x1f;
2156 tempax |= tempcx;
2157
2158 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2159 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2160 (unsigned short) (tempbx & 0xff));
2161
2162 tempax = pVBInfo->VT;
2163 if (pVBInfo->LCDInfo & EnableScalingLCD)
2164 tempbx = LCDPtr1->LCDVDES;
2165 else
2166 tempbx = LCDPtr->LCDVDES;
2167 tempcx = pVBInfo->VDE;
2168
2169 tempbx = tempbx & 0x0fff;
2170 tempcx += tempbx;
2171 if (tempcx >= tempax)
2172 tempcx -= tempax;
2173
2174 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2175 (unsigned short) (tempbx & 0xff));
2176 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2177 (unsigned short) (tempcx & 0xff));
2178
2179 tempbx = (tempbx >> 8) & 0x07;
2180 tempcx = (tempcx >> 8) & 0x07;
2181
2182 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2183 (unsigned short) ((tempcx << 3)
2184 | tempbx));
2185
2186 tempax = pVBInfo->VT;
2187 if (pVBInfo->LCDInfo & EnableScalingLCD)
2188 tempbx = LCDPtr1->LCDVRS;
2189 else
2190 tempbx = LCDPtr->LCDVRS;
2191
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002192 tempcx = push1;
2193
2194 if (pVBInfo->LCDInfo & EnableScalingLCD)
2195 tempcx = LCDPtr1->LCDVSync;
2196
2197 tempcx += tempbx;
2198 if (tempcx >= tempax)
2199 tempcx -= tempax;
2200
2201 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2202 (unsigned short) (tempbx & 0xff));
2203 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2204 (unsigned short) (tempcx & 0x0f));
2205
2206 tempax = ((tempbx >> 8) & 0x07) << 3;
2207
2208 tempbx = pVBInfo->VGAVDE;
2209 if (tempbx != pVBInfo->VDE)
2210 tempax |= 0x40;
2211
Peter Huewea3d675c2012-02-09 21:11:47 +01002212 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002213 tempax |= 0x40;
2214
2215 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2216 tempax);
2217
2218 tempcx = pVBInfo->VGAVT;
2219 tempbx = pVBInfo->VDE;
2220 tempax = pVBInfo->VGAVDE;
2221 tempcx -= tempax;
2222
2223 temp = tempax; /* 0430 ylshieh */
2224 temp1 = (temp << 18) / tempbx;
2225
2226 tempdx = (unsigned short) ((temp << 18) % tempbx);
2227
2228 if (tempdx != 0)
2229 temp1 += 1;
2230
2231 temp2 = temp1;
2232 push3 = temp2;
2233
2234 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2235 (unsigned short) (temp2 & 0xff));
2236 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2237 (unsigned short) ((temp2 >> 8) & 0xff));
2238
2239 tempbx = (unsigned short) (temp2 >> 16);
2240 tempax = tempbx & 0x03;
2241
2242 tempbx = pVBInfo->VGAVDE;
2243 if (tempbx == pVBInfo->VDE)
2244 tempax |= 0x04;
2245
2246 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2247
2248 if (pVBInfo->VBType & VB_XGI301C) {
2249 temp2 = push3;
2250 xgifb_reg_set(pVBInfo->Part4Port,
2251 0x3c,
2252 (unsigned short) (temp2 & 0xff));
2253 xgifb_reg_set(pVBInfo->Part4Port,
2254 0x3b,
2255 (unsigned short) ((temp2 >> 8) &
2256 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002257 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002258 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2259 ~0xc0,
2260 (unsigned short) ((tempbx &
2261 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002262
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002263 tempcx = pVBInfo->VGAVDE;
2264 if (tempcx == pVBInfo->VDE)
2265 xgifb_reg_and_or(pVBInfo->Part4Port,
2266 0x30, ~0x0c, 0x00);
2267 else
2268 xgifb_reg_and_or(pVBInfo->Part4Port,
2269 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302270 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002271
2272 tempcx = pVBInfo->VGAHDE;
2273 tempbx = pVBInfo->HDE;
2274
2275 temp1 = tempcx << 16;
2276
2277 tempax = (unsigned short) (temp1 / tempbx);
2278
2279 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2280 tempax = 65535;
2281
2282 temp3 = tempax;
2283 temp1 = pVBInfo->VGAHDE << 16;
2284
2285 temp1 /= temp3;
2286 temp3 = temp3 << 16;
2287 temp1 -= 1;
2288
2289 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2290
2291 tempax = (unsigned short) (temp3 & 0xff);
2292 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2293
2294 temp1 = pVBInfo->VGAVDE << 18;
2295 temp1 = temp1 / push3;
2296 tempbx = (unsigned short) (temp1 & 0xffff);
2297
Peter Huewe255aabd2012-02-09 21:11:44 +01002298 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002299 tempbx -= 1;
2300
2301 tempax = ((tempbx >> 8) & 0xff) << 3;
2302 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2303 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2304 (unsigned short) (tempax & 0xff));
2305 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2306 (unsigned short) (tempbx & 0xff));
2307
2308 temp3 = temp3 >> 16;
2309
2310 if (modeflag & HalfDCLK)
2311 temp3 = temp3 >> 1;
2312
2313 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2314 (unsigned short) ((temp3 >> 8) & 0xff));
2315 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2316 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002317}
2318
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002319/* --------------------------------------------------------------------- */
2320/* Function : XGI_GETLCDVCLKPtr */
2321/* Input : */
2322/* Output : al -> VCLK Index */
2323/* Description : */
2324/* --------------------------------------------------------------------- */
2325static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2326 struct vb_device_info *pVBInfo)
2327{
2328 unsigned short index;
2329
Peter Huewea3d675c2012-02-09 21:11:47 +01002330 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002331 index = XGI_GetLCDCapPtr1(pVBInfo);
2332
2333 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2334 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2335 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2336 } else { /* LCDA */
2337 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2338 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2339 }
2340 }
2341 return;
2342}
2343
2344static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2345 unsigned short ModeNo, unsigned short ModeIdIndex,
2346 struct vb_device_info *pVBInfo)
2347{
2348
2349 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002350 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002351
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002352 /* si+Ext_ResInfo */
2353 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002354
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002355 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2356 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002357 index = XGI_GetLCDCapPtr(pVBInfo);
2358 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2359
Peter Huewea3d675c2012-02-09 21:11:47 +01002360 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002361 return tempal;
2362
2363 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002364 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002365 (VB_SIS301B |
2366 VB_SIS302B |
2367 VB_SIS301LV |
2368 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002369 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002370 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002371 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002372 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002373 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002374 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002375 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002376 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002377 tempal = TVCLKBASE_315 +
2378 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002379
2380 }
2381 return tempal;
2382 }
2383
Peter Huewe599801f2012-02-09 21:11:45 +01002384 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002385 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002386 return tempal;
2387 }
2388
Peter Huewe599801f2012-02-09 21:11:45 +01002389 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002390 tempal = YPbPr525pVCLK;
2391 return tempal;
2392 }
2393
2394 tempal = NTSC1024VCLK;
2395
2396 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002397 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002398 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002399 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002400 }
2401
2402 if (pVBInfo->VBInfo & SetCRT2ToTV)
2403 return tempal;
2404 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002405 } /* {End of VB} */
2406
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002407 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002408 tempal = tempal >> 2;
2409 tempal &= 0x03;
2410
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002411 /* for Dot8 Scaling LCD */
2412 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002413 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2414
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002415 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2416 return tempal;
2417}
2418
2419static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2420 unsigned char *di_1, struct vb_device_info *pVBInfo)
2421{
Peter Huewe6896b942012-02-09 21:11:46 +01002422 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2423 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002424 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
2425 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002426 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2427 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2428 }
2429 } else {
2430 *di_0 = XGI_VCLKData[tempal].SR2B;
2431 *di_1 = XGI_VCLKData[tempal].SR2C;
2432 }
2433}
2434
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002435static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302436 unsigned short RefreshRateTableIndex,
2437 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002438{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302439 unsigned char di_0, di_1, tempal;
2440 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302442 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2443 pVBInfo);
2444 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2445 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302447 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002448 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302449 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002450 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302451 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002452 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2453 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302454 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002455 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2456 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302457 }
2458 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002459}
2460
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002461static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302462 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002463{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302464 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002465
Peter Huewe6896b942012-02-09 21:11:46 +01002466 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2467 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302468 tempcl = 0;
2469 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002470 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302472 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002473 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302474 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002475 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302476 if (!(temp & 0x40))
2477 tempcl |= ActiveCRT1;
2478 }
2479 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002480
Aaro Koskinen58839b02011-03-13 12:26:23 +02002481 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302482 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002483
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302484 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002485 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002486 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302487 if (tempax & 0x04)
2488 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302490 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002491
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302492 if (!(tempcl & ActiveLCD))
2493 if (temp == 0x01)
2494 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302496 if (temp == 0x04)
2497 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002498
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302499 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002500 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002501
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302502 if (!(temp & 0x08))
2503 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302505 if (!(temp & 0x04))
2506 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302508 if (temp & 0x02)
2509 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002510
Peter Huewe599801f2012-02-09 21:11:45 +01002511 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302512 if (temp & 0x01)
2513 tempch |= ActiveHiTV;
2514 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002515
Peter Huewe599801f2012-02-09 21:11:45 +01002516 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002517 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302518 pVBInfo->Part2Port,
2519 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002520
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302521 if (temp & 0x10)
2522 tempch |= ActiveYPbPr;
2523 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002524
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302525 if (tempch != 0)
2526 tempcl |= ActiveTV;
2527 }
2528 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002529
Aaro Koskinen58839b02011-03-13 12:26:23 +02002530 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302531 if (tempcl & ActiveLCD) {
2532 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2533 if (temp & ActiveTV)
2534 tempcl |= ActiveTV;
2535 }
2536 }
2537 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002538 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002539 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002540
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302541 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002542 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302543 } else {
2544 return;
2545 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002546}
2547
Bill Pemberton80adad82010-06-17 13:10:51 -04002548void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002549{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302550 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002551
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002552 if (pVBInfo->IF_DEF_LVDS != 0)
2553 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002554
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002555 tempbx = VB_SIS302B;
2556 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2557 if (flag == 0x02)
2558 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002559
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002560 tempbx = VB_SIS301;
2561 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2562 if (flag < 0xB0)
2563 goto finish;
2564
2565 tempbx = VB_SIS301B;
2566 if (flag < 0xC0)
2567 goto bigger_than_0xB0;
2568
2569 tempbx = VB_XGI301C;
2570 if (flag < 0xD0)
2571 goto bigger_than_0xB0;
2572
2573 tempbx = VB_SIS301LV;
2574 if (flag < 0xE0)
2575 goto bigger_than_0xB0;
2576
2577 tempbx = VB_SIS302LV;
2578 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2579 if (tempah != 0xFF)
2580 tempbx = VB_XGI301C;
2581
2582bigger_than_0xB0:
2583 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2584 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2585 if (!(flag & 0x02))
2586 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302587 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002588
2589finish:
2590 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002591}
2592
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002593static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302594 struct xgi_hw_device_info *HwDeviceExtension,
2595 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002596{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302597 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002598
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002599 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302600 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002601 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002603
Miguel Gómezf9317352012-07-06 12:40:48 +02002604 if (!(pVBInfo->VBType & 0xFFFF))
2605 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002606
Miguel Gómezf9317352012-07-06 12:40:48 +02002607 /* Check Display Device */
2608 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2609 tempbx = tempbx | temp;
2610 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2611 push = temp;
2612 push = push << 8;
2613 tempax = temp << 8;
2614 tempbx = tempbx | tempax;
2615 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2616 | SetInSlaveMode | DisableCRT2Display);
2617 temp = 0xFFFF ^ temp;
2618 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002619
Miguel Gómezf9317352012-07-06 12:40:48 +02002620 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002621
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002622 if (((HwDeviceExtension->jChipType >= XG20) ||
2623 (HwDeviceExtension->jChipType >= XG40)) &&
2624 (pVBInfo->IF_DEF_LVDS == 0)) {
2625 if (pVBInfo->VBType &
2626 (VB_SIS302B |
2627 VB_SIS301LV |
2628 VB_SIS302LV |
2629 VB_XGI301C)) {
2630 if (temp & EnableDualEdge) {
2631 tempbx |= SetCRT2ToDualEdge;
2632 if (temp & SetToLCDA)
2633 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002634 }
2635 }
2636 }
2637
2638 if (pVBInfo->IF_DEF_YPbPr == 1) {
2639 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2640 ((pVBInfo->VBType & VB_SIS301LV) ||
2641 (pVBInfo->VBType & VB_SIS302LV) ||
2642 (pVBInfo->VBType & VB_XGI301C)))) {
2643 if (temp & SetYPbPr) {
2644 if (pVBInfo->IF_DEF_HiVision == 1) {
2645 /* shampoo add for new
2646 * scratch */
2647 temp = xgifb_reg_get(
2648 pVBInfo->P3d4,
2649 0x35);
2650 temp &= YPbPrMode;
2651 tempbx |= SetCRT2ToHiVision;
2652
2653 if (temp != YPbPrMode1080i) {
2654 tempbx &=
2655 (~SetCRT2ToHiVision);
2656 tempbx |=
2657 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302658 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302659 }
2660 }
2661 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002662 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002663
Miguel Gómezf9317352012-07-06 12:40:48 +02002664 tempax = push; /* restore CR31 */
2665
2666 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302667 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002668 if (pVBInfo->IF_DEF_HiVision == 1)
2669 temp = 0x09FC;
2670 else
2671 temp = 0x097C;
2672 } else {
2673 if (pVBInfo->IF_DEF_HiVision == 1)
2674 temp = 0x01FC;
2675 else
2676 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302677 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002678 } else { /* 3nd party chip */
2679 temp = SetCRT2ToLCD;
2680 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002681
Miguel Gómezf9317352012-07-06 12:40:48 +02002682 if (!(tempbx & temp)) {
2683 tempax |= DisableCRT2Display;
2684 tempbx = 0;
2685 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002686
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002687 if (!(pVBInfo->VBType & VB_NoLCD)) {
2688 if (tempbx & XGI_SetCRT2ToLCDA) {
2689 if (tempbx & SetSimuScanMode)
2690 tempbx &= (~(SetCRT2ToLCD |
2691 SetCRT2ToRAMDAC |
2692 SwitchCRT2));
2693 else
2694 tempbx &= (~(SetCRT2ToLCD |
2695 SetCRT2ToRAMDAC |
2696 SetCRT2ToTV |
2697 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002698 }
2699 }
2700
2701 /* shampoo add */
2702 /* for driver abnormal */
2703 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2704 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2705 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002706 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002707 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002708 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002709 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002710 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302711 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002712 } else {
2713 tempbx &= (~(SetCRT2ToRAMDAC |
2714 SetCRT2ToLCD |
2715 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302716 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002717 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002718
Miguel Gómezf9317352012-07-06 12:40:48 +02002719 if (!(pVBInfo->VBType & VB_NoLCD)) {
2720 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002721 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002722 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002723 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002724 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002725 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302726 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002727 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002728
Miguel Gómezf9317352012-07-06 12:40:48 +02002729 if (tempbx & SetCRT2ToSCART) {
2730 tempbx &= (0xFF00 |
2731 SetCRT2ToSCART |
2732 SwitchCRT2 |
2733 SetSimuScanMode);
2734 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2735 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002736
Miguel Gómezf9317352012-07-06 12:40:48 +02002737 if (pVBInfo->IF_DEF_YPbPr == 1) {
2738 if (tempbx & SetCRT2ToYPbPr525750)
2739 tempbx &= (0xFF00 |
2740 SwitchCRT2 |
2741 SetSimuScanMode);
2742 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002743
Miguel Gómezf9317352012-07-06 12:40:48 +02002744 if (pVBInfo->IF_DEF_HiVision == 1) {
2745 if (tempbx & SetCRT2ToHiVision)
2746 tempbx &= (0xFF00 |
2747 SetCRT2ToHiVision |
2748 SwitchCRT2 |
2749 SetSimuScanMode);
2750 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002751
Miguel Gómezf9317352012-07-06 12:40:48 +02002752 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2753 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2754 tempbx = DisableCRT2Display;
2755 }
2756
2757 if (!(tempbx & DisableCRT2Display)) {
2758 if ((!(tempbx & DriverMode)) ||
2759 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002760 if (!(tempbx & XGI_SetCRT2ToLCDA))
2761 tempbx |= (SetInSlaveMode |
2762 SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02002763 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002764
Miguel Gómezf9317352012-07-06 12:40:48 +02002765 /* LCD+TV can't support in slave mode
2766 * (Force LCDA+TV->LCDB) */
2767 if ((tempbx & SetInSlaveMode) &&
2768 (tempbx & XGI_SetCRT2ToLCDA)) {
2769 tempbx ^= (SetCRT2ToLCD |
2770 XGI_SetCRT2ToLCDA |
2771 SetCRT2ToDualEdge);
2772 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302773 }
2774 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302776 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002777}
2778
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002779static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302780 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002781{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302782 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302784 tempbx = 0;
2785 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302787 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002788 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2789 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302791 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002792 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302793 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002794 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002795 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002796 TVSetPALM |
2797 TVSetPALN |
2798 TVSetPAL);
2799 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002800 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002801 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302802 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002803 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002804 TVSetNTSCJ |
2805 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302806 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302808 if (pVBInfo->IF_DEF_LVDS == 0) {
2809 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002810 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302811 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302813 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002814 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002815 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302816 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302818 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002819 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302821 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002822 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302823 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002824 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302825 }
2826 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002827
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302828 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002829 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2830 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302831 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302833 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002834 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2835 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302836 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002837
Peter Huewe599801f2012-02-09 21:11:45 +01002838 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002839 (modeflag > 13) &&
2840 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302841 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302843 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002844
Peter Huewe599801f2012-02-09 21:11:45 +01002845 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302846 if (pVBInfo->VBInfo & SetInSlaveMode)
2847 tempbx &= (~RPLLDIV2XO);
2848 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002849 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01002850 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302851 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002852 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002853 (VB_SIS301B |
2854 VB_SIS302B |
2855 VB_SIS301LV |
2856 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002857 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302858 if (tempbx & TVSimuMode)
2859 tempbx &= (~RPLLDIV2XO);
2860 }
2861 }
2862 }
2863 }
2864 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002865}
2866
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002867static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2868 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002869{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302870 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302872 pVBInfo->LCDResInfo = 0;
2873 pVBInfo->LCDTypeInfo = 0;
2874 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002875
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002876 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2877 /* si+Ext_ResInfo // */
2878 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002879 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302880 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302882 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002883 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002884
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002885 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002886 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302887 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002888 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002889 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302890 tempax &= 0x0F;
2891 else
2892 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302894 if ((resinfo == 6) || (resinfo == 9)) {
2895 if (tempax >= 3)
2896 tempbx |= PanelRef75Hz;
2897 } else if ((resinfo == 7) || (resinfo == 8)) {
2898 if (tempax >= 4)
2899 tempbx |= PanelRef75Hz;
2900 }
2901 }
2902 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302904 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302906 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002907
Peter Huewea3d675c2012-02-09 21:11:47 +01002908 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302909 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302911 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002912
Aaro Koskinen58839b02011-03-13 12:26:23 +02002913 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002914
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302915 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302917 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002918
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302919 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002920
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302921 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302923 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002924 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002925 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 tempbx |= SetLCDDualLink;
2927 }
2928 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302930 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002931 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002932 & SetCRT2ToLCD) && (resinfo == 9) &&
2933 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002934 /*
2935 * set to center in 1280x1024 LCDB
2936 * for Panel_1400x1050
2937 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002938 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002940
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302941 if (pVBInfo->VBInfo & SetInSlaveMode) {
2942 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002943 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302944 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002945 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302946 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002947
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302948 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302950 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002951}
2952
Bill Pemberton108afbf2010-06-17 13:10:47 -04002953unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302954 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002955{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002956 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2957 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2958 break;
2959 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2960 return 0;
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 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002964}
2965
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002966static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2967{
2968 unsigned char ujRet = 0;
2969 unsigned char i = 0;
2970
2971 for (i = 0; i < 8; i++) {
2972 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002973 ujRet |= (ujDate >> i) & 1;
2974 }
2975
2976 return ujRet;
2977}
2978
2979/*----------------------------------------------------------------------------*/
2980/* output */
2981/* bl[5] : LVDS signal */
2982/* bl[1] : LVDS backlight */
2983/* bl[0] : LVDS VDD */
2984/*----------------------------------------------------------------------------*/
2985static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2986{
2987 unsigned char CR4A, temp;
2988
Aaro Koskinen58839b02011-03-13 12:26:23 +02002989 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002990 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002991
Aaro Koskinen58839b02011-03-13 12:26:23 +02002992 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002993
2994 temp = XG21GPIODataTransfer(temp);
2995 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002996 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002997 return temp;
2998}
2999
3000/*----------------------------------------------------------------------------*/
3001/* output */
3002/* bl[5] : LVDS signal */
3003/* bl[1] : LVDS backlight */
3004/* bl[0] : LVDS VDD */
3005/*----------------------------------------------------------------------------*/
3006static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3007{
3008 unsigned char CR4A, CRB4, temp;
3009
Aaro Koskinen58839b02011-03-13 12:26:23 +02003010 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003011 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003012
Aaro Koskinen58839b02011-03-13 12:26:23 +02003013 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003014
3015 temp &= 0x0C;
3016 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003017 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003018 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003019 temp |= ((CRB4 & 0x04) << 3);
3020 return temp;
3021}
3022
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003023/*----------------------------------------------------------------------------*/
3024/* input */
3025/* bl[5] : 1;LVDS signal on */
3026/* bl[1] : 1;LVDS backlight on */
3027/* bl[0] : 1:LVDS VDD on */
3028/* bh: 100000b : clear bit 5, to set bit5 */
3029/* 000010b : clear bit 1, to set bit1 */
3030/* 000001b : clear bit 0, to set bit0 */
3031/*----------------------------------------------------------------------------*/
3032static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3033 struct vb_device_info *pVBInfo)
3034{
3035 unsigned char CR4A, temp;
3036
3037 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3038 tempbh &= 0x23;
3039 tempbl &= 0x23;
3040 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3041
3042 if (tempbh & 0x20) {
3043 temp = (tempbl >> 4) & 0x02;
3044
3045 /* CR B4[1] */
3046 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3047
3048 }
3049
3050 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3051
3052 temp = XG21GPIODataTransfer(temp);
3053 temp &= ~tempbh;
3054 temp |= tempbl;
3055 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3056}
3057
Aaro Koskinen776115a2011-11-27 23:03:10 +02003058static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3059 struct vb_device_info *pVBInfo)
3060{
3061 unsigned char CR4A, temp;
3062 unsigned short tempbh0, tempbl0;
3063
3064 tempbh0 = tempbh;
3065 tempbl0 = tempbl;
3066 tempbh0 &= 0x20;
3067 tempbl0 &= 0x20;
3068 tempbh0 >>= 3;
3069 tempbl0 >>= 3;
3070
3071 if (tempbh & 0x20) {
3072 temp = (tempbl >> 4) & 0x02;
3073
3074 /* CR B4[1] */
3075 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3076
3077 }
3078 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3079
3080 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3081 tempbh &= 0x03;
3082 tempbl &= 0x03;
3083 tempbh <<= 2;
3084 tempbl <<= 2; /* GPIOC,GPIOD */
3085 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3086 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3087}
3088
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003089static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3090 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303091 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003092{
3093
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003094 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303095 if (pXGIHWDE->jChipType == XG21) {
3096 if (pVBInfo->IF_DEF_LVDS == 1) {
3097 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003098 /* LVDS VDD on */
3099 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003100 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303101 }
3102 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003103 /* LVDS signal on */
3104 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003105 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003106 /* LVDS backlight on */
3107 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303108 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003109 /* DVO/DVI signal on */
3110 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003112
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303113 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303115 if (pXGIHWDE->jChipType == XG27) {
3116 if (pVBInfo->IF_DEF_LVDS == 1) {
3117 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003118 /* LVDS VDD on */
3119 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003120 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303121 }
3122 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003123 /* LVDS signal on */
3124 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003125 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003126 /* LVDS backlight on */
3127 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303128 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003129 /* DVO/DVI signal on */
3130 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303131 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003132
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003134}
3135
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003136void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3137 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303138 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003139{
3140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303141 if (pXGIHWDE->jChipType == XG21) {
3142 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003143 /* LVDS backlight off */
3144 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003145 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003147 /* DVO/DVI signal off */
3148 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303149 }
3150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 if (pXGIHWDE->jChipType == XG27) {
3153 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003154 /* LVDS backlight off */
3155 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003156 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303159 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003160 /* DVO/DVI signal off */
3161 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303162 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003163
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003164 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003165}
3166
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003167static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003168{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003169 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303170 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003171
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003172 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003174}
3175
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003176static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003177{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003178 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003179}
3180
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003181static void XGI_SaveCRT2Info(unsigned short ModeNo,
3182 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003183{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303184 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003185
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003186 /* reserve CR34 for CRT1 Mode No */
3187 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303188 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3189 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003190 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003191}
3192
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003193static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3194 unsigned short ModeIdIndex,
3195 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003196{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303197 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003198
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003199 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003200 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3201 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3202 /* si+St_ModeFlag */
3203 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003204
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003205 if (modeflag & HalfDCLK)
3206 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003207
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003208 if (modeflag & DoubleScanMode)
3209 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003210
Miguel Gómez3339db82012-07-06 12:40:49 +02003211 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3212 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003213
Miguel Gómez3339db82012-07-06 12:40:49 +02003214 if (pVBInfo->IF_DEF_LVDS == 0) {
3215 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3216 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3217 if (yres == 1024)
3218 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303219 }
3220 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003221
Miguel Gómez3339db82012-07-06 12:40:49 +02003222 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3223 if (yres == 400)
3224 yres = 405;
3225 else if (yres == 350)
3226 yres = 360;
3227
3228 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3229 if (yres == 360)
3230 yres = 375;
3231 }
3232 }
3233
3234 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3235 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3236 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3237 if (yres == 350)
3238 yres = 357;
3239 else if (yres == 400)
3240 yres = 420;
3241 else if (yres == 480)
3242 yres = 525;
3243 }
3244 }
3245 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303246 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003247
Miguel Gómez3339db82012-07-06 12:40:49 +02003248 if (xres == 720)
3249 xres = 640;
3250
3251exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303252 pVBInfo->VGAHDE = xres;
3253 pVBInfo->HDE = xres;
3254 pVBInfo->VGAVDE = yres;
3255 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003256}
3257
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003258static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003259{
3260
Peter Huewea3d675c2012-02-09 21:11:47 +01003261 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003262 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303263 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303265 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003266}
3267
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003268static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3269 unsigned short ModeIdIndex,
3270 unsigned short RefreshRateTableIndex,
3271 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003272{
3273 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003274 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003275
3276 pVBInfo->RVBHCMAX = 1;
3277 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003278 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3279 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3280 CRT1Index &= IndexMask;
3281 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3282 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3283 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3284 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3285 tempcx = (unsigned short)
3286 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3287 tempcx &= 0x0100;
3288 tempcx = tempcx << 2;
3289 tempbx |= tempcx;
3290 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003291
3292 if (temp1 & 0x01)
3293 tempbx |= 0x0100;
3294
3295 if (temp1 & 0x20)
3296 tempbx |= 0x0200;
3297 tempax += 5;
3298
3299 if (modeflag & Charx8Dot)
3300 tempax *= 8;
3301 else
3302 tempax *= 9;
3303
3304 pVBInfo->VGAHT = tempax;
3305 pVBInfo->HT = tempax;
3306 tempbx++;
3307 pVBInfo->VGAVT = tempbx;
3308 pVBInfo->VT = tempbx;
3309}
3310
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003311static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303312 unsigned short RefreshRateTableIndex,
3313 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003314{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003316
Peter Huewefc39dcb2012-01-15 19:22:12 +01003317 struct SiS_LCDData *LCDPtr = NULL;
3318 struct SiS_TVData *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003319
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003320 /* si+Ext_ResInfo */
3321 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3322 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303323 pVBInfo->NewFlickerMode = 0;
3324 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303326 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3327 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3328 pVBInfo);
3329 return;
3330 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003331
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303332 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003333
Peter Huewea3d675c2012-02-09 21:11:47 +01003334 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003335 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303336 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3337 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003338
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303339 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3340 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3341 pVBInfo->VGAHT = LCDPtr->VGAHT;
3342 pVBInfo->VGAVT = LCDPtr->VGAVT;
3343 pVBInfo->HT = LCDPtr->LCDHT;
3344 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003345
Peter Huewe255aabd2012-02-09 21:11:44 +01003346 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303347 tempax = 1024;
3348 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003349
Peter Huewea3d675c2012-02-09 21:11:47 +01003350 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 if (pVBInfo->VGAVDE == 357)
3352 tempbx = 527;
3353 else if (pVBInfo->VGAVDE == 420)
3354 tempbx = 620;
3355 else if (pVBInfo->VGAVDE == 525)
3356 tempbx = 775;
3357 else if (pVBInfo->VGAVDE == 600)
3358 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303359 else
3360 tempbx = 768;
3361 } else
3362 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003363 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303364 tempax = 1024;
3365 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003366 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303367 tempax = 1280;
3368 if (pVBInfo->VGAVDE == 360)
3369 tempbx = 768;
3370 else if (pVBInfo->VGAVDE == 375)
3371 tempbx = 800;
3372 else if (pVBInfo->VGAVDE == 405)
3373 tempbx = 864;
3374 else
3375 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003376 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303377 tempax = 1280;
3378 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003379 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303380 tempax = 1280;
3381 if (pVBInfo->VGAVDE == 350)
3382 tempbx = 700;
3383 else if (pVBInfo->VGAVDE == 400)
3384 tempbx = 800;
3385 else if (pVBInfo->VGAVDE == 1024)
3386 tempbx = 960;
3387 else
3388 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003389 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303390 tempax = 1400;
3391 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303393 if (pVBInfo->VGAVDE == 1024) {
3394 tempax = 1280;
3395 tempbx = 1024;
3396 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003397 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303398 tempax = 1600;
3399 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003400 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303401 if (pVBInfo->VGAVDE == 350)
3402 tempbx = 875;
3403 else if (pVBInfo->VGAVDE == 400)
3404 tempbx = 1000;
3405 }
3406 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003407
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303408 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3409 tempax = pVBInfo->VGAHDE;
3410 tempbx = pVBInfo->VGAVDE;
3411 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003412
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303413 pVBInfo->HDE = tempax;
3414 pVBInfo->VDE = tempbx;
3415 return;
3416 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303418 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
3419 tempbx = 4;
Peter Huewefc39dcb2012-01-15 19:22:12 +01003420 TVPtr = (struct SiS_TVData *) XGI_GetTVPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3422 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003423
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303424 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3425 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3426 pVBInfo->VGAHT = TVPtr->VGAHT;
3427 pVBInfo->VGAVT = TVPtr->VGAVT;
3428 pVBInfo->HDE = TVPtr->TVHDE;
3429 pVBInfo->VDE = TVPtr->TVVDE;
3430 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3431 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003432
Peter Huewe599801f2012-02-09 21:11:45 +01003433 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 if (resinfo == 0x08)
3435 pVBInfo->NewFlickerMode = 0x40;
3436 else if (resinfo == 0x09)
3437 pVBInfo->NewFlickerMode = 0x40;
3438 else if (resinfo == 0x12)
3439 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303441 if (pVBInfo->VGAVDE == 350)
3442 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303444 tempax = ExtHiTVHT;
3445 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303447 if (pVBInfo->VBInfo & SetInSlaveMode) {
3448 if (pVBInfo->TVInfo & TVSimuMode) {
3449 tempax = StHiTVHT;
3450 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303452 if (!(modeflag & Charx8Dot)) {
3453 tempax = StHiTextTVHT;
3454 tempbx = StHiTextTVVT;
3455 }
3456 }
3457 }
Peter Huewe599801f2012-02-09 21:11:45 +01003458 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3459 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3461 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3462 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003463
Peter Huewe599801f2012-02-09 21:11:45 +01003464 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303465 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3466 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003467 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3469 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3470 if (pVBInfo->TVInfo & NTSC1024x768)
3471 tempax = NTSC1024x768HT;
3472 }
3473 } else {
3474 tempax = PALHT;
3475 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003476 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303477 tempax = NTSCHT;
3478 tempbx = NTSCVT;
3479 if (pVBInfo->TVInfo & NTSC1024x768)
3480 tempax = NTSC1024x768HT;
3481 }
3482 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003483
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303484 pVBInfo->HT = tempax;
3485 pVBInfo->VT = tempbx;
3486 return;
3487 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003488}
3489
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003490static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303491 unsigned short RefreshRateTableIndex,
3492 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003493{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003494 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3497 pVBInfo);
3498 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3499 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003500
Peter Huewe6896b942012-02-09 21:11:46 +01003501 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303502 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003503 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3504 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3505 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303506 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003507 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3508 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303509 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003510
Aaro Koskinen8104e322011-03-13 12:26:22 +02003511 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303513 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003514 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003516 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003517}
3518
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003519static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3520 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003521{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003522 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3523 short index;
3524 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303525
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003526 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003527 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303528
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003529 if (index < 0)
3530 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303531
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003532 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303533}
3534
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003535static unsigned short XGI_GetOffset(unsigned short ModeNo,
3536 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303537 unsigned short RefreshRateTableIndex,
3538 struct xgi_hw_device_info *HwDeviceExtension,
3539 struct vb_device_info *pVBInfo)
3540{
3541 unsigned short temp, colordepth, modeinfo, index, infoflag,
3542 ColorDepth[] = { 0x01, 0x02, 0x04 };
3543
3544 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003545 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303546
3547 index = (modeinfo >> 8) & 0xFF;
3548
3549 temp = pVBInfo->ScreenOffset[index];
3550
3551 if (infoflag & InterlaceMode)
3552 temp = temp << 1;
3553
3554 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3555
3556 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3557 temp = ModeNo - 0x7C;
3558 colordepth = ColorDepth[temp];
3559 temp = 0x6B;
3560 if (infoflag & InterlaceMode)
3561 temp = temp << 1;
3562 return temp * colordepth;
3563 } else {
3564 return temp * colordepth;
3565 }
3566}
3567
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003568static void XGI_SetCRT2Offset(unsigned short ModeNo,
3569 unsigned short ModeIdIndex,
3570 unsigned short RefreshRateTableIndex,
3571 struct xgi_hw_device_info *HwDeviceExtension,
3572 struct vb_device_info *pVBInfo)
3573{
3574 unsigned short offset;
3575 unsigned char temp;
3576
3577 if (pVBInfo->VBInfo & SetInSlaveMode)
3578 return;
3579
3580 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3581 HwDeviceExtension, pVBInfo);
3582 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003583 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003584 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003585 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003586 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003587 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003588}
3589
Randy Dunlap89229672010-08-10 08:46:44 -07003590static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003591{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003592 /* threshold high ,disable auto threshold */
3593 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3594 /* threshold low default 04h */
3595 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003596}
3597
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003598static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303599 struct xgi_hw_device_info *HwDeviceExtension,
3600 unsigned short RefreshRateTableIndex,
3601 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003602{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303603 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003604
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003605 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3606 CRT1Index &= IndexMask;
3607 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003608
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303609 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3610 HwDeviceExtension, pVBInfo);
3611 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303613 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003614 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003615
Aaro Koskinen8104e322011-03-13 12:26:22 +02003616 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3617 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003618}
3619
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003620static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303621 struct xgi_hw_device_info *HwDeviceExtension,
3622 unsigned short RefreshRateTableIndex,
3623 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003624{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303625 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3626 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003627
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003628 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3629 CRT1Index &= IndexMask;
3630 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3631 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303633 /* bainy change table name */
3634 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003635 /* BTVGA2HT 0x08,0x09 */
3636 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003637 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303638 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003639 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003640 /* BTVGA2HDEE 0x0A,0x0C */
3641 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003642 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303643 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3644 pushbx = pVBInfo->VGAHDE / 2 + 16;
3645 tempcx = tempcx >> 1;
3646 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3647 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303649 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3650 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003651 tempbx |= ((pVBInfo->
3652 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3653 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3655 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3656 tempcx &= 0x1F;
3657 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3658 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3659 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3660 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003661
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303662 tempbx += 4;
3663 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003664
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303665 if (tempcx > (pVBInfo->VGAHT / 2))
3666 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303668 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003669
Aaro Koskinen8104e322011-03-13 12:26:22 +02003670 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303671 } else {
3672 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
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 - 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 + 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; /* cx */
3680 pushbx = pVBInfo->VGAHDE + 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[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003687 tempbx |= ((pVBInfo->
3688 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
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[4];
3692 tempcx &= 0x1F;
3693 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3694 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3695 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3696 tempbx += 16;
3697 tempcx += 16;
3698 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303700 if (tempcx > pVBInfo->VGAHT)
3701 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303703 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003704 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303705 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303707 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3708 tempbx = pushbx;
3709 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3710 tempax |= (tempbx & 0xFF00);
3711 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003712 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303713 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003714 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303715 tempcx = (pVBInfo->VGAVT - 1);
3716 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003717
Aaro Koskinen8104e322011-03-13 12:26:22 +02003718 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303719 tempbx = pVBInfo->VGAVDE - 1;
3720 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003721 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303722 temp = ((tempbx & 0xFF00) << 3) >> 8;
3723 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003724 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303726 tempax = pVBInfo->VGAVDE;
3727 tempbx = pVBInfo->VGAVDE;
3728 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003729 /* BTVGA2VRS 0x10,0x11 */
3730 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3731 /* BTVGA2VRE 0x11 */
3732 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303734 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3735 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3736 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303738 if (temp & 0x04)
3739 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303741 if (temp & 0x080)
3742 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003743
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303744 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003745
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303746 if (temp & 0x08)
3747 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303749 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3750 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3751 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303753 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003754 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303755 temp = ((tempbx & 0xFF00) >> 8) << 4;
3756 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003757 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303758 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003759
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303760 if (modeflag & DoubleScanMode)
3761 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303763 if (modeflag & HalfDCLK)
3764 tempax |= 0x40;
3765
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003766 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003767}
3768
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003769static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3770{
3771 unsigned long tempax, tempbx;
3772
3773 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3774 & 0xFFFF;
3775 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3776 tempax = (tempax * pVBInfo->HT) / tempbx;
3777
3778 return (unsigned short) tempax;
3779}
3780
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003781static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303782 struct xgi_hw_device_info *HwDeviceExtension,
3783 unsigned short RefreshRateTableIndex,
3784 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003785{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303786 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3787 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003788
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003789 /* si+Ext_ResInfo */
3790 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3791 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3792 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3793 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303795 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3796 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303798 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003799 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303800 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003801
Peter Huewe6896b942012-02-09 21:11:46 +01003802 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303803 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303805 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303807 if (modeflag & HalfDCLK)
3808 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303810 tempax = (tempax / tempcx) - 1;
3811 tempbx |= ((tempax & 0x00FF) << 8);
3812 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003813 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303815 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303817 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003818 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3819 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303820 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003821
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003822 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3823 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303824 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303825 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003826
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003827 /* 0x05 Horizontal Display Start */
3828 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3829 /* 0x06 Horizontal Blank end */
3830 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303832 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3833 if (pVBInfo->VBInfo & SetCRT2ToTV)
3834 tempax = pVBInfo->VGAHT;
3835 else
3836 tempax = XGI_GetVGAHT2(pVBInfo);
3837 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303839 if (tempax >= pVBInfo->VGAHT)
3840 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303842 if (modeflag & HalfDCLK)
3843 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303845 tempax = (tempax / tempcx) - 5;
3846 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003847 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303848 temp = (tempbx & 0x00FF) - 1;
3849 if (!(modeflag & HalfDCLK)) {
3850 temp -= 6;
3851 if (pVBInfo->TVInfo & TVSimuMode) {
3852 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003853 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303854 }
3855 }
3856 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303857 tempbx = (tempbx & 0xFF00) >> 8;
3858 tempcx = (tempcx + tempbx) >> 1;
3859 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303861 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3862 temp -= 1;
3863 if (!(modeflag & HalfDCLK)) {
3864 if ((modeflag & Charx8Dot)) {
3865 temp += 4;
3866 if (pVBInfo->VGAHDE >= 800)
3867 temp -= 6;
3868 }
3869 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003870 } else if (!(modeflag & HalfDCLK)) {
3871 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003872 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003873 pVBInfo->VGAHDE >= 800) {
3874 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003875 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003876 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003877 (pVBInfo->LCDInfo & LCDNonExpanding))
3878 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303879 }
3880 }
3881 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003882
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003883 /* 0x07 Horizontal Retrace Start */
3884 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3885 /* 0x08 Horizontal Retrace End */
3886 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303888 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3889 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003890 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303891 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003892 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303893 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003894 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303895 0x08, 0x03);
3896 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003897 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303898 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003899 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303900 0x08, 0x02);
3901 }
3902 }
3903 }
3904 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003905
Aaro Koskinen8104e322011-03-13 12:26:22 +02003906 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003907 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003908 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003909
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303910 tempbx = pVBInfo->VGAVT;
3911 push1 = tempbx;
3912 tempcx = 0x121;
3913 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003914
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303915 if (tempbx == 357)
3916 tempbx = 350;
3917 if (tempbx == 360)
3918 tempbx = 350;
3919 if (tempbx == 375)
3920 tempbx = 350;
3921 if (tempbx == 405)
3922 tempbx = 400;
3923 if (tempbx == 525)
3924 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303926 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003927
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303928 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003929 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003930 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303931 if (tempbx == 350)
3932 tempbx += 5;
3933 if (tempbx == 480)
3934 tempbx += 5;
3935 }
3936 }
3937 }
3938 tempbx--;
3939 temp = tempbx & 0x00FF;
3940 tempbx--;
3941 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003942 /* 0x10 vertical Blank Start */
3943 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303944 tempbx = push2;
3945 tempbx--;
3946 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003947 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003948
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303949 if (tempbx & 0x0100)
3950 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003951
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303952 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003953
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303954 if (modeflag & DoubleScanMode)
3955 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303957 if (tempbx & 0x0200)
3958 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303960 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003961 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303963 if (tempbx & 0x0400)
3964 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003965
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003966 /* 0x11 Vertival Blank End */
3967 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303968
3969 tempax = push1;
3970 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3971 tempax = tempax >> 2;
3972 push1 = tempax; /* push ax */
3973
3974 if (resinfo != 0x09) {
3975 tempax = tempax << 1;
3976 tempbx += tempax;
3977 }
3978
Peter Huewe599801f2012-02-09 21:11:45 +01003979 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003980 if ((pVBInfo->VBType & VB_SIS301LV) &&
3981 !(pVBInfo->TVInfo & TVSetHiVision)) {
3982 if ((pVBInfo->TVInfo & TVSimuMode) &&
3983 (pVBInfo->TVInfo & TVSetPAL)) {
3984 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3985 !(pVBInfo->TVInfo &
3986 (TVSetYPbPr525p |
3987 TVSetYPbPr750p |
3988 TVSetHiVision)))
3989 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303990 }
3991 } else {
3992 tempbx -= 10;
3993 }
3994 } else {
3995 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01003996 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01003997 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003998 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01003999 (TVSetYPbPr525p |
4000 TVSetYPbPr750p |
4001 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304002 tempbx += 40;
4003 } else {
4004 tempbx += 40;
4005 }
4006 }
4007 }
4008 }
4009 tempax = push1;
4010 tempax = tempax >> 2;
4011 tempax++;
4012 tempax += tempbx;
4013 push1 = tempax; /* push ax */
4014
Peter Huewe599801f2012-02-09 21:11:45 +01004015 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 if (tempbx <= 513) {
4017 if (tempax >= 513)
4018 tempbx = 513;
4019 }
4020 }
4021
4022 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004023 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304024 tempbx--;
4025 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004026 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304027
4028 if (tempbx & 0x0100)
4029 tempcx |= 0x0008;
4030
4031 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004032 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304033
4034 tempbx++;
4035
4036 if (tempbx & 0x0100)
4037 tempcx |= 0x0004;
4038
4039 if (tempbx & 0x0200)
4040 tempcx |= 0x0080;
4041
4042 if (tempbx & 0x0400)
4043 tempcx |= 0x0C00;
4044
4045 tempbx = push1; /* pop ax */
4046 temp = tempbx & 0x00FF;
4047 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004048 /* 0x0D vertical Retrace End */
4049 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304050
4051 if (tempbx & 0x0010)
4052 tempcx |= 0x2000;
4053
4054 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004055 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304056 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004057 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304058 tempax = modeflag;
4059 temp = (tempax & 0xFF00) >> 8;
4060
4061 temp = (temp >> 1) & 0x09;
4062
Peter Huewe6896b942012-02-09 21:11:46 +01004063 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304064 temp |= 0x01;
4065
Aaro Koskinen8104e322011-03-13 12:26:22 +02004066 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4067 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4068 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304069
4070 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4071 temp = 0x80;
4072 else
4073 temp = 0x00;
4074
Aaro Koskinen8104e322011-03-13 12:26:22 +02004075 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304076
4077 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004078}
4079
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004080static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304081 unsigned short RefreshRateTableIndex,
4082 struct xgi_hw_device_info *HwDeviceExtension,
4083 struct vb_device_info *pVBInfo)
4084{
4085 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4086 modeflag, resinfo, crt2crtc;
4087 unsigned char *TimingPoint;
4088
4089 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4090
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004091 /* si+Ext_ResInfo */
4092 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4093 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4094 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304095
4096 tempax = 0;
4097
4098 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4099 tempax |= 0x0800;
4100
4101 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4102 tempax |= 0x0400;
4103
4104 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4105 tempax |= 0x0200;
4106
Peter Huewe599801f2012-02-09 21:11:45 +01004107 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304108 tempax |= 0x1000;
4109
Peter Huewe599801f2012-02-09 21:11:45 +01004110 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304111 tempax |= 0x0100;
4112
Peter Huewe599801f2012-02-09 21:11:45 +01004113 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304114 tempax &= 0xfe00;
4115
4116 tempax = (tempax & 0xff00) >> 8;
4117
Aaro Koskinen8104e322011-03-13 12:26:22 +02004118 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304119 TimingPoint = pVBInfo->NTSCTiming;
4120
Peter Huewe599801f2012-02-09 21:11:45 +01004121 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304122 TimingPoint = pVBInfo->PALTiming;
4123
Peter Huewe599801f2012-02-09 21:11:45 +01004124 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304125 TimingPoint = pVBInfo->HiTVExtTiming;
4126
4127 if (pVBInfo->VBInfo & SetInSlaveMode)
4128 TimingPoint = pVBInfo->HiTVSt2Timing;
4129
4130 if (pVBInfo->SetFlag & TVSimuMode)
4131 TimingPoint = pVBInfo->HiTVSt1Timing;
4132
4133 if (!(modeflag & Charx8Dot))
4134 TimingPoint = pVBInfo->HiTVTextTiming;
4135 }
4136
Peter Huewe599801f2012-02-09 21:11:45 +01004137 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4138 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304139 TimingPoint = pVBInfo->YPbPr525iTiming;
4140
Peter Huewe599801f2012-02-09 21:11:45 +01004141 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304142 TimingPoint = pVBInfo->YPbPr525pTiming;
4143
Peter Huewe599801f2012-02-09 21:11:45 +01004144 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304145 TimingPoint = pVBInfo->YPbPr750pTiming;
4146 }
4147
4148 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004149 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304150
4151 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004152 /* di->temp2[j] */
4153 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304154
4155 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004156 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304157
4158 temp = pVBInfo->NewFlickerMode;
4159 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004160 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304161
Peter Huewe599801f2012-02-09 21:11:45 +01004162 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304163 tempax = 950;
4164
Peter Huewe599801f2012-02-09 21:11:45 +01004165 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304166 tempax = 520;
4167 else
4168 tempax = 440;
4169
4170 if (pVBInfo->VDE <= tempax) {
4171 tempax -= pVBInfo->VDE;
4172 tempax = tempax >> 2;
4173 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4174 push1 = tempax;
4175 temp = (tempax & 0xFF00) >> 8;
4176 temp += (unsigned short) TimingPoint[0];
4177
Peter Huewe6896b942012-02-09 21:11:46 +01004178 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4179 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304180 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4181 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004182 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304183 tempcx = pVBInfo->VGAHDE;
4184 if (tempcx >= 1024) {
4185 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004186 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304187 temp = 0x19; /* PAL */
4188 }
4189 }
4190 }
4191
Aaro Koskinen8104e322011-03-13 12:26:22 +02004192 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304193 tempax = push1;
4194 temp = (tempax & 0xFF00) >> 8;
4195 temp += TimingPoint[1];
4196
Peter Huewe6896b942012-02-09 21:11:46 +01004197 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4198 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304199 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4200 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004201 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304202 tempcx = pVBInfo->VGAHDE;
4203 if (tempcx >= 1024) {
4204 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004205 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304206 temp = 0x52; /* PAL */
4207 }
4208 }
4209 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004210 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304211 }
4212
4213 /* 301b */
4214 tempcx = pVBInfo->HT;
4215
4216 if (XGI_IsLCDDualLink(pVBInfo))
4217 tempcx = tempcx >> 1;
4218
4219 tempcx -= 2;
4220 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004221 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304222
4223 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004224 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304225
4226 tempcx = pVBInfo->HT >> 1;
4227 push1 = tempcx; /* push cx */
4228 tempcx += 7;
4229
Peter Huewe599801f2012-02-09 21:11:45 +01004230 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304231 tempcx -= 4;
4232
4233 temp = tempcx & 0x00FF;
4234 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004235 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304236
4237 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4238 tempbx += tempcx;
4239 push2 = tempbx;
4240 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004241 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304242 temp = (tempbx & 0xFF00) >> 8;
4243 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004244 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304245
4246 tempbx = push2;
4247 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004248 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304249 tempbx = tempbx - 4;
4250 tempcx = tempbx;
4251 }
4252
4253 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004254 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304255
4256 j += 2;
4257 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4258 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004259 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304260 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004261 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304262
4263 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004264 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304265 tempcx -= 4;
4266
4267 temp = tempcx & 0xFF;
4268 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004269 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304270
4271 tempcx = push1; /* pop cx */
4272 j += 2;
4273 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4274 tempcx -= temp;
4275 temp = tempcx & 0x00FF;
4276 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004277 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304278
4279 tempcx -= 11;
4280
4281 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4282 tempax = XGI_GetVGAHT2(pVBInfo);
4283 tempcx = tempax - 1;
4284 }
4285 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004286 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304287
4288 tempbx = pVBInfo->VDE;
4289
4290 if (pVBInfo->VGAVDE == 360)
4291 tempbx = 746;
4292 if (pVBInfo->VGAVDE == 375)
4293 tempbx = 746;
4294 if (pVBInfo->VGAVDE == 405)
4295 tempbx = 853;
4296
4297 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004298 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004299 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004300 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004301 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304302 tempbx = tempbx >> 1;
4303 } else
4304 tempbx = tempbx >> 1;
4305 }
4306
4307 tempbx -= 2;
4308 temp = tempbx & 0x00FF;
4309
Peter Huewe599801f2012-02-09 21:11:45 +01004310 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004311 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004312 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304313 if (pVBInfo->VBInfo & SetInSlaveMode) {
4314 if (ModeNo == 0x2f)
4315 temp += 1;
4316 }
4317 }
4318 } else {
4319 if (pVBInfo->VBInfo & SetInSlaveMode) {
4320 if (ModeNo == 0x2f)
4321 temp += 1;
4322 }
4323 }
4324 }
4325
Aaro Koskinen8104e322011-03-13 12:26:22 +02004326 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304327
4328 temp = (tempcx & 0xFF00) >> 8;
4329 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4330
Peter Huewe599801f2012-02-09 21:11:45 +01004331 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004332 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004333 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 temp |= 0x10;
4335
4336 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4337 temp |= 0x20;
4338 }
4339 } else {
4340 temp |= 0x10;
4341 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4342 temp |= 0x20;
4343 }
4344 }
4345
Aaro Koskinen8104e322011-03-13 12:26:22 +02004346 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304347
Peter Huewe6896b942012-02-09 21:11:46 +01004348 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4349 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304350 tempbx = pVBInfo->VDE;
4351 tempcx = tempbx - 2;
4352
4353 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004354 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4355 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304356 tempbx = tempbx >> 1;
4357 }
4358
Peter Huewe6896b942012-02-09 21:11:46 +01004359 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304360 temp = 0;
4361 if (tempcx & 0x0400)
4362 temp |= 0x20;
4363
4364 if (tempbx & 0x0400)
4365 temp |= 0x40;
4366
Aaro Koskinen8104e322011-03-13 12:26:22 +02004367 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304368 }
4369
4370 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004371 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304372 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004373 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304374 }
4375
4376 tempbx = tempbx & 0x00FF;
4377
4378 if (!(modeflag & HalfDCLK)) {
4379 tempcx = pVBInfo->VGAHDE;
4380 if (tempcx >= pVBInfo->HDE) {
4381 tempbx |= 0x2000;
4382 tempax &= 0x00FF;
4383 }
4384 }
4385
4386 tempcx = 0x0101;
4387
4388 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4389 if (pVBInfo->VGAHDE >= 1024) {
4390 tempcx = 0x1920;
4391 if (pVBInfo->VGAHDE >= 1280) {
4392 tempcx = 0x1420;
4393 tempbx = tempbx & 0xDFFF;
4394 }
4395 }
4396 }
4397
4398 if (!(tempbx & 0x2000)) {
4399 if (modeflag & HalfDCLK)
4400 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4401
4402 push1 = tempbx;
4403 tempeax = pVBInfo->VGAHDE;
4404 tempebx = (tempcx & 0xFF00) >> 8;
4405 longtemp = tempeax * tempebx;
4406 tempecx = tempcx & 0x00FF;
4407 longtemp = longtemp / tempecx;
4408
4409 /* 301b */
4410 tempecx = 8 * 1024;
4411
Peter Huewe6896b942012-02-09 21:11:46 +01004412 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4413 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304414 tempecx = tempecx * 8;
4415 }
4416
4417 longtemp = longtemp * tempecx;
4418 tempecx = pVBInfo->HDE;
4419 temp2 = longtemp % tempecx;
4420 tempeax = longtemp / tempecx;
4421 if (temp2 != 0)
4422 tempeax += 1;
4423
4424 tempax = (unsigned short) tempeax;
4425
4426 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004427 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4428 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304429 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4430 }
4431 /* end 301b */
4432
4433 tempbx = push1;
4434 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4435 | (tempbx & 0x00FF));
4436 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4437 | (tempax & 0x00FF));
4438 temp = (tempax & 0xFF00) >> 8;
4439 } else {
4440 temp = (tempax & 0x00FF) >> 8;
4441 }
4442
Aaro Koskinen8104e322011-03-13 12:26:22 +02004443 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304444 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004445 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304446 temp = tempcx & 0x00FF;
4447
4448 if (tempbx & 0x2000)
4449 temp = 0;
4450
4451 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4452 temp |= 0x18;
4453
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004454 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004455 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304456 tempbx = 0x0382;
4457 tempcx = 0x007e;
4458 } else {
4459 tempbx = 0x0369;
4460 tempcx = 0x0061;
4461 }
4462
4463 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004464 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304465 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004466 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467
4468 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4469 temp = temp << 2;
4470 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4471
Peter Huewe599801f2012-02-09 21:11:45 +01004472 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304473 temp |= 0x10;
4474
Peter Huewe599801f2012-02-09 21:11:45 +01004475 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304476 temp |= 0x20;
4477
Peter Huewe599801f2012-02-09 21:11:45 +01004478 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304479 temp |= 0x60;
4480 }
4481
Aaro Koskinen8104e322011-03-13 12:26:22 +02004482 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004483 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004484 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304485
Peter Huewe599801f2012-02-09 21:11:45 +01004486 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304487 if (pVBInfo->TVInfo & NTSC1024x768) {
4488 TimingPoint = XGI_NTSC1024AdjTime;
4489 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004490 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304491 TimingPoint[j]);
4492 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004493 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304494 }
4495 }
4496
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004497 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304498 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004499 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004500 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304501 0x08); /* PALM Mode */
4502 }
4503
Peter Huewe599801f2012-02-09 21:11:45 +01004504 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004505 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304506 0x01);
4507 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004508 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304509
Aaro Koskinendc505562011-03-13 12:26:26 +02004510 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304511 }
4512
Peter Huewe599801f2012-02-09 21:11:45 +01004513 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304514 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004515 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304516 }
4517
4518 if (pVBInfo->VBInfo & SetCRT2ToTV)
4519 return;
4520}
4521
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004522static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304523 struct xgi_hw_device_info *HwDeviceExtension,
4524 unsigned short RefreshRateTableIndex,
4525 struct vb_device_info *pVBInfo)
4526{
4527 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4528 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4529
4530 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4531
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004532 /* si+Ext_ResInfo */
4533 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4534 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4535 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4536 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304537
4538 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4539 return;
4540
4541 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4542
4543 if (XGI_IsLCDDualLink(pVBInfo))
4544 tempbx = tempbx >> 1;
4545
4546 tempbx -= 1;
4547 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004548 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 temp = (tempbx & 0xFF00) >> 8;
4550 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004551 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304552 temp = 0x01;
4553
Aaro Koskinen8104e322011-03-13 12:26:22 +02004554 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304555 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4556 push1 = tempbx;
4557 tempbx--;
4558 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004559 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304560 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004561 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304562
4563 tempcx = pVBInfo->VT - 1;
4564 push2 = tempcx + 1;
4565 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004566 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304567 temp = (tempcx & 0xFF00) >> 8;
4568 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004569 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004570 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4571 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4572 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4573 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304574
4575 /* Customized LCDB Des no add */
4576 tempbx = 5;
4577 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
4578 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4579 tempah = pVBInfo->LCDResInfo;
4580 tempah &= PanelResInfo;
4581
Peter Huewe255aabd2012-02-09 21:11:44 +01004582 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304583 tempbx = 1024;
4584 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004585 } else if ((tempah == Panel_1280x1024) ||
4586 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304587 tempbx = 1280;
4588 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004589 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304590 tempbx = 1400;
4591 tempcx = 1050;
4592 } else {
4593 tempbx = 1600;
4594 tempcx = 1200;
4595 }
4596
4597 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4598 tempbx = pVBInfo->HDE;
4599 tempcx = pVBInfo->VDE;
4600 }
4601
4602 pushbx = tempbx;
4603 tempax = pVBInfo->VT;
4604 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4605 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4606 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4607 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4608 tempbx = pVBInfo->LCDVDES;
4609 tempcx += tempbx;
4610
4611 if (tempcx >= tempax)
4612 tempcx -= tempax; /* lcdvdes */
4613
4614 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004615 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304616 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004617 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304618 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4619 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4620 tempah = tempch;
4621 tempah = tempah << 3;
4622 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004623 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624
4625 /* getlcdsync() */
4626 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4627 tempcx = tempbx;
4628 tempax = pVBInfo->VT;
4629 tempbx = pVBInfo->LCDVRS;
4630
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304631 tempcx += tempbx;
4632 if (tempcx >= tempax)
4633 tempcx -= tempax;
4634
4635 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004636 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304637 temp = (tempbx & 0xFF00) >> 8;
4638 temp = temp << 4;
4639 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004640 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304641 tempcx = pushbx;
4642 tempax = pVBInfo->HT;
4643 tempbx = pVBInfo->LCDHDES;
4644 tempbx &= 0x0FFF;
4645
4646 if (XGI_IsLCDDualLink(pVBInfo)) {
4647 tempax = tempax >> 1;
4648 tempbx = tempbx >> 1;
4649 tempcx = tempcx >> 1;
4650 }
4651
Peter Huewe6896b942012-02-09 21:11:46 +01004652 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304653 tempbx += 1;
4654
4655 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4656 tempbx += 1;
4657
4658 tempcx += tempbx;
4659
4660 if (tempcx >= tempax)
4661 tempcx -= tempax;
4662
4663 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004664 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304665 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004666 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304667 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004668 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304669 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004670 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304671
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304672 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4673 tempcx = tempax;
4674 tempax = pVBInfo->HT;
4675 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304676 if (XGI_IsLCDDualLink(pVBInfo)) {
4677 tempax = tempax >> 1;
4678 tempbx = tempbx >> 1;
4679 tempcx = tempcx >> 1;
4680 }
4681
Peter Huewe6896b942012-02-09 21:11:46 +01004682 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304683 tempbx += 1;
4684
4685 tempcx += tempbx;
4686
4687 if (tempcx >= tempax)
4688 tempcx -= tempax;
4689
4690 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004691 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304692
4693 temp = (tempbx & 0xFF00) >> 8;
4694 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004695 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304696 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004697 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304698
Peter Huewea3d675c2012-02-09 21:11:47 +01004699 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304700 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004701 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4702 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304703 | VB_XGI301C)) {
4704 temp = 0xC6;
4705 } else
4706 temp = 0xC4;
4707
Aaro Koskinen8104e322011-03-13 12:26:22 +02004708 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4709 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 }
4711
4712 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004713 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4714 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304715 | VB_XGI301C)) {
4716 temp = 0x4F;
4717 } else
4718 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004719 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304720 }
4721 }
4722}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004723
4724/* --------------------------------------------------------------------- */
4725/* Function : XGI_GetTap4Ptr */
4726/* Input : */
4727/* Output : di -> Tap4 Reg. Setting Pointer */
4728/* Description : */
4729/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004730static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304731 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004732{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304733 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304735 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004736
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304737 if (tempcx == 0) {
4738 tempax = pVBInfo->VGAHDE;
4739 tempbx = pVBInfo->HDE;
4740 } else {
4741 tempax = pVBInfo->VGAVDE;
4742 tempbx = pVBInfo->VDE;
4743 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004744
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004745 if (tempax <= tempbx)
4746 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304747 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004748 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004749
Peter Huewe599801f2012-02-09 21:11:45 +01004750 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304751 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004752
Peter Huewe599801f2012-02-09 21:11:45 +01004753 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4754 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4755 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004756 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004757 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304758 Tap4TimingPtr = YPbPr750pTap4Timing;
4759 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004760
Peter Huewe599801f2012-02-09 21:11:45 +01004761 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004762 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304764 i = 0;
4765 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4766 if (Tap4TimingPtr[i].DE == tempax)
4767 break;
4768 i++;
4769 }
4770 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004771}
4772
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004773static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004774{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304775 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304779 if (!(pVBInfo->VBType & VB_XGI301C))
4780 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4783 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004784 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004786 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004787 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004788 /* Set Vertical Scaling */
4789 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304790 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004791 xgifb_reg_set(pVBInfo->Part2Port,
4792 i,
4793 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304794 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004795
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004796 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004797 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004798 /* Enable V.Scaling */
4799 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304800 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004801 /* Enable H.Scaling */
4802 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004803}
4804
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004805static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304806 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004807{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304808 unsigned short i;
4809 unsigned char *tempdi;
4810 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004811
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004812 /* si+Ext_ResInfo */
4813 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004814
Aaro Koskinen8104e322011-03-13 12:26:22 +02004815 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004816 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004817 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4818 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304819 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004820 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4821 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304822 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4825 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004826
Peter Huewe599801f2012-02-09 21:11:45 +01004827 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004828 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4829 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4830 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304831 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004832
Peter Huewe599801f2012-02-09 21:11:45 +01004833 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4834 & SetCRT2ToYPbPr525750)) {
4835 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304836 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304838 tempdi = pVBInfo->HiTVGroup3Data;
4839 if (pVBInfo->SetFlag & TVSimuMode) {
4840 tempdi = pVBInfo->HiTVGroup3Simu;
4841 if (!(modeflag & Charx8Dot))
4842 tempdi = pVBInfo->HiTVGroup3Text;
4843 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004844
Peter Huewe599801f2012-02-09 21:11:45 +01004845 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304846 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004847
Peter Huewe599801f2012-02-09 21:11:45 +01004848 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304849 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004852 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304854 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004855 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004856 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304857 }
4858 }
4859 return;
4860} /* {end of XGI_SetGroup3} */
4861
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004862static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304863 unsigned short RefreshRateTableIndex,
4864 struct xgi_hw_device_info *HwDeviceExtension,
4865 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004866{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304867 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304869 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004870
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004871 /* si+Ext_ResInfo */
4872 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304873 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004874 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304876 tempbx = pVBInfo->RVBHCMAX;
4877 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004878 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304879 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4880 tempcx = pVBInfo->VGAHT - 1;
4881 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004882 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004883
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304884 temp = ((tempcx & 0xFF00) >> 8) << 3;
4885 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304887 tempcx = pVBInfo->VGAVT - 1;
4888 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4889 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304891 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004892 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304893 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004894 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004895 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304896 tempcx = pVBInfo->VBInfo;
4897 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304899 if (modeflag & HalfDCLK)
4900 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 if (XGI_IsLCDDualLink(pVBInfo))
4903 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004904
Peter Huewe599801f2012-02-09 21:11:45 +01004905 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304906 temp = 0;
4907 if (tempbx <= 1024)
4908 temp = 0xA0;
4909 if (tempbx == 1280)
4910 temp = 0xC0;
4911 } else if (tempcx & SetCRT2ToTV) {
4912 temp = 0xA0;
4913 if (tempbx <= 800)
4914 temp = 0x80;
4915 } else {
4916 temp = 0x80;
4917 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4918 temp = 0;
4919 if (tempbx > 800)
4920 temp = 0x60;
4921 }
4922 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004923
Peter Huewe599801f2012-02-09 21:11:45 +01004924 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 temp = 0x00;
4926 if (pVBInfo->VGAHDE == 1280)
4927 temp = 0x40;
4928 if (pVBInfo->VGAHDE == 1024)
4929 temp = 0x20;
4930 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004931 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004932
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304933 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004934
Peter Huewe599801f2012-02-09 21:11:45 +01004935 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304936 if (!(temp & 0xE000))
4937 tempbx = tempbx >> 1;
4938 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004939
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304940 tempcx = pVBInfo->RVBHRS;
4941 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004942 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304944 tempeax = pVBInfo->VGAVDE;
4945 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004946
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304947 if (tempeax <= tempebx) {
4948 tempcx = (tempcx & (~0x4000));
4949 tempeax = pVBInfo->VGAVDE;
4950 } else {
4951 tempeax -= tempebx;
4952 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004953
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304954 templong = (tempeax * 256 * 1024) % tempebx;
4955 tempeax = (tempeax * 256 * 1024) / tempebx;
4956 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 if (templong != 0)
4959 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304961 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004962 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304964 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004965 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304966 tempbx = (unsigned short) (tempebx >> 16);
4967 temp = tempbx & 0x00FF;
4968 temp = temp << 4;
4969 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004970 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304972 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004973 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4974 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304975 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004976 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304977 tempax = pVBInfo->VGAHDE;
4978 if (modeflag & HalfDCLK)
4979 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304981 if (XGI_IsLCDDualLink(pVBInfo))
4982 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304984 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4985 if (tempax > 800)
4986 tempax -= 800;
4987 } else {
4988 if (pVBInfo->VGAHDE > 800) {
4989 if (pVBInfo->VGAHDE == 1024)
4990 tempax = (tempax * 25 / 32) - 1;
4991 else
4992 tempax = (tempax * 20 / 32) - 1;
4993 }
4994 }
4995 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304997 temp = (tempax & 0xFF00) >> 8;
4998 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004999 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305000 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005001 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005002
Peter Huewe599801f2012-02-09 21:11:45 +01005003 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305004 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005005 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005006
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305007 }
5008 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005009
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305010 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5011 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01005012 | TVSetYPbPr525p | TVSetYPbPr750p
5013 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305014 temp |= 0x0001;
5015 if ((pVBInfo->VBInfo & SetInSlaveMode)
5016 && (!(pVBInfo->TVInfo
5017 & TVSimuMode)))
5018 temp &= (~0x0001);
5019 }
5020 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005021
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005022 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305023 tempbx = pVBInfo->HT;
5024 if (XGI_IsLCDDualLink(pVBInfo))
5025 tempbx = tempbx >> 1;
5026 tempbx = (tempbx >> 1) - 2;
5027 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005028 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305029 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005030 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305031 }
5032 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005033
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305034 if (pVBInfo->ISXPDOS == 0)
5035 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5036 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005037}
5038
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005039static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5040{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005041 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005042}
5043
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005044static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305045 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005046{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305047 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005048
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305049 Pindex = pVBInfo->Part5Port;
5050 Pdata = pVBInfo->Part5Port + 1;
5051 if (pVBInfo->ModeType == ModeVGA) {
5052 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005053 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305054 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305055 }
5056 }
5057 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005058}
5059
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005060static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305061 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005062{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005063 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005064}
5065
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005066static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305067 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005068{
5069
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005070 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005071}
5072
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005073static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5074 unsigned short ModeNo, unsigned short ModeIdIndex,
5075 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005076{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005077 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005078
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005079 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005080 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5081 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5082 /* si+St_ModeFlag */
5083 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305085 if (!(modeflag & Charx8Dot)) {
5086 xres /= 9;
5087 xres *= 8;
5088 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005089
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005090 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5091 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005092
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005093 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5094 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005095
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005096 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305097 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005098
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005099 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305100 return 0;
5101
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005102 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5103 yres != xgifb_info->lvds_data.LVDSVDE) {
5104 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
5105 if (colordepth > 2)
5106 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305107 }
5108 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005109}
5110
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005111static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5112 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005113 unsigned short ModeNo,
5114 unsigned short ModeIdIndex,
5115 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005116{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305117 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005118 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305119 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5120 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5121 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005122
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005123 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005124 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305125 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005126 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005127
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005128 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005129
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005130 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005131 /* SR35[7] FP VSync polarity */
5132 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5133 /* SR30[5] FP HSync polarity */
5134 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005135
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005136 if (chip_id == XG27)
5137 XGI_SetXG27FPBits(pVBInfo);
5138 else
5139 XGI_SetXG21FPBits(pVBInfo);
5140
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005141 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005142 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5143 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5144 /* si+St_ModeFlag */
5145 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305147 if (!(modeflag & Charx8Dot))
5148 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005149
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005150 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005151
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005152 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005153
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305154 if (LVDSHBS > LVDSHT)
5155 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005156
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005157 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305158 if (LVDSHRS > LVDSHT)
5159 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005160
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005161 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 if (LVDSHRE > LVDSHT)
5163 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005164
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005165 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005166
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005167 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005168
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005169 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005170 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305171 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305173 if (LVDSVBS > LVDSVT)
5174 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005175
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005176 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305177 if (LVDSVRS > LVDSVT)
5178 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005179
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005180 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305181 if (LVDSVRE > LVDSVT)
5182 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005183
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005184 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005185
Aaro Koskinen58839b02011-03-13 12:26:23 +02005186 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005187 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305189 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005190 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305192 /* HT SR0B[1:0] CR00 */
5193 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005194 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005195 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305197 /* HBS SR0B[5:4] CR02 */
5198 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005199 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005200 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305202 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5203 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005204 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5205 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5206 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305208 /* HRS SR0B[7:6] CR04 */
5209 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005210 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005211 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005212
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305213 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5214 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005215 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005216 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005217
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305218 /* HRE SR0C[2] CR05[4:0] */
5219 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005220 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5221 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305223 /* Panel HRE SR2F[7:2] */
5224 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005225 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305227 /* VT SR0A[0] CR07[5][0] CR06 */
5228 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005229 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5230 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5231 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005232 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005233
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305234 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5235 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005236 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5237 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5238 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005239 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305241 /* VBE SR0A[4] CR16 */
5242 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005243 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005244 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005245
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305246 /* VRS SR0A[3] CR7[7][2] CR10 */
5247 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005248 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5249 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5250 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005251 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005252
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005253 if (chip_id == XG27) {
5254 /* Panel VRS SR35[2:0] SR34[7:0] */
5255 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5256 (value & 0x700) >> 8);
5257 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5258 } else {
5259 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5260 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5261 (value & 0x600) >> 9);
5262 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5263 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5264 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305266 /* VRE SR0A[5] CR11[3:0] */
5267 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005268 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5269 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305271 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005272 if (chip_id == XG27)
5273 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5274 (value << 2) & 0xFC);
5275 else
5276 /* SR3F[7] has to be 0, h/w bug */
5277 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5278 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305280 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005281
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005282 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005283 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005284 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005285 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005286 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305287 value += 0x10;
5288 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305290 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005291 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005292 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005293 /* set data, panning = 0, shift left 1 dot*/
5294 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005295
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005296 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005297 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305298
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005299 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305300 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005301
5302}
5303
5304/* --------------------------------------------------------------------- */
5305/* Function : XGI_IsLCDON */
5306/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005307/* Output : 0 : Skip PSC Control */
5308/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005309/* Description : */
5310/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005311static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005312{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305313 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005314
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305315 tempax = pVBInfo->VBInfo;
5316 if (tempax & SetCRT2ToDualEdge)
5317 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005318 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305319 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005320
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305321 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005322}
5323
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005324/* --------------------------------------------------------------------- */
5325/* Function : XGI_DisableChISLCD */
5326/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005327/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005328/* Description : */
5329/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005330static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005331{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305332 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305334 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005335 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305337 if (tempbx & (EnableChA | DisableChA)) {
5338 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5339 return 0;
5340 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305342 if (!(tempbx & (EnableChB | DisableChB)))
5343 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305345 if (tempah & 0x01) /* Chk LCDB Mode */
5346 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005347
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305348 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005349}
5350
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005351/* --------------------------------------------------------------------- */
5352/* Function : XGI_EnableChISLCD */
5353/* Input : */
5354/* Output : 0 -> Not LCD mode */
5355/* Description : */
5356/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005357static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005358{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305359 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005360
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305361 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005362 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305364 if (tempbx & (EnableChA | DisableChA)) {
5365 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5366 return 0;
5367 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305369 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005370 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005371
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305372 if (tempah & 0x01) /* Chk LCDB Mode */
5373 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305375 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005376}
5377
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005378static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5379 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305380 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005381{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005382 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005383
Peter Huewe6896b942012-02-09 21:11:46 +01005384 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5385 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305386 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005387 if (!(pVBInfo->VBInfo &
5388 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005389 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305390 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5391 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005392 if (!(pVBInfo->VBInfo &
5393 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005394 /* Disable Channel B */
5395 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305397 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005398 /* force to disable Cahnnel */
5399 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305401 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005402 /* Force to disable Channel B */
5403 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305404 }
5405 }
5406 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005407
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005408 /* disable part4_1f */
5409 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005410
Peter Huewe6896b942012-02-09 21:11:46 +01005411 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005412 if (((pVBInfo->VBInfo &
5413 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5414 || (XGI_DisableChISLCD(pVBInfo))
5415 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005416 /* LVDS Driver power down */
5417 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305418 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005419
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305420 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005421 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305422 | SetSimuScanMode))) {
5423 if (pVBInfo->SetFlag & GatingCRT)
5424 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005425 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305426 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005427
Peter Huewea3d675c2012-02-09 21:11:47 +01005428 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005430 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005431 /* Power down */
5432 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305433 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005434
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005435 /* disable TV as primary VGA swap */
5436 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305438 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005439 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005440
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005441 if ((pVBInfo->SetFlag & DisableChB) ||
5442 (pVBInfo->VBInfo &
5443 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005444 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005445 (pVBInfo->VBInfo &
5446 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005447 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005448
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005449 if ((pVBInfo->SetFlag & DisableChB) ||
5450 (pVBInfo->VBInfo &
5451 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005452 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005453 (pVBInfo->VBInfo &
5454 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5455 /* save Part1 index 0 */
5456 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5457 /* BTDAC = 1, avoid VB reset */
5458 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5459 /* disable CRT2 */
5460 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5461 /* restore Part1 index 0 */
5462 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463 }
5464 } else { /* {301} */
5465 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005466 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5467 /* Disable CRT2 */
5468 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5469 /* Disable TV asPrimary VGA swap */
5470 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305471 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005472
Peter Huewea3d675c2012-02-09 21:11:47 +01005473 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305474 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005475 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305476 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005477}
5478
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005479/* --------------------------------------------------------------------- */
5480/* Function : XGI_GetTVPtrIndex */
5481/* Input : */
5482/* Output : */
5483/* Description : bx 0 : ExtNTSC */
5484/* 1 : StNTSC */
5485/* 2 : ExtPAL */
5486/* 3 : StPAL */
5487/* 4 : ExtHiTV */
5488/* 5 : StHiTV */
5489/* 6 : Ext525i */
5490/* 7 : St525i */
5491/* 8 : Ext525p */
5492/* 9 : St525p */
5493/* A : Ext750p */
5494/* B : St750p */
5495/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005496static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005497{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305498 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005499
Peter Huewe599801f2012-02-09 21:11:45 +01005500 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305501 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005502 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305503 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005504 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305505 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005506 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305507 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005508 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305509 tempbx = 10;
5510 if (pVBInfo->TVInfo & TVSimuMode)
5511 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305513 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005514}
5515
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005516/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005517/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005518/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005519/* Output : bx 0 : NTSC */
5520/* 1 : PAL */
5521/* 2 : PALM */
5522/* 3 : PALN */
5523/* 4 : NTSC1024x768 */
5524/* 5 : PAL-M 1024x768 */
5525/* 6-7: reserved */
5526/* cl 0 : YFilter1 */
5527/* 1 : YFilter2 */
5528/* ch 0 : 301A */
5529/* 1 : 301B/302B/301LV/302LV */
5530/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005531/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005532static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5533 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005534{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005535 *tempbx = 0;
5536 *tempcl = 0;
5537 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005538
Peter Huewe599801f2012-02-09 21:11:45 +01005539 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005540 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005541
Peter Huewe599801f2012-02-09 21:11:45 +01005542 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005543 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005544
Peter Huewe599801f2012-02-09 21:11:45 +01005545 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005546 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005547
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005548 if (pVBInfo->TVInfo & NTSC1024x768) {
5549 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005550 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005551 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305552 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005553
Peter Huewe6896b942012-02-09 21:11:46 +01005554 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5555 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005556 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5557 & TVSimuMode)) {
5558 *tempbx += 8;
5559 *tempcl += 1;
5560 }
5561 }
5562
Peter Huewe6896b942012-02-09 21:11:46 +01005563 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5564 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005565 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005566}
5567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005568static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005569{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305570 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005571
Peter Huewe6896b942012-02-09 21:11:46 +01005572 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5573 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005574 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305575 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305576 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005577 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005578
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305579 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5580 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005581 if (pVBInfo->VBInfo &
5582 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005583 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005584
Peter Huewea3d675c2012-02-09 21:11:47 +01005585 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305586 tempbl = tempbh;
5587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305589 tempbl &= 0x0F;
5590 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005591 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305593 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5594 | SetCRT2ToTV)) { /* Channel B */
5595 tempah &= 0xF0;
5596 tempah |= tempbl;
5597 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005598
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005599 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5600 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 tempah &= 0x0F;
5602 tempah |= tempbh;
5603 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005604 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305605 }
5606 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5607 tempbl = 0;
5608 tempbh = 0;
5609 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005610 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305611 tempah &= 0x0f;
5612 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005613 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305614 tempah);
5615 }
5616 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005617}
5618
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005619static void XGI_SetLCDCap_A(unsigned short tempcx,
5620 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005621{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305622 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005623
Aaro Koskinen58839b02011-03-13 12:26:23 +02005624 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305626 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005627 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005628 /* Enable Dither */
5629 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005630 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305631 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005632 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305633 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005634 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005636}
5637
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005638/* --------------------------------------------------------------------- */
5639/* Function : XGI_SetLCDCap_B */
5640/* Input : cx -> LCD Capability */
5641/* Output : */
5642/* Description : */
5643/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005644static void XGI_SetLCDCap_B(unsigned short tempcx,
5645 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005646{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305647 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005648 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305649 (unsigned short) (((tempcx & 0x00ff) >> 6)
5650 | 0x0c));
5651 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005652 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305653 (unsigned short) (((tempcx & 0x00ff) >> 6)
5654 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005655}
5656
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005657static void XGI_LongWait(struct vb_device_info *pVBInfo)
5658{
5659 unsigned short i;
5660
5661 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5662
5663 if (!(i & 0xC0)) {
5664 for (i = 0; i < 0xFFFF; i++) {
5665 if (!(inb(pVBInfo->P3da) & 0x08))
5666 break;
5667 }
5668
5669 for (i = 0; i < 0xFFFF; i++) {
5670 if ((inb(pVBInfo->P3da) & 0x08))
5671 break;
5672 }
5673 }
5674}
5675
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005676static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005677{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305678 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005679
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305680 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005682 /* disable down spectrum D[4] */
5683 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305684 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005685 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305686 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005687
Aaro Koskinen8104e322011-03-13 12:26:22 +02005688 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305689 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005690 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305691 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005692 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305693 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005694 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305695 pVBInfo->LCDCapList[index].Spectrum_34);
5696 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005697 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005698}
5699
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005700static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5701{
5702 unsigned short tempcx;
5703
5704 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5705
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005706 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005707 (VB_SIS301B |
5708 VB_SIS302B |
5709 VB_SIS301LV |
5710 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005711 VB_XGI301C)) { /* 301LV/302LV only */
5712 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005713 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005714 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005715 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005716 (unsigned char) (tempcx & 0x1F));
5717 }
5718 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005719 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005720 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5721 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5722 | EnablePLLSPLOW)) >> 8));
5723 }
5724
Peter Huewe6896b942012-02-09 21:11:46 +01005725 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5726 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005727 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5728 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005729 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005730 XGI_SetLCDCap_A(tempcx, pVBInfo);
5731
Peter Huewe6896b942012-02-09 21:11:46 +01005732 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005733 if (tempcx & EnableSpectrum)
5734 SetSpectrum(pVBInfo);
5735 }
5736 } else {
5737 /* LVDS,CH7017 */
5738 XGI_SetLCDCap_A(tempcx, pVBInfo);
5739 }
5740}
5741
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005742/* --------------------------------------------------------------------- */
5743/* Function : XGI_SetAntiFlicker */
5744/* Input : */
5745/* Output : */
5746/* Description : Set TV Customized Param. */
5747/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005748static void XGI_SetAntiFlicker(unsigned short ModeNo,
5749 unsigned short ModeIdIndex,
5750 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005751{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005752 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005753
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305754 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005755
Peter Huewe599801f2012-02-09 21:11:45 +01005756 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305757 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305759 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5760 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305761 tempah = TVAntiFlickList[tempbx];
5762 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005763
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005764 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005765}
5766
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005767static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5768 unsigned short ModeIdIndex,
5769 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005770{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005771 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305773 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305775 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5776 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305777 tempah = TVEdgeList[tempbx];
5778 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005779
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005780 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005781}
5782
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005783static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005784{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305785 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305787 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305791 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5792 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005793
Aaro Koskinen8104e322011-03-13 12:26:22 +02005794 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305795 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005796 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305797 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005798 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305799 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005800 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305801 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005802}
5803
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005804static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305805 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005806{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305807 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305809 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005810
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305811 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305813 switch (tempbx) {
5814 case 0x00:
5815 case 0x04:
5816 filterPtr = NTSCYFilter1;
5817 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305819 case 0x01:
5820 filterPtr = PALYFilter1;
5821 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305823 case 0x02:
5824 case 0x05:
5825 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305826 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005827 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305828 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305830 case 0x08:
5831 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305832 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305833 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305834 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005835 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305836 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305838 default:
5839 return;
5840 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005841
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005842 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305843 if (tempcl == 0)
5844 index = tempal * 4;
5845 else
5846 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005847
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005849 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5850 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5851 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5852 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305853 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005854 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5855 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5856 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5857 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305858 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005859
Peter Huewe6896b942012-02-09 21:11:46 +01005860 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5861 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005862 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5863 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5864 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866}
5867
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005868/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005869/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005870/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005871/* Output : */
5872/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005873/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005874static void XGI_OEM310Setting(unsigned short ModeNo,
5875 unsigned short ModeIdIndex,
5876 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005877{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005878 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005879
Peter Huewea3d675c2012-02-09 21:11:47 +01005880 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005881 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005882
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005883 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005884 XGI_SetPhaseIncr(pVBInfo);
5885 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5886 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005887
Peter Huewe6896b942012-02-09 21:11:46 +01005888 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005889 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305890 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005891}
5892
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005893/* --------------------------------------------------------------------- */
5894/* Function : XGI_SetCRT2ModeRegs */
5895/* Input : */
5896/* Output : */
5897/* Description : Origin code for crt2group */
5898/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005899static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305900 struct xgi_hw_device_info *HwDeviceExtension,
5901 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005902{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305903 unsigned short tempbl;
5904 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305906 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305908 tempah = 0;
5909 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005910 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305911 tempah &= ~0x10; /* BTRAMDAC */
5912 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305914 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5915 | SetCRT2ToLCD)) {
5916 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005917 tempcl = pVBInfo->ModeType;
5918 tempcl -= ModeVGA;
5919 if (tempcl >= 0) {
5920 /* BT Color */
5921 tempah = (0x008 >> tempcl);
5922 if (tempah == 0)
5923 tempah = 1;
5924 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305925 }
5926 if (pVBInfo->VBInfo & SetInSlaveMode)
5927 tempah ^= 0x50; /* BTDAC */
5928 }
5929 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005930
Aaro Koskinen8104e322011-03-13 12:26:22 +02005931 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305932 tempah = 0x08;
5933 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005934
Miguel Gómeze123e462012-07-06 12:40:52 +02005935 if (pVBInfo->VBInfo & DisableCRT2Display)
5936 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005937
Miguel Gómeze123e462012-07-06 12:40:52 +02005938 tempah = 0x00;
5939 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005940
Miguel Gómeze123e462012-07-06 12:40:52 +02005941 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5942 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5943 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005944
Miguel Gómeze123e462012-07-06 12:40:52 +02005945 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5946 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5947 tempbl &= 0xf7;
5948 tempah |= 0x01;
5949 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305950 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005951
Miguel Gómeze123e462012-07-06 12:40:52 +02005952 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5953 tempbl &= 0xf7;
5954 tempah |= 0x01;
5955 }
5956
5957 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5958 goto reg_and_or;
5959
5960 tempbl &= 0xf8;
5961 tempah = 0x01;
5962
5963 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5964 tempah |= 0x02;
5965
5966 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5967 tempah = tempah ^ 0x05;
5968 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5969 tempah = tempah ^ 0x01;
5970 }
5971
5972 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5973 tempah |= 0x08;
5974
5975reg_and_or:
5976 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305978 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005979 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305980 tempah &= (~0x08);
5981 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5982 & SetInSlaveMode))) {
5983 tempah |= 0x010;
5984 }
5985 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305987 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305988 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005989 if (pVBInfo->VBInfo & DriverMode)
5990 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305991 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005993 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305994 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305996 if (pVBInfo->LCDInfo & SetLCDDualLink)
5997 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305999 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306000 if (pVBInfo->TVInfo & RPLLDIV2XO)
6001 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306002 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006003
Peter Huewe255aabd2012-02-09 21:11:44 +01006004 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
6005 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306006 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006007
Peter Huewe255aabd2012-02-09 21:11:44 +01006008 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306009 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006010
Aaro Koskinen8104e322011-03-13 12:26:22 +02006011 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306012 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006013
Peter Huewe6896b942012-02-09 21:11:46 +01006014 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6015 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306016 tempah = 0;
6017 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006018
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306019 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6020 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01006021 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306022 tempah |= 0x04; /* shampoo 0129 */
6023 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006024
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006025 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306026 tempah = 0x00;
6027 tempbl = 0xcf;
6028 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6029 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6030 tempah |= 0x30;
6031 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006032
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006033 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306034 tempah = 0;
6035 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306037 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6038 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6039 tempah |= 0xc0;
6040 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006041 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306042 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006043
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306044 tempah = 0;
6045 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01006046 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306047 tempbl = 0xff;
6048 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6049 tempah |= 0x80;
6050 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006051
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006052 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Peter Huewe6896b942012-02-09 21:11:46 +01006054 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306055 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006056 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6057 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306058 }
6059 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006060}
6061
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306063void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6064 struct vb_device_info *pVBInfo)
6065{
6066
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006067 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006068
6069}
6070
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306071void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6072 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006073{
6074
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006075 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006076
6077}
6078
Bill Pemberton80adad82010-06-17 13:10:51 -04006079unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006080{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306081 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306083 if (pVBInfo->IF_DEF_LVDS == 1) {
6084 return 1;
6085 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006086 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306087 if ((flag == 1) || (flag == 2))
6088 return 1; /* 301b */
6089 else
6090 return 0;
6091 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006092}
6093
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006094unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6095 unsigned short ModeNo, unsigned short ModeIdIndex,
6096 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006097{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006098 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6099 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6100 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006101
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006102 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006103
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006104 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006105
Aaro Koskinen58839b02011-03-13 12:26:23 +02006106 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006107 index = index >> pVBInfo->SelectCRT2Rate;
6108 index &= 0x0F;
6109
6110 if (pVBInfo->LCDInfo & LCDNonExpanding)
6111 index = 0;
6112
6113 if (index > 0)
6114 index--;
6115
6116 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006117 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006118 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006119 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6120 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006121 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006122 /* 301b */
6123 temp = LCDARefreshIndex[
6124 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006125 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006126 temp = LCDRefreshIndex[
6127 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006128
6129 if (index > temp)
6130 index = temp;
6131 } else {
6132 index = 0;
6133 }
6134 }
6135 }
6136
6137 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6138 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6139 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006140 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6141 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006142 index++;
6143 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006144 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006145 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6146 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006147 index++;
6148 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006149 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6150 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006151 index++;
6152 }
6153 }
6154
6155 i = 0;
6156 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006157 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6158 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006159 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006160 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6161 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006162 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006163 if (temp < pVBInfo->ModeType)
6164 break;
6165 i++;
6166 index--;
6167
6168 } while (index != 0xFFFF);
6169 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6170 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006171 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6172 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006173 if (temp & InterlaceMode)
6174 i++;
6175 }
6176 }
6177 i--;
6178 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
6179 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
6180 RefreshRateTableIndex, &i, pVBInfo);
6181 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02006182 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006183}
6184
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006185static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306186 struct xgi_hw_device_info *HwDeviceExtension,
6187 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006188{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006189 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006190
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006191 pVBInfo->SetFlag |= ProgrammingCRT2;
6192 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6193 ModeIdIndex, pVBInfo);
6194 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6195 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6196 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6197 HwDeviceExtension, pVBInfo);
6198 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6199 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006200}
6201
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006202static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006203 struct xgi_hw_device_info *HwDeviceExtension,
6204 struct vb_device_info *pVBInfo)
6205{
6206 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6207
6208 tempbx = pVBInfo->VBInfo;
6209 pVBInfo->SetFlag |= ProgrammingCRT2;
6210 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6211 pVBInfo->SelectCRT2Rate = 4;
6212 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6213 ModeIdIndex, pVBInfo);
6214 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6215 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6216 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6217 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6218 RefreshRateTableIndex, pVBInfo);
6219 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6220 RefreshRateTableIndex, pVBInfo);
6221 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6222 RefreshRateTableIndex, pVBInfo);
6223 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6224 HwDeviceExtension, pVBInfo);
6225 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6226 RefreshRateTableIndex, pVBInfo);
6227 XGI_SetTap4Regs(pVBInfo);
6228 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6229 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6230 HwDeviceExtension, pVBInfo);
6231 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6232 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6233 XGI_AutoThreshold(pVBInfo);
6234 return 1;
6235}
6236
6237void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6238{
6239 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6240 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6241 0x05, 0x00 };
6242
6243 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6244
6245 unsigned char CR17, CR63, SR31;
6246 unsigned short temp;
6247 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6248
6249 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006250 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006251
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006252 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006253 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006254 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006255 pVBInfo->P3d4, 0x53) | 0x02));
6256
Aaro Koskinen58839b02011-03-13 12:26:23 +02006257 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6258 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6259 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006260
Aaro Koskinen8104e322011-03-13 12:26:22 +02006261 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6262 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006263
Aaro Koskinen58839b02011-03-13 12:26:23 +02006264 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006265 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006266
Aaro Koskinen58839b02011-03-13 12:26:23 +02006267 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006268 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006269
Aaro Koskinen58839b02011-03-13 12:26:23 +02006270 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006271 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006272 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006273 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006274
Aaro Koskinen8104e322011-03-13 12:26:22 +02006275 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006276
6277 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006278 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006279
6280 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006281 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006282 CRTCData[i]);
6283
6284 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006285 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006286 CRTCData[i]);
6287
6288 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006289 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006290 CRTCData[i]);
6291
Aaro Koskinen8104e322011-03-13 12:26:22 +02006292 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006293 & 0xE0));
6294
Aaro Koskinen8104e322011-03-13 12:26:22 +02006295 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6296 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6297 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006298
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006299 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006300
6301 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006302 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6303 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6304 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006305 }
6306
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006307 mdelay(1);
6308
6309 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006310 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006311
6312 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006313 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006314 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006315 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006316
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006317 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006318 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006319
6320 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006321 outb(0, (pVBInfo->P3c8 + 1));
6322 outb(0, (pVBInfo->P3c8 + 1));
6323 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006324 }
6325
Aaro Koskinen8104e322011-03-13 12:26:22 +02006326 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6327 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6328 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006329
Aaro Koskinen58839b02011-03-13 12:26:23 +02006330 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006331 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006332 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006333}
6334
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006335static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6336 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006337 struct vb_device_info *pVBInfo)
6338{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006339 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006340
Peter Huewe6896b942012-02-09 21:11:46 +01006341 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6342 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006343 if (!(pVBInfo->SetFlag & DisableChA)) {
6344 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006345 /* Power on */
6346 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006347 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006348 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6349 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006350 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006351 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006352 }
6353 }
6354 }
6355
6356 if (!(pVBInfo->SetFlag & DisableChB)) {
6357 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6358 & (SetCRT2ToLCD | SetCRT2ToTV
6359 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006360 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006361 pVBInfo->P3c4, 0x32);
6362 tempah &= 0xDF;
6363 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006364 if (!(pVBInfo->VBInfo &
6365 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006366 tempah |= 0x20;
6367 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006368 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006369 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006370
Aaro Koskinen58839b02011-03-13 12:26:23 +02006371 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006372 pVBInfo->Part1Port, 0x2E);
6373
6374 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006375 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006376 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006377 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006378 }
6379 }
6380
6381 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6382 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006383 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006384 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006385 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006386 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006387 if (XGI_EnableChISLCD(pVBInfo) ||
6388 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006389 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006390 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006391 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006392 pVBInfo->Part4Port,
6393 0x2A,
6394 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006395 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006396 /* LVDS Driver power on */
6397 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006398 }
6399 }
6400
6401 tempah = 0x00;
6402
6403 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6404 tempah = 0xc0;
6405
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006406 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6407 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6408 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6409 tempah = tempah & 0x40;
6410 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6411 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006412
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006413 if (pVBInfo->SetFlag & DisableChB)
6414 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006415
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006416 if (pVBInfo->SetFlag & DisableChA)
6417 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006418
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006419 if (pVBInfo->SetFlag & EnableChB)
6420 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006421
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006422 if (pVBInfo->SetFlag & EnableChA)
6423 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006424 }
6425 }
6426
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006427 /* EnablePart4_1F */
6428 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006429
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006430 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006431 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006432 XGI_DisableGatingCRT(HwDeviceExtension,
6433 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006434 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6435 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006436 }
6437 }
6438 } /* 301 */
6439 else { /* LVDS */
6440 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006441 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006442 /* enable CRT2 */
6443 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006444
Aaro Koskinen58839b02011-03-13 12:26:23 +02006445 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006446 0x2E);
6447 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006448 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006449
Aaro Koskinendc505562011-03-13 12:26:26 +02006450 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006451 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006452 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006453}
6454
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006455static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6456 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006457 unsigned short ModeNo, unsigned short ModeIdIndex,
6458 struct vb_device_info *pVBInfo)
6459{
Aaro Koskinena1579612012-04-07 01:14:05 +03006460 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006461
Aaro Koskinena1579612012-04-07 01:14:05 +03006462 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006463 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006464 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6465 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6466 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006467 XGI_ClearExt1Regs(pVBInfo);
6468
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006469 if (HwDeviceExtension->jChipType == XG27) {
6470 if (pVBInfo->IF_DEF_LVDS == 0)
6471 XGI_SetDefaultVCLK(pVBInfo);
6472 }
6473
6474 temp = ~ProgrammingCRT2;
6475 pVBInfo->SetFlag &= temp;
6476 pVBInfo->SelectCRT2Rate = 0;
6477
Peter Huewe6896b942012-02-09 21:11:46 +01006478 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6479 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006480 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006481 | SetInSlaveMode)) {
6482 pVBInfo->SetFlag |= ProgrammingCRT2;
6483 }
6484 }
6485
6486 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6487 ModeIdIndex, pVBInfo);
6488 if (RefreshRateTableIndex != 0xFFFF) {
6489 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6490 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6491 pVBInfo, HwDeviceExtension);
6492 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6493 RefreshRateTableIndex, pVBInfo);
6494 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6495 HwDeviceExtension, pVBInfo);
6496 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6497 RefreshRateTableIndex, pVBInfo);
6498 }
6499
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006500 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006501 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006502 if (temp & 0xA0) {
6503
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006504 if (HwDeviceExtension->jChipType == XG27)
6505 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6506 RefreshRateTableIndex, pVBInfo);
6507 else
6508 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6509 RefreshRateTableIndex, pVBInfo);
6510
6511 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6512 RefreshRateTableIndex);
6513
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006514 xgifb_set_lcd(HwDeviceExtension->jChipType,
6515 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006516
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006517 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006518 xgifb_set_lvds(xgifb_info,
6519 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006520 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006521 }
6522 }
6523
6524 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6525 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6526 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6527 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006528 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006529}
6530
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006531unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6532 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006533 unsigned short ModeNo)
6534{
6535 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006536 struct vb_device_info VBINF;
6537 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006538 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006539 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006540
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006541 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006542 pVBInfo->IF_DEF_YPbPr = 0;
6543 pVBInfo->IF_DEF_HiVision = 0;
6544 pVBInfo->IF_DEF_CRT2Monitor = 0;
6545 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006546 } else {
6547 pVBInfo->IF_DEF_YPbPr = 1;
6548 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006549 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006550 }
6551
6552 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6553 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6554 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6555 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6556 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6557 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6558 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6559 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6560 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6561 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6562 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6563 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6564 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006565 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6566 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6567 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6568 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6569 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006570
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006571 /* for x86 Linux, XG21 LVDS */
6572 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006573 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006574 pVBInfo->IF_DEF_LVDS = 1;
6575 }
6576 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006577 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6578 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006579 pVBInfo->IF_DEF_LVDS = 1;
6580 }
6581 }
6582
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006583 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006584 XGI_GetVBType(pVBInfo);
6585
6586 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006587 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006588 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006589 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006590
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006591 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006592 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6593
6594 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6595
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006596 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006597 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6598 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6599 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006600 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006601
Peter Huewea3d675c2012-02-09 21:11:47 +01006602 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006603 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006604 ModeIdIndex, pVBInfo);
6605
Peter Huewea3d675c2012-02-09 21:11:47 +01006606 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006607 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6608 HwDeviceExtension, pVBInfo);
6609 }
6610 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01006611 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006612 XGI_SetCRT1Group(xgifb_info,
6613 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006614 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006615 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006616 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6617 HwDeviceExtension,
6618 pVBInfo);
6619 }
6620 }
6621 }
6622
Peter Huewe6896b942012-02-09 21:11:46 +01006623 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006624 switch (HwDeviceExtension->ujVBChipID) {
6625 case VB_CHIP_301:
6626 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6627 pVBInfo); /*add for CRT2 */
6628 break;
6629
6630 case VB_CHIP_302:
6631 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6632 pVBInfo); /*add for CRT2 */
6633 break;
6634
6635 default:
6636 break;
6637 }
6638 }
6639
6640 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6641 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006642 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006643 } /* !XG20 */
6644 else {
6645 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006646 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006647 ModeIdIndex,
6648 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006649 return 0;
6650
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006651 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006652 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006653
6654 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006655 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006656
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006657 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006658
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006659 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6660 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006661
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006662 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006663 }
6664
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006665 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6666
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006667 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006668 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006669
6670 return 1;
6671}