blob: 01a3ef394ba0f897882050d5ad9973e1575336f3 [file] [log] [blame]
Aaro Koskinend80aaa02011-02-17 23:29:14 +02001#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_util.h"
6#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02007#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020010#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
Aaro Koskinen624554d2011-10-11 21:47:35 +030012static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040013 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020023
Bill Pemberton80adad82010-06-17 13:10:51 -040024void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020025{
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030026 pVBInfo->StandTable = (struct SiS_StandTable_S *) &XGI330_StandTable;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053027 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
28 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
29 pVBInfo->XGINEWUB_CRT1Table
30 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031
Peter Huewefc39dcb2012-01-15 19:22:12 +010032 pVBInfo->MCLKData = (struct SiS_MCLKData *) XGI340New_MCLKData;
Aaro Koskinen06587332011-03-13 12:26:10 +020033 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Peter Huewefc39dcb2012-01-15 19:22:12 +010034 pVBInfo->VCLKData = (struct SiS_VCLKData *) XGI_VCLKData;
35 pVBInfo->VBVCLKData = (struct SiS_VBVCLKData *) XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053036 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Peter Huewefc39dcb2012-01-15 19:22:12 +010037 pVBInfo->StResInfo = (struct SiS_StResInfo_S *) XGI330_StResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053038 pVBInfo->ModeResInfo
Peter Huewefc39dcb2012-01-15 19:22:12 +010039 = (struct SiS_ModeResInfo_S *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053041 pVBInfo->LCDResInfo = 0;
42 pVBInfo->LCDTypeInfo = 0;
43 pVBInfo->LCDInfo = 0;
44 pVBInfo->VBInfo = 0;
45 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 pVBInfo->SR15 = XGI340_SR13;
48 pVBInfo->CR40 = XGI340_cr41;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053049 pVBInfo->CR6B = XGI340_CR6B;
50 pVBInfo->CR6E = XGI340_CR6E;
51 pVBInfo->CR6F = XGI340_CR6F;
52 pVBInfo->CR89 = XGI340_CR89;
53 pVBInfo->AGPReg = XGI340_AGPReg;
54 pVBInfo->SR16 = XGI340_SR16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020055
Peter Huewe6d12dae2012-06-14 00:21:52 +020056 pVBInfo->SR21 = 0xa3;
57 pVBInfo->SR22 = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053059 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
60 pVBInfo->PALTiming = XGI330_PALTiming;
61 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
62 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
63 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
64 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
65 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
66 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
67 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
68 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
69 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
70 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
71 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
72 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053074 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
75 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
76 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053078 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010079 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053080 pVBInfo->LCDCapList = XGI_LCDDLCapList;
81 else
82 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053084 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020085 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053087 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040088 unsigned char temp;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053089 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +010090 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053091 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020092 pVBInfo->XGINew_CR97 = 0xc1;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040093 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040095 /*Z11m DDR*/
96 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
97 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
98 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020099 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
102}
103
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800104static void XGI_SetSeqRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800105 unsigned short ModeIdIndex,
106 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200107{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530108 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200110
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300111 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200112
Aaro Koskinen8104e322011-03-13 12:26:22 +0200113 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300114 tempah = pVBInfo->StandTable->SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200115
Peter Huewea3d675c2012-02-09 21:11:47 +0100116 i = XGI_SetCRT2ToLCDA;
117 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530118 tempah |= 0x01;
119 } else {
120 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
121 if (pVBInfo->VBInfo & SetInSlaveMode)
122 tempah |= 0x01;
123 }
124 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200127 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530129 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800130 /* Get SR2,3,4 from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300131 SRdata = pVBInfo->StandTable->SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200132 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200134}
135
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200136static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800137 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200138{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530139 unsigned char CRTCdata;
140 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200141
Aaro Koskinen58839b02011-03-13 12:26:23 +0200142 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530143 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200144 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530146 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800147 /* Get CRTC from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300148 CRTCdata = pVBInfo->StandTable->CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200149 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200151}
152
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800153static void XGI_SetATTRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800154 unsigned short ModeIdIndex,
155 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200156{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530157 unsigned char ARdata;
158 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200159
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300160 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530162 for (i = 0; i <= 0x13; i++) {
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300163 ARdata = pVBInfo->StandTable->ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200164
165 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
166 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
167 ARdata = 0;
168 } else {
169 if ((pVBInfo->VBInfo &
170 (SetCRT2ToTV | SetCRT2ToLCD)) &&
171 (pVBInfo->VBInfo & SetInSlaveMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530172 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 }
174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200176 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200177 outb(i, pVBInfo->P3c0); /* set index */
178 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200181 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200182 outb(0x14, pVBInfo->P3c0); /* set index */
183 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200184 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200185 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186}
187
Aaro Koskinena1579612012-04-07 01:14:05 +0300188static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200189{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530190 unsigned char GRdata;
191 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530193 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800194 /* Get GR from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300195 GRdata = pVBInfo->StandTable->GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200196 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530197 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530199 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200200 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530201 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200202 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530203 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200204}
205
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200206static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530210 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200211 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212}
213
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200214static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200215{
216
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200217 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200218 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
219 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200221 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200222 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
223 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200224
Aaro Koskinendc505562011-03-13 12:26:26 +0200225 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530226 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227}
228
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200229static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530230 unsigned short ModeIdIndex,
231 unsigned short RefreshRateTableIndex, unsigned short *i,
232 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200233{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530234 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300236 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530237 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
238 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
239 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530241 if (pVBInfo->IF_DEF_LVDS == 0) {
242 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
243 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530245 if (pVBInfo->VBType & VB_XGI301C)
246 tempax |= SupportCRT2in301C;
247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800249 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100250 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530251 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200252
Miguel Gómez3b175622012-07-06 12:40:46 +0200253 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
254 pVBInfo->LCDResInfo != Panel_1280x960 &&
255 (pVBInfo->LCDInfo & LCDNonExpanding) &&
256 resinfo >= 9)
257 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530258 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200259
Peter Huewe599801f2012-02-09 21:11:45 +0100260 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Peter Huewe6896b942012-02-09 21:11:46 +0100261 if ((pVBInfo->VBType & VB_SIS301LV) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800262 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100263 tempax |= SupportYPbPr750p;
Miguel Gómez3b175622012-07-06 12:40:46 +0200264 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
265 ((resinfo == 3) ||
266 (resinfo == 4) ||
267 (resinfo > 7)))
268 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530269 } else {
Peter Huewe6896b942012-02-09 21:11:46 +0100270 tempax |= SupportHiVision;
Miguel Gómez3b175622012-07-06 12:40:46 +0200271 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
272 ((resinfo == 4) ||
273 (resinfo == 3 &&
274 (pVBInfo->SetFlag & TVSimuMode)) ||
275 (resinfo > 7)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530276 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530277 }
278 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800279 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
280 SetCRT2ToSVIDEO |
281 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100282 SetCRT2ToYPbPr525750 |
283 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530284 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200285
Miguel Gómez3b175622012-07-06 12:40:46 +0200286 if (pVBInfo->VBType & (VB_SIS301B |
287 VB_SIS302B |
288 VB_SIS301LV |
289 VB_SIS302LV |
290 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530291 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292
Miguel Gómez3b175622012-07-06 12:40:46 +0200293 if (!(pVBInfo->VBInfo & TVSetPAL) &&
294 (modeflag & NoSupportSimuTV) &&
295 (pVBInfo->VBInfo & SetInSlaveMode) &&
296 (!(pVBInfo->VBInfo & SetNotSimuMode)))
297 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530298 }
299 }
300 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
302 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530304 if (resinfo > 0x08)
305 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200306
Peter Huewe255aabd2012-02-09 21:11:44 +0100307 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530308 if (resinfo > 0x07)
309 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200310
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530311 if (resinfo == 0x04)
312 return 0; /* 512x384 */
313 }
314 }
315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200316
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800317 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
318 tempbx; (*i)--) {
319 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
320 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 if (infoflag & tempax)
322 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530324 if ((*i) == 0)
325 break;
326 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530328 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800329 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
330 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530331 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
332 != tempbx) {
333 return 0;
334 }
335
336 if (infoflag & tempax)
337 return 1;
338 }
339 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200340}
341
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200342static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530343 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200344{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200346
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800347 /* di+0x00 */
348 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530349 sync &= 0xC0;
350 temp = 0x2F;
351 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200352 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353}
354
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200355static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200357{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530358 unsigned char data, data1, pushax;
359 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200360
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800361 /* unlock cr0-7 */
362 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530363 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200364 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530366 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200367 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530369 for (i = 0x01; i <= 0x04; i++) {
370 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200371 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530372 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530374 for (i = 0x05; i <= 0x06; i++) {
375 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200376 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530377 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200378
Aaro Koskinen58839b02011-03-13 12:26:23 +0200379 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530380 j &= 0x1F;
381 data = pVBInfo->TimingH[0].data[7];
382 data &= 0xE0;
383 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200384 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200387 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530388 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200389 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200390 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530391 data1 = data;
392 data1 &= 0xE0;
393 data &= 0x1F;
394 if (data == 0) {
395 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200396 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530397 0x0c);
398 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200399 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 data = pushax;
401 }
402 data = data - 1;
403 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200404 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200405 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 data = data >> 5;
407 data = data + 3;
408 if (data > 7)
409 data = data - 7;
410 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200411 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413}
414
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800415static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
416 unsigned short ModeNo,
417 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200418{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530419 unsigned char data;
420 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 for (i = 0x00; i <= 0x01; i++) {
423 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530427 for (i = 0x02; i <= 0x03; i++) {
428 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200429 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530430 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530432 for (i = 0x04; i <= 0x05; i++) {
433 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200434 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530435 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200436
Aaro Koskinen58839b02011-03-13 12:26:23 +0200437 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530438 j &= 0xC0;
439 data = pVBInfo->TimingV[0].data[6];
440 data &= 0x3F;
441 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200442 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530444 data = pVBInfo->TimingV[0].data[6];
445 data &= 0x80;
446 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200447
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300448 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530449 i &= DoubleScanMode;
450 if (i)
451 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200452
Aaro Koskinen58839b02011-03-13 12:26:23 +0200453 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530454 j &= 0x5F;
455 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200456 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200457}
458
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200459static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
460 unsigned short RefreshRateTableIndex,
461 struct vb_device_info *pVBInfo,
462 struct xgi_hw_device_info *HwDeviceExtension)
463{
464 unsigned char index, data;
465 unsigned short i;
466
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800467 /* Get index */
468 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200469 index = index & IndexMask;
470
Aaro Koskinen58839b02011-03-13 12:26:23 +0200471 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200472 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200473 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200474
475 for (i = 0; i < 8; i++)
476 pVBInfo->TimingH[0].data[i]
477 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
478
479 for (i = 0; i < 7; i++)
480 pVBInfo->TimingV[0].data[i]
481 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
482
483 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
484
485 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
486
487 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200488 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200489}
490
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200491/* --------------------------------------------------------------------- */
492/* Function : XGI_SetXG21CRTC */
493/* Input : Stand or enhance CRTC table */
494/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
495/* Description : Set LCD timing */
496/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200497static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530498 unsigned short RefreshRateTableIndex,
499 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300501 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530502 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200503
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300504 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
505 /* Tempax: CR4 HRS */
506 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
507 Tempcx = Tempax; /* Tempcx: HRS */
508 /* SR2E[7:0]->HRS */
509 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200510
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300511 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
512 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
513 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
514 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
515 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800516
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300517 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
518 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200519
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300520 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
521 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
522 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
523 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300525 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
526 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200527
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300528 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
529 if (Tempax < Tempcx) /* HRE < HRS */
530 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200531
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300532 Temp2 &= 0xFF;
533 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
534 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
535 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
536 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
537 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
538 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
539 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200540
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300541 /* CR10 VRS */
542 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
543 Tempbx = Tempax; /* Tempbx: VRS */
544 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
545 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
546 /* CR7[2][7] VRE */
547 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
548 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
549 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
550 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
551 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
552 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200553
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300554 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
555 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
556 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
557 Tempax &= 0x80;
558 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
559 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
560 /* Tempax: SRA */
561 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
562 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
563 Temp2 = Tempax;
564 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
565 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300567 /* Tempax: CR11 VRE */
568 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
569 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
570 /* Tempbx: SRA */
571 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
572 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
573 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
574 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
575 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
576 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200577
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300578 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
579 if (Tempax < Temp3) /* VRE < VRS */
580 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200581
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300582 Temp2 &= 0xFF;
583 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
584 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
585 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
586 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
587 Tempbx = (unsigned char) Temp1;
588 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
589 Tempax &= 0x7F;
590 /* SR3F D[7:2]->VRE D[1:0]->VRS */
591 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200592}
593
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800594static void XGI_SetXG27CRTC(unsigned short ModeNo,
595 unsigned short ModeIdIndex,
596 unsigned short RefreshRateTableIndex,
597 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200598{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300599 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200600
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300601 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
602 /* Tempax: CR4 HRS */
603 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
604 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
605 /* SR2E[7:0]->HRS */
606 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200607
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300608 /* SR0B */
609 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
610 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
611 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200612
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300613 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
614 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
615 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200616
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300617 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
618 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
619 Tempax <<= 3; /* Tempax[5]: HRE[5] */
620 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200621
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300622 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
623 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200624
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300625 /* Tempax: CR4 HRS */
626 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
627 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
628 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
629 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200630
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300631 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
632 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
633 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
634 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
635 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
636 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
637 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300639 /* CR10 VRS */
640 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
641 /* SR34[7:0]->VRS[7:0] */
642 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200643
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300644 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
645 /* CR7[7][2] VRS[9][8] */
646 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
647 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
648 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
649 Tempax >>= 2; /* Tempax[0]: VRS[8] */
650 /* SR35[0]: VRS[8] */
651 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
652 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
653 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
654 /* Tempax: SR0A */
655 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
656 Tempax &= 0x08; /* SR0A[3] VRS[10] */
657 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200658
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300659 /* Tempax: CR11 VRE */
660 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
661 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
662 /* Tempbx: SR0A */
663 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
664 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
665 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
666 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
667 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
668 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
669 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200670
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300671 if (Tempbx <= Tempcx) /* VRE <= VRS */
672 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200673
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300674 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
675 Tempax = (Tempbx << 2) & 0xFF;
676 /* SR3F[7:2]:VRE[5:0] */
677 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
678 Tempax = Tempcx >> 8;
679 /* SR35[2:0]:VRS[10:8] */
680 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200681}
682
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200683static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
684{
685 unsigned char temp;
686
687 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
688 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
689 temp = (temp & 3) << 6;
690 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
691 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
692 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
693 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
694
695}
696
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300697static void xgifb_set_lcd(int chip_id,
698 struct vb_device_info *pVBInfo,
699 unsigned short RefreshRateTableIndex,
700 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200701{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300702 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400703 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530705 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200706
Aaro Koskinen8104e322011-03-13 12:26:22 +0200707 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
708 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
709 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
710 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300711
712 if (chip_id == XG27) {
713 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
714 if ((Temp & 0x03) == 0) { /* dual 12 */
715 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
716 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
717 }
718 }
719
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300720 if (chip_id == XG27) {
721 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530722 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300723 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
724 if (Temp & 0x01) {
725 /* 18 bits FP */
726 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
727 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
728 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200730
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200731 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200732
Aaro Koskinendc505562011-03-13 12:26:26 +0200733 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
734 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200735
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300736 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
737 if (Data & 0x4000)
738 /* Hsync polarity */
739 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
740 if (Data & 0x8000)
741 /* Vsync polarity */
742 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200743}
744
745/* --------------------------------------------------------------------- */
746/* Function : XGI_UpdateXG21CRTC */
747/* Input : */
748/* Output : CRT1 CRTC */
749/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
750/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800751static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
752 struct vb_device_info *pVBInfo,
753 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200754{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300755 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200756
Aaro Koskinendc505562011-03-13 12:26:26 +0200757 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300758 if (ModeNo == 0x2E &&
759 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
760 RES640x480x60))
761 index = 12;
762 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800763 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300764 index = 13;
765 else if (ModeNo == 0x2F)
766 index = 14;
767 else if (ModeNo == 0x50)
768 index = 15;
769 else if (ModeNo == 0x59)
770 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200773 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530774 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200775 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530776 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200777 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530778 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200779 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530780 pVBInfo->UpdateCRT1[index].CR16);
781 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782}
783
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200784static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530785 unsigned short ModeNo, unsigned short ModeIdIndex,
786 unsigned short RefreshRateTableIndex,
787 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400789 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530791 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200792
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300793 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300795 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
796 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
797 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530799 if (modeflag & HalfDCLK)
800 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200801
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300802 if (modeflag & HalfDCLK)
803 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200804
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300805 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200806
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300807 if (temp & InterlaceMode)
808 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300810 if (modeflag & DoubleScanMode)
811 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530813 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530815 tempax /= tempcx;
816 tempax -= 1;
817 tempbx -= 1;
818 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200819 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
820 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530821 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200822 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
823 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200824 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530825 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200826 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530827 tempax = 0;
828 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530830 if (tempbx & 0x01)
831 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530833 if (tempbx & 0x02)
834 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200835
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200836 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200837 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530838 data &= 0xFF;
839 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530841 if (tempbx & 0x04)
842 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200843
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200844 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200845 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200846}
847
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800848static void XGI_SetCRT1Offset(unsigned short ModeNo,
849 unsigned short ModeIdIndex,
850 unsigned short RefreshRateTableIndex,
851 struct xgi_hw_device_info *HwDeviceExtension,
852 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200853{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530856 /* GetOffset */
857 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
858 temp = temp >> 8;
859 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530861 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
862 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530864 if (temp2)
865 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530867 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530869 switch (temp2) {
870 case 0:
871 temp2 = 1;
872 break;
873 case 1:
874 temp2 = 2;
875 break;
876 case 2:
877 temp2 = 4;
878 break;
879 case 3:
880 temp2 = 4;
881 break;
882 case 4:
883 temp2 = 6;
884 break;
885 case 5:
886 temp2 = 8;
887 break;
888 default:
889 break;
890 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200891
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530892 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
893 temp = temp * temp2 + temp2 / 2;
894 else
895 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530897 /* SetOffset */
898 DisplayUnit = temp;
899 temp2 = temp;
900 temp = temp >> 8; /* ah */
901 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200902 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530903 i &= 0xF0;
904 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200905 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 temp = (unsigned char) temp2;
908 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200909 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530911 /* SetDisplayUnit */
912 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
913 temp2 &= InterlaceMode;
914 if (temp2)
915 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530917 DisplayUnit = DisplayUnit << 5;
918 ah = (DisplayUnit & 0xff00) >> 8;
919 al = DisplayUnit & 0x00ff;
920 if (al == 0)
921 ah += 1;
922 else
923 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530925 if (HwDeviceExtension->jChipType >= XG20)
926 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
927 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200928
Aaro Koskinen8104e322011-03-13 12:26:22 +0200929 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200930}
931
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200932static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
933 unsigned short ModeIdIndex,
934 unsigned short RefreshRateTableIndex,
935 struct xgi_hw_device_info *HwDeviceExtension,
936 struct vb_device_info *pVBInfo)
937{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200938 unsigned short CRT2Index, VCLKIndex;
939 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200940
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300941 /* si+Ext_ResInfo */
942 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
943 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
944 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200945
946 if (pVBInfo->IF_DEF_LVDS == 0) {
947 CRT2Index = CRT2Index >> 6; /* for LCD */
Peter Huewea3d675c2012-02-09 21:11:47 +0100948 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100949 if (pVBInfo->LCDResInfo != Panel_1024x768)
Peter Huewef477d3e2012-06-14 00:21:47 +0200950 VCLKIndex = VCLK108_2_315 + 5; /* LCDXlat2VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200951 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200952 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100953 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200954 if (pVBInfo->SetFlag & RPLLDIV2XO) {
Peter Huewe95072592012-06-14 00:21:48 +0200955 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200956 } else {
Peter Huewe95072592012-06-14 00:21:48 +0200957 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200958 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200959
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200960 if (pVBInfo->SetFlag & TVSimuMode) {
961 if (modeflag & Charx8Dot) {
Peter Huewe95072592012-06-14 00:21:48 +0200962 VCLKIndex = TVCLKBASE_315_25 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200963 } else {
Peter Huewe95072592012-06-14 00:21:48 +0200964 VCLKIndex = TVCLKBASE_315_25 + HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200965 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200966 }
967
968 /* 301lv */
Peter Huewe6896b942012-02-09 21:11:46 +0100969 if ((pVBInfo->VBType & VB_SIS301LV) &&
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200970 !(pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100971 if (pVBInfo->VBExtInfo == YPbPr750p)
Peter Huewea3d675c2012-02-09 21:11:47 +0100972 VCLKIndex = XGI_YPbPr750pVCLK;
Peter Huewe6896b942012-02-09 21:11:46 +0100973 else if (pVBInfo->VBExtInfo == YPbPr525p)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200974 VCLKIndex = YPbPr525pVCLK;
975 else if (pVBInfo->SetFlag & RPLLDIV2XO)
976 VCLKIndex = YPbPr525iVCLK_2;
977 else
978 VCLKIndex = YPbPr525iVCLK;
979 }
980 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
981 if (pVBInfo->SetFlag & RPLLDIV2XO) {
Peter Huewe95072592012-06-14 00:21:48 +0200982 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200983 } else {
Peter Huewe95072592012-06-14 00:21:48 +0200984 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200985 }
986 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300987 /* di+Ext_CRTVCLK */
988 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800989 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300990 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200991 }
992 } else { /* LVDS */
Peter Huewe255aabd2012-02-09 21:11:44 +0100993 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
994 (pVBInfo->LCDResInfo == Panel_320x480))
Peter Huewef477d3e2012-06-14 00:21:47 +0200995 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +0300996 else
Peter Huewe95072592012-06-14 00:21:48 +0200997 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK, LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200998 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200999
1000 return VCLKIndex;
1001}
1002
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001003static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1004 unsigned short ModeIdIndex,
1005 struct xgi_hw_device_info *HwDeviceExtension,
1006 unsigned short RefreshRateTableIndex,
1007 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001008{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001009 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301010 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301012 if (pVBInfo->IF_DEF_LVDS == 1) {
1013 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001014 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001015 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1016 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301017 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301019 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001020 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001021 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1022 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001023 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301024 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1025 RefreshRateTableIndex, HwDeviceExtension,
1026 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001027 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001028 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301029 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001030 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301031 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001032 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1033 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301034 } else {
1035 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001036 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001037 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1038 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001040 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301041 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001042 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301043 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001044
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301045 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001046 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1047 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001048 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001049 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001050 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301051 index = data;
1052 index &= 0xE0;
1053 data &= 0x1F;
1054 data = data << 1;
1055 data += 1;
1056 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001057 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301058 }
1059 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001060}
1061
Aaro Koskinene85f2032011-11-27 23:03:07 +02001062static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1063{
1064 unsigned char temp;
1065
1066 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1067 temp = (temp & 1) << 6;
1068 /* SR06[6] 18bit Dither */
1069 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1070 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1071 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1072
1073}
1074
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001075static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301076 struct xgi_hw_device_info *HwDeviceExtension,
1077 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001078{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301079 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001080
Aaro Koskinen58839b02011-03-13 12:26:23 +02001081 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301082 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001083 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001084
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001085 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1086 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1087 data &= 0xC0;
1088 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1089 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1090 data |= 0x01;
1091 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301093 if (HwDeviceExtension->jChipType == XG21)
1094 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001095}
1096
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001097static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1098 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1099 struct vb_device_info *pVBInfo)
1100{
1101 unsigned short data, data2 = 0;
1102 short VCLK;
1103
1104 unsigned char index;
1105
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001106 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1107 index &= IndexMask;
1108 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001109
Aaro Koskinen58839b02011-03-13 12:26:23 +02001110 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001111 data &= 0xf3;
1112 if (VCLK >= 200)
1113 data |= 0x0c; /* VCLK > 200 */
1114
1115 if (HwDeviceExtension->jChipType >= XG20)
1116 data &= ~0x04; /* 2 pixel mode */
1117
Aaro Koskinen8104e322011-03-13 12:26:22 +02001118 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001119
1120 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001121 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001122 data &= 0xE7;
1123 if (VCLK < 200)
1124 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001125 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001126 }
1127
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001128 data2 = 0x00;
1129
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001130 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001131 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001132 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001133
1134}
1135
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001136static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301137 unsigned short ModeNo, unsigned short ModeIdIndex,
1138 unsigned short RefreshRateTableIndex,
1139 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001140{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301141 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1142 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001143
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001144 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1145 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Aaro Koskinen58839b02011-03-13 12:26:23 +02001147 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001148 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001149
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001150 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301151 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001152 data2 |= 0x02;
1153 data3 = pVBInfo->ModeType - ModeVGA;
1154 data3 = data3 << 2;
1155 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301158 if (data)
1159 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001161 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001162 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001163 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001164
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301165 data = 0x0000;
1166 if (infoflag & InterlaceMode) {
1167 if (xres == 1024)
1168 data = 0x0035;
1169 else if (xres == 1280)
1170 data = 0x0048;
1171 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301173 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001174 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301175 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001176 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301178 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001179 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301181 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301183 if (modeflag & LineCompareOff)
1184 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001185
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001186 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301187 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001188 data = data ^ 0x60;
1189 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001190 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301192 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1193 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001194
Aaro Koskinen58839b02011-03-13 12:26:23 +02001195 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301197 if (HwDeviceExtension->jChipType == XG27) {
1198 if (data & 0x40)
1199 data = 0x2c;
1200 else
1201 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001202 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001203 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301204 } else if (HwDeviceExtension->jChipType >= XG20) {
1205 if (data & 0x40)
1206 data = 0x33;
1207 else
1208 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001209 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1210 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301211 } else {
1212 if (data & 0x40)
1213 data = 0x2c;
1214 else
1215 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001216 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301217 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001218
1219}
1220
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001221static void XGI_WriteDAC(unsigned short dl,
1222 unsigned short ah,
1223 unsigned short al,
1224 unsigned short dh,
1225 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001226{
1227 unsigned short temp, bh, bl;
1228
1229 bh = ah;
1230 bl = al;
1231
1232 if (dl != 0) {
1233 temp = bh;
1234 bh = dh;
1235 dh = temp;
1236 if (dl == 1) {
1237 temp = bl;
1238 bl = dh;
1239 dh = temp;
1240 } else {
1241 temp = bl;
1242 bl = bh;
1243 bh = temp;
1244 }
1245 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001246 outb((unsigned short) dh, pVBInfo->P3c9);
1247 outb((unsigned short) bh, pVBInfo->P3c9);
1248 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001249}
1250
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001251static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301252 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001253{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001254 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1255 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001257 outb(0xFF, pVBInfo->P3c6);
1258 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001260 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301261 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301263 for (k = 0; k < 3; k++) {
1264 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301266 if (data & 0x01)
1267 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301269 if (data & 0x02)
1270 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001271
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001272 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301273 data = data >> 2;
1274 }
1275 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001276
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001277 for (i = 16; i < 32; i++) {
1278 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001279
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001280 for (k = 0; k < 3; k++)
1281 outb(data, pVBInfo->P3c9);
1282 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001283
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001284 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001285
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001286 for (m = 0; m < 9; m++) {
1287 di = si;
1288 bx = si + 0x04;
1289 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001290
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001291 for (n = 0; n < 3; n++) {
1292 for (o = 0; o < 5; o++) {
1293 dh = table[si];
1294 ah = table[di];
1295 al = table[bx];
1296 si++;
1297 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301298 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001299
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001300 si -= 2;
1301
1302 for (o = 0; o < 3; o++) {
1303 dh = table[bx];
1304 ah = table[di];
1305 al = table[si];
1306 si--;
1307 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1308 }
1309
1310 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301311 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001312
1313 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301314 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001315}
1316
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001317static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1318 unsigned short ModeIdIndex,
1319 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001320{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301321 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001322
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001323 /* si+Ext_ResInfo */
1324 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001325
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001326 /* si+Ext_ResInfo */
1327 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001328
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001329 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1330 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001331
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001332 if (modeflag & HalfDCLK)
1333 xres = xres << 1;
1334
1335 if (modeflag & DoubleScanMode)
1336 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301338 if (xres == 720)
1339 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001340
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301341 pVBInfo->VGAHDE = xres;
1342 pVBInfo->HDE = xres;
1343 pVBInfo->VGAVDE = yres;
1344 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001345}
1346
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001347static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1348 unsigned short ModeIdIndex,
1349 unsigned short RefreshRateTableIndex,
1350 struct vb_device_info *pVBInfo)
1351{
1352 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1353
1354 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1355
1356 tempbx = BX;
1357
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001358 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1359 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001360
1361 tempal = tempal & 0x0f;
1362
1363 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001364 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001365
Peter Huewea3d675c2012-02-09 21:11:47 +01001366 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001367 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001368 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001369 }
1370
1371 if (tempbx & 0x01)
1372 tempal = (tempal >> 4);
1373
1374 tempal = (tempal & 0x0f);
1375 }
1376
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001377 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001378
1379 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1380 if ((tempbx == 5) || (tempbx) == 7)
1381 tempcx = LCDDesDataLen2;
1382 else if ((tempbx == 3) || (tempbx == 8))
1383 tempcx = LVDSDesDataLen2;
1384 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001385
1386 switch (tempbx) {
1387 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001388 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001389 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001390 break;
1391 case 2:
1392 tempdi = XGI_EPLLCDDataPtr;
1393 break;
1394 case 3:
1395 tempdi = XGI_EPLLCDDesDataPtr;
1396 break;
1397 case 4:
1398 tempdi = XGI_LCDDataTable;
1399 break;
1400 case 5:
1401 tempdi = XGI_LCDDesDataTable;
1402 break;
1403 case 6:
1404 tempdi = XGI_EPLCHLCDRegPtr;
1405 break;
1406 case 7:
1407 case 8:
1408 case 9:
1409 tempdi = NULL;
1410 break;
1411 default:
1412 break;
1413 }
1414
1415 if (tempdi == NULL) /* OEMUtil */
1416 return NULL;
1417
1418 table = tempbx;
1419 i = 0;
1420
1421 while (tempdi[i].PANELID != 0xff) {
1422 tempdx = pVBInfo->LCDResInfo;
1423 if (tempbx & 0x0080) { /* OEMUtil */
1424 tempbx &= (~0x0080);
1425 tempdx = pVBInfo->LCDTypeInfo;
1426 }
1427
1428 if (pVBInfo->LCDInfo & EnableScalingLCD)
1429 tempdx &= (~PanelResInfo);
1430
1431 if (tempdi[i].PANELID == tempdx) {
1432 tempbx = tempdi[i].MASK;
1433 tempdx = pVBInfo->LCDInfo;
1434
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001435 if (modeflag & HalfDCLK)
1436 tempdx |= SetLCDLowResolution;
1437
1438 tempbx &= tempdx;
1439 if (tempbx == tempdi[i].CAP)
1440 break;
1441 }
1442 i++;
1443 }
1444
1445 if (table == 0) {
1446 switch (tempdi[i].DATAPTR) {
1447 case 0:
1448 return &XGI_LVDSCRT11024x768_1_H[tempal];
1449 break;
1450 case 1:
1451 return &XGI_LVDSCRT11024x768_2_H[tempal];
1452 break;
1453 case 2:
1454 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1455 break;
1456 case 3:
1457 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1458 break;
1459 case 4:
1460 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1461 break;
1462 case 5:
1463 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1464 break;
1465 case 6:
1466 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1467 break;
1468 case 7:
1469 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1470 break;
1471 case 8:
1472 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1473 break;
1474 case 9:
1475 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1476 break;
1477 case 10:
1478 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1479 break;
1480 default:
1481 break;
1482 }
1483 } else if (table == 1) {
1484 switch (tempdi[i].DATAPTR) {
1485 case 0:
1486 return &XGI_LVDSCRT11024x768_1_V[tempal];
1487 break;
1488 case 1:
1489 return &XGI_LVDSCRT11024x768_2_V[tempal];
1490 break;
1491 case 2:
1492 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1493 break;
1494 case 3:
1495 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1496 break;
1497 case 4:
1498 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1499 break;
1500 case 5:
1501 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1502 break;
1503 case 6:
1504 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1505 break;
1506 case 7:
1507 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1508 break;
1509 case 8:
1510 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1511 break;
1512 case 9:
1513 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1514 break;
1515 case 10:
1516 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1517 break;
1518 default:
1519 break;
1520 }
1521 } else if (table == 2) {
1522 switch (tempdi[i].DATAPTR) {
1523 case 0:
1524 return &XGI_LVDS1024x768Data_1[tempal];
1525 break;
1526 case 1:
1527 return &XGI_LVDS1024x768Data_2[tempal];
1528 break;
1529 case 2:
1530 return &XGI_LVDS1280x1024Data_1[tempal];
1531 break;
1532 case 3:
1533 return &XGI_LVDS1280x1024Data_2[tempal];
1534 break;
1535 case 4:
1536 return &XGI_LVDS1400x1050Data_1[tempal];
1537 break;
1538 case 5:
1539 return &XGI_LVDS1400x1050Data_2[tempal];
1540 break;
1541 case 6:
1542 return &XGI_LVDS1600x1200Data_1[tempal];
1543 break;
1544 case 7:
1545 return &XGI_LVDSNoScalingData[tempal];
1546 break;
1547 case 8:
1548 return &XGI_LVDS1024x768Data_1x75[tempal];
1549 break;
1550 case 9:
1551 return &XGI_LVDS1024x768Data_2x75[tempal];
1552 break;
1553 case 10:
1554 return &XGI_LVDS1280x1024Data_1x75[tempal];
1555 break;
1556 case 11:
1557 return &XGI_LVDS1280x1024Data_2x75[tempal];
1558 break;
1559 case 12:
1560 return &XGI_LVDSNoScalingDatax75[tempal];
1561 break;
1562 default:
1563 break;
1564 }
1565 } else if (table == 3) {
1566 switch (tempdi[i].DATAPTR) {
1567 case 0:
1568 return &XGI_LVDS1024x768Des_1[tempal];
1569 break;
1570 case 1:
1571 return &XGI_LVDS1024x768Des_3[tempal];
1572 break;
1573 case 2:
1574 return &XGI_LVDS1024x768Des_2[tempal];
1575 break;
1576 case 3:
1577 return &XGI_LVDS1280x1024Des_1[tempal];
1578 break;
1579 case 4:
1580 return &XGI_LVDS1280x1024Des_2[tempal];
1581 break;
1582 case 5:
1583 return &XGI_LVDS1400x1050Des_1[tempal];
1584 break;
1585 case 6:
1586 return &XGI_LVDS1400x1050Des_2[tempal];
1587 break;
1588 case 7:
1589 return &XGI_LVDS1600x1200Des_1[tempal];
1590 break;
1591 case 8:
1592 return &XGI_LVDSNoScalingDesData[tempal];
1593 break;
1594 case 9:
1595 return &XGI_LVDS1024x768Des_1x75[tempal];
1596 break;
1597 case 10:
1598 return &XGI_LVDS1024x768Des_3x75[tempal];
1599 break;
1600 case 11:
1601 return &XGI_LVDS1024x768Des_2x75[tempal];
1602 break;
1603 case 12:
1604 return &XGI_LVDS1280x1024Des_1x75[tempal];
1605 break;
1606 case 13:
1607 return &XGI_LVDS1280x1024Des_2x75[tempal];
1608 break;
1609 case 14:
1610 return &XGI_LVDSNoScalingDesDatax75[tempal];
1611 break;
1612 default:
1613 break;
1614 }
1615 } else if (table == 4) {
1616 switch (tempdi[i].DATAPTR) {
1617 case 0:
1618 return &XGI_ExtLCD1024x768Data[tempal];
1619 break;
1620 case 1:
1621 return &XGI_StLCD1024x768Data[tempal];
1622 break;
1623 case 2:
1624 return &XGI_CetLCD1024x768Data[tempal];
1625 break;
1626 case 3:
1627 return &XGI_ExtLCD1280x1024Data[tempal];
1628 break;
1629 case 4:
1630 return &XGI_StLCD1280x1024Data[tempal];
1631 break;
1632 case 5:
1633 return &XGI_CetLCD1280x1024Data[tempal];
1634 break;
1635 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001636 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001637 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001638 break;
1639 case 8:
1640 return &XGI_CetLCD1400x1050Data[tempal];
1641 break;
1642 case 9:
1643 return &XGI_ExtLCD1600x1200Data[tempal];
1644 break;
1645 case 10:
1646 return &XGI_StLCD1600x1200Data[tempal];
1647 break;
1648 case 11:
1649 return &XGI_NoScalingData[tempal];
1650 break;
1651 case 12:
1652 return &XGI_ExtLCD1024x768x75Data[tempal];
1653 break;
1654 case 13:
1655 return &XGI_ExtLCD1024x768x75Data[tempal];
1656 break;
1657 case 14:
1658 return &XGI_CetLCD1024x768x75Data[tempal];
1659 break;
1660 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001661 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001662 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001663 break;
1664 case 17:
1665 return &XGI_CetLCD1280x1024x75Data[tempal];
1666 break;
1667 case 18:
1668 return &XGI_NoScalingDatax75[tempal];
1669 break;
1670 default:
1671 break;
1672 }
1673 } else if (table == 5) {
1674 switch (tempdi[i].DATAPTR) {
1675 case 0:
1676 return &XGI_ExtLCDDes1024x768Data[tempal];
1677 break;
1678 case 1:
1679 return &XGI_StLCDDes1024x768Data[tempal];
1680 break;
1681 case 2:
1682 return &XGI_CetLCDDes1024x768Data[tempal];
1683 break;
1684 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001685 if ((pVBInfo->VBType & VB_SIS301LV) ||
1686 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001687 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1688 else
1689 return &XGI_ExtLCDDes1280x1024Data[tempal];
1690 break;
1691 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001692 if ((pVBInfo->VBType & VB_SIS301LV) ||
1693 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001694 return &XGI_StLCDDLDes1280x1024Data[tempal];
1695 else
1696 return &XGI_StLCDDes1280x1024Data[tempal];
1697 break;
1698 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001699 if ((pVBInfo->VBType & VB_SIS301LV) ||
1700 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001701 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1702 else
1703 return &XGI_CetLCDDes1280x1024Data[tempal];
1704 break;
1705 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001706 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001707 if ((pVBInfo->VBType & VB_SIS301LV) ||
1708 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001709 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001710 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001711 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001712 break;
1713 case 8:
1714 return &XGI_CetLCDDes1400x1050Data[tempal];
1715 break;
1716 case 9:
1717 return &XGI_CetLCDDes1400x1050Data2[tempal];
1718 break;
1719 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001720 if ((pVBInfo->VBType & VB_SIS301LV) ||
1721 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001722 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1723 else
1724 return &XGI_ExtLCDDes1600x1200Data[tempal];
1725 break;
1726 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001727 if ((pVBInfo->VBType & VB_SIS301LV) ||
1728 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001729 return &XGI_StLCDDLDes1600x1200Data[tempal];
1730 else
1731 return &XGI_StLCDDes1600x1200Data[tempal];
1732 break;
1733 case 12:
1734 return &XGI_NoScalingDesData[tempal];
1735 break;
1736 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001737 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001738 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001739 break;
1740 case 15:
1741 return &XGI_CetLCDDes1024x768x75Data[tempal];
1742 break;
1743 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001744 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001745 if ((pVBInfo->VBType & VB_SIS301LV) ||
1746 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001747 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001748 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001749 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001750 break;
1751 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001752 if ((pVBInfo->VBType & VB_SIS301LV) ||
1753 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001754 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1755 else
1756 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1757 break;
1758 case 19:
1759 return &XGI_NoScalingDesDatax75[tempal];
1760 break;
1761 default:
1762 break;
1763 }
1764 } else if (table == 6) {
1765 switch (tempdi[i].DATAPTR) {
1766 case 0:
1767 return &XGI_CH7017LV1024x768[tempal];
1768 break;
1769 case 1:
1770 return &XGI_CH7017LV1400x1050[tempal];
1771 break;
1772 default:
1773 break;
1774 }
1775 }
1776 return NULL;
1777}
1778
1779static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
1780 unsigned short ModeIdIndex,
1781 unsigned short RefreshRateTableIndex,
1782 struct vb_device_info *pVBInfo)
1783{
1784 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
1785 struct XGI330_TVDataTablStruct *tempdi = NULL;
1786
1787 tempbx = BX;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001788 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1789 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001790 tempal = tempal & 0x3f;
1791 table = tempbx;
1792
1793 switch (tempbx) {
1794 case 0:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001795 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001796 break;
1797 case 1:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001798 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001799 break;
1800 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03001801 case 6:
1802 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001803 break;
1804 case 3:
1805 tempdi = NULL;
1806 break;
1807 case 4:
1808 tempdi = XGI_TVDataTable;
1809 break;
1810 case 5:
1811 tempdi = NULL;
1812 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001813 default:
1814 break;
1815 }
1816
1817 if (tempdi == NULL) /* OEMUtil */
1818 return NULL;
1819
1820 tempdx = pVBInfo->TVInfo;
1821
1822 if (pVBInfo->VBInfo & SetInSlaveMode)
1823 tempdx = tempdx | SetTVLockMode;
1824
1825 if (modeflag & HalfDCLK)
1826 tempdx = tempdx | SetTVLowResolution;
1827
1828 i = 0;
1829
1830 while (tempdi[i].MASK != 0xffff) {
1831 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
1832 break;
1833 i++;
1834 }
1835
Aaro Koskinenebe33022011-11-27 23:03:18 +02001836 if (table == 0x04) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001837 switch (tempdi[i].DATAPTR) {
1838 case 0:
1839 return &XGI_ExtPALData[tempal];
1840 break;
1841 case 1:
1842 return &XGI_ExtNTSCData[tempal];
1843 break;
1844 case 2:
1845 return &XGI_StPALData[tempal];
1846 break;
1847 case 3:
1848 return &XGI_StNTSCData[tempal];
1849 break;
1850 case 4:
1851 return &XGI_ExtHiTVData[tempal];
1852 break;
1853 case 5:
1854 return &XGI_St2HiTVData[tempal];
1855 break;
1856 case 6:
1857 return &XGI_ExtYPbPr525iData[tempal];
1858 break;
1859 case 7:
1860 return &XGI_ExtYPbPr525pData[tempal];
1861 break;
1862 case 8:
1863 return &XGI_ExtYPbPr750pData[tempal];
1864 break;
1865 case 9:
1866 return &XGI_StYPbPr525iData[tempal];
1867 break;
1868 case 10:
1869 return &XGI_StYPbPr525pData[tempal];
1870 break;
1871 case 11:
1872 return &XGI_StYPbPr750pData[tempal];
1873 break;
1874 case 12: /* avoid system hang */
1875 return &XGI_ExtNTSCData[tempal];
1876 break;
1877 case 13:
1878 return &XGI_St1HiTVData[tempal];
1879 break;
1880 default:
1881 break;
1882 }
1883 } else if (table == 0x02) {
1884 switch (tempdi[i].DATAPTR) {
1885 case 0:
1886 return &XGI_CHTVUNTSCData[tempal];
1887 break;
1888 case 1:
1889 return &XGI_CHTVONTSCData[tempal];
1890 break;
1891 case 2:
1892 return &XGI_CHTVUPALData[tempal];
1893 break;
1894 case 3:
1895 return &XGI_CHTVOPALData[tempal];
1896 break;
1897 default:
1898 break;
1899 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001900 }
1901 return NULL;
1902}
1903
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001904static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301905 unsigned short RefreshRateTableIndex,
1906 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001907{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301908 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001909 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301911 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001912
Peter Huewea3d675c2012-02-09 21:11:47 +01001913 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe51f984b2012-06-14 00:21:51 +02001914 LCDPtr = (struct SiS_LVDSData *)XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301915 ModeNo, ModeIdIndex, RefreshRateTableIndex,
1916 pVBInfo);
1917 pVBInfo->VGAHT = LCDPtr->VGAHT;
1918 pVBInfo->VGAVT = LCDPtr->VGAVT;
1919 pVBInfo->HT = LCDPtr->LCDHT;
1920 pVBInfo->VT = LCDPtr->LCDVT;
1921 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001922
Peter Huewea3d675c2012-02-09 21:11:47 +01001923 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301924 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1925 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001926 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1927 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301928 pVBInfo->HDE = 1024;
1929 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001930 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1931 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301932 pVBInfo->HDE = 1280;
1933 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001934 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301935 pVBInfo->HDE = 1400;
1936 pVBInfo->VDE = 1050;
1937 } else {
1938 pVBInfo->HDE = 1600;
1939 pVBInfo->VDE = 1200;
1940 }
1941 }
1942 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001943}
1944
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001945static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301946 unsigned short RefreshRateTableIndex,
1947 struct xgi_hw_device_info *HwDeviceExtension,
1948 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001949{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301950 unsigned char index;
1951 unsigned short tempbx, i;
1952 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1953 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001954
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001955 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301956 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001957
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001958 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001959
Peter Huewea3d675c2012-02-09 21:11:47 +01001960 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001961 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
1962 XGI_GetLcdPtr(tempbx, ModeNo,
1963 ModeIdIndex,
1964 RefreshRateTableIndex,
1965 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001966
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001967 for (i = 0; i < 8; i++)
1968 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301969 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001970
1971 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1972
1973 tempbx = 1;
1974
Peter Huewea3d675c2012-02-09 21:11:47 +01001975 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001976 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
1977 XGI_GetLcdPtr(
1978 tempbx,
1979 ModeNo,
1980 ModeIdIndex,
1981 RefreshRateTableIndex,
1982 pVBInfo);
1983 for (i = 0; i < 7; i++)
1984 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1985 }
1986
1987 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001988}
1989
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001990static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1991{
1992 unsigned char tempal, tempah, tempbl, i;
1993
Aaro Koskinen58839b02011-03-13 12:26:23 +02001994 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001995 tempal = tempah & 0x0F;
1996 tempah = tempah & 0xF0;
1997 i = 0;
1998 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1999
2000 while (tempbl != 0xFF) {
2001 if (tempbl & 0x80) { /* OEMUtil */
2002 tempal = tempah;
2003 tempbl = tempbl & ~(0x80);
2004 }
2005
2006 if (tempal == tempbl)
2007 break;
2008
2009 i++;
2010
2011 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2012 }
2013
2014 return i;
2015}
2016
2017static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2018{
2019 unsigned short tempah, tempal, tempbl, i;
2020
2021 tempal = pVBInfo->LCDResInfo;
2022 tempah = pVBInfo->LCDTypeInfo;
2023
2024 i = 0;
2025 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2026
2027 while (tempbl != 0xFF) {
2028 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2029 tempal = tempah;
2030 tempbl &= ~0x80;
2031 }
2032
2033 if (tempal == tempbl)
2034 break;
2035
2036 i++;
2037 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2038 }
2039
2040 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002041 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002042 pVBInfo->LCDTypeInfo = 0;
2043 i = 0;
2044 }
2045
2046 return i;
2047}
2048
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002049static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2050 unsigned short *VSyncWidth,
2051 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002052{
2053 unsigned short Index;
2054
2055 Index = XGI_GetLCDCapPtr(pVBInfo);
2056 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2057 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2058
2059 return;
2060}
2061
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002062static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302063 unsigned short RefreshRateTableIndex,
2064 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002065{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302066 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2067 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002068 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302069 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002070
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002071 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03002072 tempbx = 3;
2073 if (pVBInfo->LCDInfo & EnableScalingLCD)
2074 LCDPtr1 =
2075 (struct XGI330_LCDDataDesStruct2 *)
2076 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002077 tempbx,
2078 ModeNo,
2079 ModeIdIndex,
2080 RefreshRateTableIndex,
2081 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002082 else
2083 LCDPtr =
Aaro Koskinend00d12f2012-04-07 01:14:10 +03002084 (struct XGI_LCDDesStruct *)
Aaro Koskinen66cface2011-08-31 21:46:13 +03002085 XGI_GetLcdPtr(
2086 tempbx,
2087 ModeNo,
2088 ModeIdIndex,
2089 RefreshRateTableIndex,
2090 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002091
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002092 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2093 push1 = tempbx;
2094 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002095
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002096 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002097 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2098 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002099 tempax = 1024;
2100 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002101 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2102 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002103 tempax = 1280;
2104 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002105 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002106 tempax = 1400;
2107 tempbx = 1050;
2108 } else {
2109 tempax = 1600;
2110 tempbx = 1200;
2111 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002112
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002113 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2114 pVBInfo->HDE = tempax;
2115 pVBInfo->VDE = tempbx;
2116 pVBInfo->VGAHDE = tempax;
2117 pVBInfo->VGAVDE = tempbx;
2118 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002119
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002120 tempax = pVBInfo->HT;
2121
2122 if (pVBInfo->LCDInfo & EnableScalingLCD)
2123 tempbx = LCDPtr1->LCDHDES;
2124 else
2125 tempbx = LCDPtr->LCDHDES;
2126
2127 tempcx = pVBInfo->HDE;
2128 tempbx = tempbx & 0x0fff;
2129 tempcx += tempbx;
2130
2131 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002132 tempcx -= tempax;
2133
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002134 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002135
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002136 tempcx = tempcx >> 3;
2137 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002138
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002139 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2140 (unsigned short) (tempbx & 0xff));
2141 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2142 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002143
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002144 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002145
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002146 if (pVBInfo->LCDInfo & EnableScalingLCD)
2147 tempbx = LCDPtr1->LCDHRS;
2148 else
2149 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002150
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002151 tempcx = push2;
2152
2153 if (pVBInfo->LCDInfo & EnableScalingLCD)
2154 tempcx = LCDPtr1->LCDHSync;
2155
2156 tempcx += tempbx;
2157
2158 if (tempcx >= tempax)
2159 tempcx -= tempax;
2160
2161 tempax = tempbx & 0x07;
2162 tempax = tempax >> 5;
2163 tempcx = tempcx >> 3;
2164 tempbx = tempbx >> 3;
2165
2166 tempcx &= 0x1f;
2167 tempax |= tempcx;
2168
2169 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2170 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2171 (unsigned short) (tempbx & 0xff));
2172
2173 tempax = pVBInfo->VT;
2174 if (pVBInfo->LCDInfo & EnableScalingLCD)
2175 tempbx = LCDPtr1->LCDVDES;
2176 else
2177 tempbx = LCDPtr->LCDVDES;
2178 tempcx = pVBInfo->VDE;
2179
2180 tempbx = tempbx & 0x0fff;
2181 tempcx += tempbx;
2182 if (tempcx >= tempax)
2183 tempcx -= tempax;
2184
2185 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2186 (unsigned short) (tempbx & 0xff));
2187 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2188 (unsigned short) (tempcx & 0xff));
2189
2190 tempbx = (tempbx >> 8) & 0x07;
2191 tempcx = (tempcx >> 8) & 0x07;
2192
2193 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2194 (unsigned short) ((tempcx << 3)
2195 | tempbx));
2196
2197 tempax = pVBInfo->VT;
2198 if (pVBInfo->LCDInfo & EnableScalingLCD)
2199 tempbx = LCDPtr1->LCDVRS;
2200 else
2201 tempbx = LCDPtr->LCDVRS;
2202
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002203 tempcx = push1;
2204
2205 if (pVBInfo->LCDInfo & EnableScalingLCD)
2206 tempcx = LCDPtr1->LCDVSync;
2207
2208 tempcx += tempbx;
2209 if (tempcx >= tempax)
2210 tempcx -= tempax;
2211
2212 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2213 (unsigned short) (tempbx & 0xff));
2214 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2215 (unsigned short) (tempcx & 0x0f));
2216
2217 tempax = ((tempbx >> 8) & 0x07) << 3;
2218
2219 tempbx = pVBInfo->VGAVDE;
2220 if (tempbx != pVBInfo->VDE)
2221 tempax |= 0x40;
2222
Peter Huewea3d675c2012-02-09 21:11:47 +01002223 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002224 tempax |= 0x40;
2225
2226 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2227 tempax);
2228
2229 tempcx = pVBInfo->VGAVT;
2230 tempbx = pVBInfo->VDE;
2231 tempax = pVBInfo->VGAVDE;
2232 tempcx -= tempax;
2233
2234 temp = tempax; /* 0430 ylshieh */
2235 temp1 = (temp << 18) / tempbx;
2236
2237 tempdx = (unsigned short) ((temp << 18) % tempbx);
2238
2239 if (tempdx != 0)
2240 temp1 += 1;
2241
2242 temp2 = temp1;
2243 push3 = temp2;
2244
2245 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2246 (unsigned short) (temp2 & 0xff));
2247 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2248 (unsigned short) ((temp2 >> 8) & 0xff));
2249
2250 tempbx = (unsigned short) (temp2 >> 16);
2251 tempax = tempbx & 0x03;
2252
2253 tempbx = pVBInfo->VGAVDE;
2254 if (tempbx == pVBInfo->VDE)
2255 tempax |= 0x04;
2256
2257 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2258
2259 if (pVBInfo->VBType & VB_XGI301C) {
2260 temp2 = push3;
2261 xgifb_reg_set(pVBInfo->Part4Port,
2262 0x3c,
2263 (unsigned short) (temp2 & 0xff));
2264 xgifb_reg_set(pVBInfo->Part4Port,
2265 0x3b,
2266 (unsigned short) ((temp2 >> 8) &
2267 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002268 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002269 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2270 ~0xc0,
2271 (unsigned short) ((tempbx &
2272 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002273
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002274 tempcx = pVBInfo->VGAVDE;
2275 if (tempcx == pVBInfo->VDE)
2276 xgifb_reg_and_or(pVBInfo->Part4Port,
2277 0x30, ~0x0c, 0x00);
2278 else
2279 xgifb_reg_and_or(pVBInfo->Part4Port,
2280 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302281 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002282
2283 tempcx = pVBInfo->VGAHDE;
2284 tempbx = pVBInfo->HDE;
2285
2286 temp1 = tempcx << 16;
2287
2288 tempax = (unsigned short) (temp1 / tempbx);
2289
2290 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2291 tempax = 65535;
2292
2293 temp3 = tempax;
2294 temp1 = pVBInfo->VGAHDE << 16;
2295
2296 temp1 /= temp3;
2297 temp3 = temp3 << 16;
2298 temp1 -= 1;
2299
2300 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2301
2302 tempax = (unsigned short) (temp3 & 0xff);
2303 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2304
2305 temp1 = pVBInfo->VGAVDE << 18;
2306 temp1 = temp1 / push3;
2307 tempbx = (unsigned short) (temp1 & 0xffff);
2308
Peter Huewe255aabd2012-02-09 21:11:44 +01002309 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002310 tempbx -= 1;
2311
2312 tempax = ((tempbx >> 8) & 0xff) << 3;
2313 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2314 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2315 (unsigned short) (tempax & 0xff));
2316 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2317 (unsigned short) (tempbx & 0xff));
2318
2319 temp3 = temp3 >> 16;
2320
2321 if (modeflag & HalfDCLK)
2322 temp3 = temp3 >> 1;
2323
2324 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2325 (unsigned short) ((temp3 >> 8) & 0xff));
2326 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2327 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002328}
2329
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002330/* --------------------------------------------------------------------- */
2331/* Function : XGI_GETLCDVCLKPtr */
2332/* Input : */
2333/* Output : al -> VCLK Index */
2334/* Description : */
2335/* --------------------------------------------------------------------- */
2336static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2337 struct vb_device_info *pVBInfo)
2338{
2339 unsigned short index;
2340
Peter Huewea3d675c2012-02-09 21:11:47 +01002341 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002342 index = XGI_GetLCDCapPtr1(pVBInfo);
2343
2344 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2345 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2346 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2347 } else { /* LCDA */
2348 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2349 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2350 }
2351 }
2352 return;
2353}
2354
2355static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2356 unsigned short ModeNo, unsigned short ModeIdIndex,
2357 struct vb_device_info *pVBInfo)
2358{
2359
2360 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002361 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002362
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002363 /* si+Ext_ResInfo */
2364 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002365
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002366 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2367 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002368 index = XGI_GetLCDCapPtr(pVBInfo);
2369 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2370
Peter Huewea3d675c2012-02-09 21:11:47 +01002371 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002372 return tempal;
2373
2374 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002375 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002376 (VB_SIS301B |
2377 VB_SIS302B |
2378 VB_SIS301LV |
2379 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002380 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002381 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002382 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002383 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002384 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002385 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002386 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002387 if (!(modeflag & Charx8Dot))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002388 tempal = TVCLKBASE_315 + HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002389
2390 }
2391 return tempal;
2392 }
2393
Peter Huewe599801f2012-02-09 21:11:45 +01002394 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002395 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002396 return tempal;
2397 }
2398
Peter Huewe599801f2012-02-09 21:11:45 +01002399 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002400 tempal = YPbPr525pVCLK;
2401 return tempal;
2402 }
2403
2404 tempal = NTSC1024VCLK;
2405
2406 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002407 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002408 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002409 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002410 }
2411
2412 if (pVBInfo->VBInfo & SetCRT2ToTV)
2413 return tempal;
2414 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002415 } /* {End of VB} */
2416
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002417 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002418 tempal = tempal >> 2;
2419 tempal &= 0x03;
2420
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002421 /* for Dot8 Scaling LCD */
2422 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002423 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2424
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002425 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2426 return tempal;
2427}
2428
2429static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2430 unsigned char *di_1, struct vb_device_info *pVBInfo)
2431{
Peter Huewe6896b942012-02-09 21:11:46 +01002432 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2433 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002434 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) && (pVBInfo->SetFlag
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002435 & ProgrammingCRT2)) {
2436 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2437 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2438 }
2439 } else {
2440 *di_0 = XGI_VCLKData[tempal].SR2B;
2441 *di_1 = XGI_VCLKData[tempal].SR2C;
2442 }
2443}
2444
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002445static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302446 unsigned short RefreshRateTableIndex,
2447 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002448{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302449 unsigned char di_0, di_1, tempal;
2450 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302452 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2453 pVBInfo);
2454 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2455 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002456
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302457 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002458 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302459 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002460 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302461 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002462 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2463 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302464 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002465 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2466 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302467 }
2468 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002469}
2470
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002471static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302472 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002473{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302474 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002475
Peter Huewe6896b942012-02-09 21:11:46 +01002476 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2477 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302478 tempcl = 0;
2479 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002480 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302482 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002483 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302484 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002485 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302486 if (!(temp & 0x40))
2487 tempcl |= ActiveCRT1;
2488 }
2489 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002490
Aaro Koskinen58839b02011-03-13 12:26:23 +02002491 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302492 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002493
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302494 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002495 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002496 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302497 if (tempax & 0x04)
2498 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002499
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302500 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002501
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302502 if (!(tempcl & ActiveLCD))
2503 if (temp == 0x01)
2504 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302506 if (temp == 0x04)
2507 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002508
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302509 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002510 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302512 if (!(temp & 0x08))
2513 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302515 if (!(temp & 0x04))
2516 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002517
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302518 if (temp & 0x02)
2519 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002520
Peter Huewe599801f2012-02-09 21:11:45 +01002521 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302522 if (temp & 0x01)
2523 tempch |= ActiveHiTV;
2524 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002525
Peter Huewe599801f2012-02-09 21:11:45 +01002526 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002527 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302528 pVBInfo->Part2Port,
2529 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302531 if (temp & 0x10)
2532 tempch |= ActiveYPbPr;
2533 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002534
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302535 if (tempch != 0)
2536 tempcl |= ActiveTV;
2537 }
2538 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002539
Aaro Koskinen58839b02011-03-13 12:26:23 +02002540 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302541 if (tempcl & ActiveLCD) {
2542 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2543 if (temp & ActiveTV)
2544 tempcl |= ActiveTV;
2545 }
2546 }
2547 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002548 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002549 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302551 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002552 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302553 } else {
2554 return;
2555 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002556}
2557
Bill Pemberton80adad82010-06-17 13:10:51 -04002558void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002559{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302560 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002561
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002562 if (pVBInfo->IF_DEF_LVDS != 0)
2563 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002564
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002565 tempbx = VB_SIS302B;
2566 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2567 if (flag == 0x02)
2568 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002569
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002570 tempbx = VB_SIS301;
2571 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2572 if (flag < 0xB0)
2573 goto finish;
2574
2575 tempbx = VB_SIS301B;
2576 if (flag < 0xC0)
2577 goto bigger_than_0xB0;
2578
2579 tempbx = VB_XGI301C;
2580 if (flag < 0xD0)
2581 goto bigger_than_0xB0;
2582
2583 tempbx = VB_SIS301LV;
2584 if (flag < 0xE0)
2585 goto bigger_than_0xB0;
2586
2587 tempbx = VB_SIS302LV;
2588 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2589 if (tempah != 0xFF)
2590 tempbx = VB_XGI301C;
2591
2592bigger_than_0xB0:
2593 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2594 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2595 if (!(flag & 0x02))
2596 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302597 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002598
2599finish:
2600 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002601}
2602
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002603static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302604 struct xgi_hw_device_info *HwDeviceExtension,
2605 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002606{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302607 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002608
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002609 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302610 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002611 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302612 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002613
Miguel Gómezf9317352012-07-06 12:40:48 +02002614 if (!(pVBInfo->VBType & 0xFFFF))
2615 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002616
Miguel Gómezf9317352012-07-06 12:40:48 +02002617 /* Check Display Device */
2618 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2619 tempbx = tempbx | temp;
2620 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2621 push = temp;
2622 push = push << 8;
2623 tempax = temp << 8;
2624 tempbx = tempbx | tempax;
2625 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2626 | SetInSlaveMode | DisableCRT2Display);
2627 temp = 0xFFFF ^ temp;
2628 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002629
Miguel Gómezf9317352012-07-06 12:40:48 +02002630 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002631
Miguel Gómezf9317352012-07-06 12:40:48 +02002632 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002633
Miguel Gómezf9317352012-07-06 12:40:48 +02002634 if (((HwDeviceExtension->jChipType >= XG20) ||
2635 (HwDeviceExtension->jChipType >= XG40)) &&
2636 (pVBInfo->IF_DEF_LVDS == 0)) {
2637 if (pVBInfo->VBType &
2638 (VB_SIS302B |
2639 VB_SIS301LV |
2640 VB_SIS302LV |
2641 VB_XGI301C)) {
2642 if (temp & EnableDualEdge) {
2643 tempbx |= SetCRT2ToDualEdge;
2644 if (temp & SetToLCDA)
2645 tempbx |= XGI_SetCRT2ToLCDA;
2646 }
2647 }
2648 }
2649 }
2650
2651 if (pVBInfo->IF_DEF_YPbPr == 1) {
2652 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2653 ((pVBInfo->VBType & VB_SIS301LV) ||
2654 (pVBInfo->VBType & VB_SIS302LV) ||
2655 (pVBInfo->VBType & VB_XGI301C)))) {
2656 if (temp & SetYPbPr) {
2657 if (pVBInfo->IF_DEF_HiVision == 1) {
2658 /* shampoo add for new
2659 * scratch */
2660 temp = xgifb_reg_get(
2661 pVBInfo->P3d4,
2662 0x35);
2663 temp &= YPbPrMode;
2664 tempbx |= SetCRT2ToHiVision;
2665
2666 if (temp != YPbPrMode1080i) {
2667 tempbx &=
2668 (~SetCRT2ToHiVision);
2669 tempbx |=
2670 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302671 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302672 }
2673 }
2674 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002675 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002676
Miguel Gómezf9317352012-07-06 12:40:48 +02002677 tempax = push; /* restore CR31 */
2678
2679 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302680 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002681 if (pVBInfo->IF_DEF_HiVision == 1)
2682 temp = 0x09FC;
2683 else
2684 temp = 0x097C;
2685 } else {
2686 if (pVBInfo->IF_DEF_HiVision == 1)
2687 temp = 0x01FC;
2688 else
2689 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302690 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002691 } else { /* 3nd party chip */
2692 temp = SetCRT2ToLCD;
2693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002694
Miguel Gómezf9317352012-07-06 12:40:48 +02002695 if (!(tempbx & temp)) {
2696 tempax |= DisableCRT2Display;
2697 tempbx = 0;
2698 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Miguel Gómezf9317352012-07-06 12:40:48 +02002700 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302701 if (!(pVBInfo->VBType & VB_NoLCD)) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002702 if (tempbx & XGI_SetCRT2ToLCDA) {
2703 if (tempbx & SetSimuScanMode)
2704 tempbx &= (~(SetCRT2ToLCD |
2705 SetCRT2ToRAMDAC |
2706 SwitchCRT2));
2707 else
2708 tempbx &= (~(SetCRT2ToLCD |
2709 SetCRT2ToRAMDAC |
2710 SetCRT2ToTV |
2711 SwitchCRT2));
2712 }
2713 }
2714 }
2715
2716 /* shampoo add */
2717 /* for driver abnormal */
2718 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2719 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2720 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002721 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002722 SetCRT2ToRAMDAC |
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 } else {
2728 tempbx &= (~(SetCRT2ToRAMDAC |
2729 SetCRT2ToLCD |
2730 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302731 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002732 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002733
Miguel Gómezf9317352012-07-06 12:40:48 +02002734 if (!(pVBInfo->VBType & VB_NoLCD)) {
2735 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002736 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002737 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002738 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002739 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002740 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302741 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002742 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002743
Miguel Gómezf9317352012-07-06 12:40:48 +02002744 if (tempbx & SetCRT2ToSCART) {
2745 tempbx &= (0xFF00 |
2746 SetCRT2ToSCART |
2747 SwitchCRT2 |
2748 SetSimuScanMode);
2749 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2750 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002751
Miguel Gómezf9317352012-07-06 12:40:48 +02002752 if (pVBInfo->IF_DEF_YPbPr == 1) {
2753 if (tempbx & SetCRT2ToYPbPr525750)
2754 tempbx &= (0xFF00 |
2755 SwitchCRT2 |
2756 SetSimuScanMode);
2757 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002758
Miguel Gómezf9317352012-07-06 12:40:48 +02002759 if (pVBInfo->IF_DEF_HiVision == 1) {
2760 if (tempbx & SetCRT2ToHiVision)
2761 tempbx &= (0xFF00 |
2762 SetCRT2ToHiVision |
2763 SwitchCRT2 |
2764 SetSimuScanMode);
2765 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002766
Miguel Gómezf9317352012-07-06 12:40:48 +02002767 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2768 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2769 tempbx = DisableCRT2Display;
2770 }
2771
2772 if (!(tempbx & DisableCRT2Display)) {
2773 if ((!(tempbx & DriverMode)) ||
2774 (!(modeflag & CRT2Mode))) {
2775 if (pVBInfo->IF_DEF_LCDA == 1) {
2776 if (!(tempbx & XGI_SetCRT2ToLCDA))
2777 tempbx |= (SetInSlaveMode |
2778 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302779 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002780 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002781
Miguel Gómezf9317352012-07-06 12:40:48 +02002782 /* LCD+TV can't support in slave mode
2783 * (Force LCDA+TV->LCDB) */
2784 if ((tempbx & SetInSlaveMode) &&
2785 (tempbx & XGI_SetCRT2ToLCDA)) {
2786 tempbx ^= (SetCRT2ToLCD |
2787 XGI_SetCRT2ToLCDA |
2788 SetCRT2ToDualEdge);
2789 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302790 }
2791 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302793 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002794}
2795
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002796static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302797 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002798{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302799 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302801 tempbx = 0;
2802 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302804 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002805 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2806 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302808 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002809 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302810 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002811 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002812 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002813 TVSetPALM |
2814 TVSetPALN |
2815 TVSetPAL);
2816 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002817 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002818 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302819 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002820 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002821 TVSetNTSCJ |
2822 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302823 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002824
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302825 if (pVBInfo->IF_DEF_LVDS == 0) {
2826 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002827 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302828 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302830 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002831 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002832 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302833 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302835 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002836 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302838 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002839 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302840 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002841 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302842 }
2843 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302845 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002846 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2847 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302848 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302850 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002851 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2852 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002854
Peter Huewe599801f2012-02-09 21:11:45 +01002855 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002856 (modeflag > 13) &&
2857 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302858 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302860 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002861
Peter Huewe599801f2012-02-09 21:11:45 +01002862 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302863 if (pVBInfo->VBInfo & SetInSlaveMode)
2864 tempbx &= (~RPLLDIV2XO);
2865 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002866 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01002867 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302868 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002869 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002870 (VB_SIS301B |
2871 VB_SIS302B |
2872 VB_SIS301LV |
2873 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002874 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302875 if (tempbx & TVSimuMode)
2876 tempbx &= (~RPLLDIV2XO);
2877 }
2878 }
2879 }
2880 }
2881 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002882}
2883
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002884static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2885 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002886{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302887 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002888
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302889 pVBInfo->LCDResInfo = 0;
2890 pVBInfo->LCDTypeInfo = 0;
2891 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002892
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002893 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2894 /* si+Ext_ResInfo // */
2895 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002896 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302897 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302899 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002900 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002901
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002902 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002903 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302904 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002905 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002906 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302907 tempax &= 0x0F;
2908 else
2909 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302911 if ((resinfo == 6) || (resinfo == 9)) {
2912 if (tempax >= 3)
2913 tempbx |= PanelRef75Hz;
2914 } else if ((resinfo == 7) || (resinfo == 8)) {
2915 if (tempax >= 4)
2916 tempbx |= PanelRef75Hz;
2917 }
2918 }
2919 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002920
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302921 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302923 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002924
Peter Huewea3d675c2012-02-09 21:11:47 +01002925 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002927
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302928 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002929
Aaro Koskinen58839b02011-03-13 12:26:23 +02002930 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302932 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002933
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302934 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002935
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302936 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002937
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302938 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002939
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302940 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002941 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002942 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 tempbx |= SetLCDDualLink;
2944 }
2945 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002946
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302947 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002948 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002949 & SetCRT2ToLCD) && (resinfo == 9) &&
2950 (!(tempbx & EnableScalingLCD)))
Peter Huewe255aabd2012-02-09 21:11:44 +01002951 /* set to center in 1280x1024 LCDB for Panel_1400x1050 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002952 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302953 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002954
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302955 if (pVBInfo->IF_DEF_ExpLink == 1) {
2956 if (modeflag & HalfDCLK) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302957 if (!(tempbx & SetLCDtoNonExpanding)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002958 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302959 } else {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002960 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2961 if (resinfo == 4) {/* 512x384 */
2962 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302963 }
2964 }
2965 }
2966 }
2967 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302969 if (pVBInfo->VBInfo & SetInSlaveMode) {
2970 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002971 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302972 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002973 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302974 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302976 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302978 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002979}
2980
Bill Pemberton108afbf2010-06-17 13:10:47 -04002981unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302982 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002984 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2985 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2986 break;
2987 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2988 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302989 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302991 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002992}
2993
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002994static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2995{
2996 unsigned char ujRet = 0;
2997 unsigned char i = 0;
2998
2999 for (i = 0; i < 8; i++) {
3000 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003001 ujRet |= (ujDate >> i) & 1;
3002 }
3003
3004 return ujRet;
3005}
3006
3007/*----------------------------------------------------------------------------*/
3008/* output */
3009/* bl[5] : LVDS signal */
3010/* bl[1] : LVDS backlight */
3011/* bl[0] : LVDS VDD */
3012/*----------------------------------------------------------------------------*/
3013static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3014{
3015 unsigned char CR4A, temp;
3016
Aaro Koskinen58839b02011-03-13 12:26:23 +02003017 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003018 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003019
Aaro Koskinen58839b02011-03-13 12:26:23 +02003020 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003021
3022 temp = XG21GPIODataTransfer(temp);
3023 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003024 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003025 return temp;
3026}
3027
3028/*----------------------------------------------------------------------------*/
3029/* output */
3030/* bl[5] : LVDS signal */
3031/* bl[1] : LVDS backlight */
3032/* bl[0] : LVDS VDD */
3033/*----------------------------------------------------------------------------*/
3034static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3035{
3036 unsigned char CR4A, CRB4, temp;
3037
Aaro Koskinen58839b02011-03-13 12:26:23 +02003038 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003039 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003040
Aaro Koskinen58839b02011-03-13 12:26:23 +02003041 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003042
3043 temp &= 0x0C;
3044 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003045 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003046 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003047 temp |= ((CRB4 & 0x04) << 3);
3048 return temp;
3049}
3050
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003051/*----------------------------------------------------------------------------*/
3052/* input */
3053/* bl[5] : 1;LVDS signal on */
3054/* bl[1] : 1;LVDS backlight on */
3055/* bl[0] : 1:LVDS VDD on */
3056/* bh: 100000b : clear bit 5, to set bit5 */
3057/* 000010b : clear bit 1, to set bit1 */
3058/* 000001b : clear bit 0, to set bit0 */
3059/*----------------------------------------------------------------------------*/
3060static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3061 struct vb_device_info *pVBInfo)
3062{
3063 unsigned char CR4A, temp;
3064
3065 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3066 tempbh &= 0x23;
3067 tempbl &= 0x23;
3068 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3069
3070 if (tempbh & 0x20) {
3071 temp = (tempbl >> 4) & 0x02;
3072
3073 /* CR B4[1] */
3074 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3075
3076 }
3077
3078 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3079
3080 temp = XG21GPIODataTransfer(temp);
3081 temp &= ~tempbh;
3082 temp |= tempbl;
3083 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3084}
3085
Aaro Koskinen776115a2011-11-27 23:03:10 +02003086static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3087 struct vb_device_info *pVBInfo)
3088{
3089 unsigned char CR4A, temp;
3090 unsigned short tempbh0, tempbl0;
3091
3092 tempbh0 = tempbh;
3093 tempbl0 = tempbl;
3094 tempbh0 &= 0x20;
3095 tempbl0 &= 0x20;
3096 tempbh0 >>= 3;
3097 tempbl0 >>= 3;
3098
3099 if (tempbh & 0x20) {
3100 temp = (tempbl >> 4) & 0x02;
3101
3102 /* CR B4[1] */
3103 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3104
3105 }
3106 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3107
3108 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3109 tempbh &= 0x03;
3110 tempbl &= 0x03;
3111 tempbh <<= 2;
3112 tempbl <<= 2; /* GPIOC,GPIOD */
3113 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3114 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3115}
3116
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003117/* --------------------------------------------------------------------- */
3118/* Function : XGI_XG21SetPanelDelay */
3119/* Input : */
3120/* Output : */
3121/* Description : */
3122/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
3123/* : bl : 2 ; T2 : the duration signal on and Vdd on */
3124/* : bl : 3 ; T3 : the duration between CPL off and signal off */
3125/* : bl : 4 ; T4 : the duration signal off and Vdd off */
3126/* --------------------------------------------------------------------- */
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003127static void XGI_XG21SetPanelDelay(struct xgifb_video_info *xgifb_info,
3128 unsigned short tempbl,
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003129 struct vb_device_info *pVBInfo)
3130{
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003131 if (tempbl == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003132 mdelay(xgifb_info->lvds_data.PSC_S1);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003133
3134 if (tempbl == 2)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003135 mdelay(xgifb_info->lvds_data.PSC_S2);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003136
3137 if (tempbl == 3)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003138 mdelay(xgifb_info->lvds_data.PSC_S3);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003139
3140 if (tempbl == 4)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003141 mdelay(xgifb_info->lvds_data.PSC_S4);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003142}
3143
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003144static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3145 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003147{
3148
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003149 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303150 if (pXGIHWDE->jChipType == XG21) {
3151 if (pVBInfo->IF_DEF_LVDS == 1) {
3152 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003153 /* LVDS VDD on */
3154 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003155 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303156 }
3157 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003158 /* LVDS signal on */
3159 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003160 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003161 /* LVDS backlight on */
3162 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303163 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003164 /* DVO/DVI signal on */
3165 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303166 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003167
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303168 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003169
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303170 if (pXGIHWDE->jChipType == XG27) {
3171 if (pVBInfo->IF_DEF_LVDS == 1) {
3172 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003173 /* LVDS VDD on */
3174 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003175 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 }
3177 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003178 /* LVDS signal on */
3179 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003180 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003181 /* LVDS backlight on */
3182 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303183 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003184 /* DVO/DVI signal on */
3185 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303186 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303188 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003189}
3190
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003191void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3192 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003194{
3195
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303196 if (pXGIHWDE->jChipType == XG21) {
3197 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003198 /* LVDS backlight off */
3199 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003200 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303201 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003202 /* DVO/DVI signal off */
3203 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303204 }
3205 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003206
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303207 if (pXGIHWDE->jChipType == XG27) {
3208 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003209 /* LVDS backlight off */
3210 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003211 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303212 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003215 /* DVO/DVI signal off */
3216 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303217 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003218
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003219 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003220}
3221
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003222static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003223{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003224 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303225 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003226
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003227 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303228 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003229}
3230
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003231static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003232{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003233 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003234}
3235
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003236static void XGI_SaveCRT2Info(unsigned short ModeNo,
3237 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003238{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303239 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003240
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003241 /* reserve CR34 for CRT1 Mode No */
3242 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303243 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3244 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003245 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003246}
3247
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003248static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3249 unsigned short ModeIdIndex,
3250 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003251{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303252 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003253
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003254 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003255 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3256 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3257 /* si+St_ModeFlag */
3258 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003259
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003260 if (modeflag & HalfDCLK)
3261 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003262
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003263 if (modeflag & DoubleScanMode)
3264 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003265
Miguel Gómez3339db82012-07-06 12:40:49 +02003266 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3267 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003268
Miguel Gómez3339db82012-07-06 12:40:49 +02003269 if (pVBInfo->IF_DEF_LVDS == 0) {
3270 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3271 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3272 if (yres == 1024)
3273 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303274 }
3275 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003276
Miguel Gómez3339db82012-07-06 12:40:49 +02003277 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3278 if (yres == 400)
3279 yres = 405;
3280 else if (yres == 350)
3281 yres = 360;
3282
3283 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3284 if (yres == 360)
3285 yres = 375;
3286 }
3287 }
3288
3289 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3290 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3291 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3292 if (yres == 350)
3293 yres = 357;
3294 else if (yres == 400)
3295 yres = 420;
3296 else if (yres == 480)
3297 yres = 525;
3298 }
3299 }
3300 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303301 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003302
Miguel Gómez3339db82012-07-06 12:40:49 +02003303 if (xres == 720)
3304 xres = 640;
3305
3306exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303307 pVBInfo->VGAHDE = xres;
3308 pVBInfo->HDE = xres;
3309 pVBInfo->VGAVDE = yres;
3310 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003311}
3312
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003313static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003314{
3315
Peter Huewea3d675c2012-02-09 21:11:47 +01003316 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003317 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303318 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003319
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303320 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003321}
3322
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003323static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3324 unsigned short ModeIdIndex,
3325 unsigned short RefreshRateTableIndex,
3326 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003327{
3328 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003329 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003330
3331 pVBInfo->RVBHCMAX = 1;
3332 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003333 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3334 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3335 CRT1Index &= IndexMask;
3336 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3337 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3338 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3339 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3340 tempcx = (unsigned short)
3341 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3342 tempcx &= 0x0100;
3343 tempcx = tempcx << 2;
3344 tempbx |= tempcx;
3345 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003346
3347 if (temp1 & 0x01)
3348 tempbx |= 0x0100;
3349
3350 if (temp1 & 0x20)
3351 tempbx |= 0x0200;
3352 tempax += 5;
3353
3354 if (modeflag & Charx8Dot)
3355 tempax *= 8;
3356 else
3357 tempax *= 9;
3358
3359 pVBInfo->VGAHT = tempax;
3360 pVBInfo->HT = tempax;
3361 tempbx++;
3362 pVBInfo->VGAVT = tempbx;
3363 pVBInfo->VT = tempbx;
3364}
3365
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003366static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303367 unsigned short RefreshRateTableIndex,
3368 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003369{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303370 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003371
Peter Huewefc39dcb2012-01-15 19:22:12 +01003372 struct SiS_LCDData *LCDPtr = NULL;
3373 struct SiS_TVData *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003374
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003375 /* si+Ext_ResInfo */
3376 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3377 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303378 pVBInfo->NewFlickerMode = 0;
3379 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003380
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303381 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3382 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3383 pVBInfo);
3384 return;
3385 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003386
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303387 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003388
Peter Huewea3d675c2012-02-09 21:11:47 +01003389 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003390 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303391 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3392 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303394 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3395 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3396 pVBInfo->VGAHT = LCDPtr->VGAHT;
3397 pVBInfo->VGAVT = LCDPtr->VGAVT;
3398 pVBInfo->HT = LCDPtr->LCDHT;
3399 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003400
Peter Huewe255aabd2012-02-09 21:11:44 +01003401 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303402 tempax = 1024;
3403 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003404
Peter Huewea3d675c2012-02-09 21:11:47 +01003405 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303406 if (pVBInfo->VGAVDE == 357)
3407 tempbx = 527;
3408 else if (pVBInfo->VGAVDE == 420)
3409 tempbx = 620;
3410 else if (pVBInfo->VGAVDE == 525)
3411 tempbx = 775;
3412 else if (pVBInfo->VGAVDE == 600)
3413 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303414 else
3415 tempbx = 768;
3416 } else
3417 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003418 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303419 tempax = 1024;
3420 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003421 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303422 tempax = 1280;
3423 if (pVBInfo->VGAVDE == 360)
3424 tempbx = 768;
3425 else if (pVBInfo->VGAVDE == 375)
3426 tempbx = 800;
3427 else if (pVBInfo->VGAVDE == 405)
3428 tempbx = 864;
3429 else
3430 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003431 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303432 tempax = 1280;
3433 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003434 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303435 tempax = 1280;
3436 if (pVBInfo->VGAVDE == 350)
3437 tempbx = 700;
3438 else if (pVBInfo->VGAVDE == 400)
3439 tempbx = 800;
3440 else if (pVBInfo->VGAVDE == 1024)
3441 tempbx = 960;
3442 else
3443 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003444 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303445 tempax = 1400;
3446 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303448 if (pVBInfo->VGAVDE == 1024) {
3449 tempax = 1280;
3450 tempbx = 1024;
3451 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003452 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 tempax = 1600;
3454 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003455 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303456 if (pVBInfo->VGAVDE == 350)
3457 tempbx = 875;
3458 else if (pVBInfo->VGAVDE == 400)
3459 tempbx = 1000;
3460 }
3461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303463 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3464 tempax = pVBInfo->VGAHDE;
3465 tempbx = pVBInfo->VGAVDE;
3466 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 pVBInfo->HDE = tempax;
3469 pVBInfo->VDE = tempbx;
3470 return;
3471 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003472
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303473 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
3474 tempbx = 4;
Peter Huewefc39dcb2012-01-15 19:22:12 +01003475 TVPtr = (struct SiS_TVData *) XGI_GetTVPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303476 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3477 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003478
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303479 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3480 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3481 pVBInfo->VGAHT = TVPtr->VGAHT;
3482 pVBInfo->VGAVT = TVPtr->VGAVT;
3483 pVBInfo->HDE = TVPtr->TVHDE;
3484 pVBInfo->VDE = TVPtr->TVVDE;
3485 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3486 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003487
Peter Huewe599801f2012-02-09 21:11:45 +01003488 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303489 if (resinfo == 0x08)
3490 pVBInfo->NewFlickerMode = 0x40;
3491 else if (resinfo == 0x09)
3492 pVBInfo->NewFlickerMode = 0x40;
3493 else if (resinfo == 0x12)
3494 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 if (pVBInfo->VGAVDE == 350)
3497 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003498
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303499 tempax = ExtHiTVHT;
3500 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003501
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303502 if (pVBInfo->VBInfo & SetInSlaveMode) {
3503 if (pVBInfo->TVInfo & TVSimuMode) {
3504 tempax = StHiTVHT;
3505 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003506
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 if (!(modeflag & Charx8Dot)) {
3508 tempax = StHiTextTVHT;
3509 tempbx = StHiTextTVVT;
3510 }
3511 }
3512 }
Peter Huewe599801f2012-02-09 21:11:45 +01003513 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3514 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3516 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3517 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003518
Peter Huewe599801f2012-02-09 21:11:45 +01003519 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303520 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3521 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003522 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303523 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3524 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3525 if (pVBInfo->TVInfo & NTSC1024x768)
3526 tempax = NTSC1024x768HT;
3527 }
3528 } else {
3529 tempax = PALHT;
3530 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003531 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303532 tempax = NTSCHT;
3533 tempbx = NTSCVT;
3534 if (pVBInfo->TVInfo & NTSC1024x768)
3535 tempax = NTSC1024x768HT;
3536 }
3537 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003538
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303539 pVBInfo->HT = tempax;
3540 pVBInfo->VT = tempbx;
3541 return;
3542 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003543}
3544
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003545static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303546 unsigned short RefreshRateTableIndex,
3547 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003548{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003549 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303551 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3552 pVBInfo);
3553 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3554 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003555
Peter Huewe6896b942012-02-09 21:11:46 +01003556 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303557 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003558 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3559 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3560 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303561 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003562 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3563 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003565
Aaro Koskinen8104e322011-03-13 12:26:22 +02003566 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303568 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003569 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303570 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003571 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003572}
3573
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003574static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3575 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003576{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003577 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3578 short index;
3579 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303580
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003581 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003582 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303583
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003584 if (index < 0)
3585 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303586
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003587 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303588}
3589
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003590static unsigned short XGI_GetOffset(unsigned short ModeNo,
3591 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303592 unsigned short RefreshRateTableIndex,
3593 struct xgi_hw_device_info *HwDeviceExtension,
3594 struct vb_device_info *pVBInfo)
3595{
3596 unsigned short temp, colordepth, modeinfo, index, infoflag,
3597 ColorDepth[] = { 0x01, 0x02, 0x04 };
3598
3599 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003600 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303601
3602 index = (modeinfo >> 8) & 0xFF;
3603
3604 temp = pVBInfo->ScreenOffset[index];
3605
3606 if (infoflag & InterlaceMode)
3607 temp = temp << 1;
3608
3609 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3610
3611 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3612 temp = ModeNo - 0x7C;
3613 colordepth = ColorDepth[temp];
3614 temp = 0x6B;
3615 if (infoflag & InterlaceMode)
3616 temp = temp << 1;
3617 return temp * colordepth;
3618 } else {
3619 return temp * colordepth;
3620 }
3621}
3622
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003623static void XGI_SetCRT2Offset(unsigned short ModeNo,
3624 unsigned short ModeIdIndex,
3625 unsigned short RefreshRateTableIndex,
3626 struct xgi_hw_device_info *HwDeviceExtension,
3627 struct vb_device_info *pVBInfo)
3628{
3629 unsigned short offset;
3630 unsigned char temp;
3631
3632 if (pVBInfo->VBInfo & SetInSlaveMode)
3633 return;
3634
3635 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3636 HwDeviceExtension, pVBInfo);
3637 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003638 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003639 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003640 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003641 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003642 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003643}
3644
Randy Dunlap89229672010-08-10 08:46:44 -07003645static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003646{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003647 /* threshold high ,disable auto threshold */
3648 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3649 /* threshold low default 04h */
3650 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003651}
3652
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003653static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 struct xgi_hw_device_info *HwDeviceExtension,
3655 unsigned short RefreshRateTableIndex,
3656 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003657{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303658 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003659
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003660 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3661 CRT1Index &= IndexMask;
3662 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303664 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3665 HwDeviceExtension, pVBInfo);
3666 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303668 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003669 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003670
Aaro Koskinen8104e322011-03-13 12:26:22 +02003671 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3672 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003673}
3674
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003675static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303676 struct xgi_hw_device_info *HwDeviceExtension,
3677 unsigned short RefreshRateTableIndex,
3678 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003679{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303680 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3681 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003682
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003683 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3684 CRT1Index &= IndexMask;
3685 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3686 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303688 /* bainy change table name */
3689 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003690 /* BTVGA2HT 0x08,0x09 */
3691 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003692 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303693 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003694 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003695 /* BTVGA2HDEE 0x0A,0x0C */
3696 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003697 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303698 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3699 pushbx = pVBInfo->VGAHDE / 2 + 16;
3700 tempcx = tempcx >> 1;
3701 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3702 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3705 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003706 tempbx |= ((pVBInfo->
3707 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3708 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303709 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3710 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3711 tempcx &= 0x1F;
3712 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3713 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3714 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3715 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003716
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303717 tempbx += 4;
3718 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303720 if (tempcx > (pVBInfo->VGAHT / 2))
3721 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303723 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003724
Aaro Koskinen8104e322011-03-13 12:26:22 +02003725 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303726 } else {
3727 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003728 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303729 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003730 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003731 /* BTVGA2HDEE 0x0A,0x0C */
3732 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003733 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303734 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3735 pushbx = pVBInfo->VGAHDE + 16;
3736 tempcx = tempcx >> 1;
3737 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3738 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303740 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3741 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003742 tempbx |= ((pVBInfo->
3743 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3744 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303745 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3746 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3747 tempcx &= 0x1F;
3748 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3749 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3750 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3751 tempbx += 16;
3752 tempcx += 16;
3753 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303755 if (tempcx > pVBInfo->VGAHT)
3756 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003757
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303758 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003759 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303760 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303762 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3763 tempbx = pushbx;
3764 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3765 tempax |= (tempbx & 0xFF00);
3766 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003767 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303768 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003769 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303770 tempcx = (pVBInfo->VGAVT - 1);
3771 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003772
Aaro Koskinen8104e322011-03-13 12:26:22 +02003773 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303774 tempbx = pVBInfo->VGAVDE - 1;
3775 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003776 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303777 temp = ((tempbx & 0xFF00) << 3) >> 8;
3778 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003779 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303781 tempax = pVBInfo->VGAVDE;
3782 tempbx = pVBInfo->VGAVDE;
3783 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003784 /* BTVGA2VRS 0x10,0x11 */
3785 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3786 /* BTVGA2VRE 0x11 */
3787 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303789 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3790 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3791 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303793 if (temp & 0x04)
3794 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303796 if (temp & 0x080)
3797 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303799 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303801 if (temp & 0x08)
3802 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303804 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3805 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3806 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303808 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003809 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303810 temp = ((tempbx & 0xFF00) >> 8) << 4;
3811 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003812 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303813 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303815 if (modeflag & DoubleScanMode)
3816 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303818 if (modeflag & HalfDCLK)
3819 tempax |= 0x40;
3820
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003821 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003822}
3823
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003824static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3825{
3826 unsigned long tempax, tempbx;
3827
3828 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3829 & 0xFFFF;
3830 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3831 tempax = (tempax * pVBInfo->HT) / tempbx;
3832
3833 return (unsigned short) tempax;
3834}
3835
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003836static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303837 struct xgi_hw_device_info *HwDeviceExtension,
3838 unsigned short RefreshRateTableIndex,
3839 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003840{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3842 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003843
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003844 /* si+Ext_ResInfo */
3845 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3846 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3847 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3848 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303850 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3851 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303853 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003854 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303855 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003856
Peter Huewe6896b942012-02-09 21:11:46 +01003857 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303858 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303862 if (modeflag & HalfDCLK)
3863 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303865 tempax = (tempax / tempcx) - 1;
3866 tempbx |= ((tempax & 0x00FF) << 8);
3867 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003868 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303870 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303872 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003873 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3874 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303875 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003876
Peter Huewe599801f2012-02-09 21:11:45 +01003877 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01003878 if (pVBInfo->VBType & VB_SIS301LV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303879 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
3880 if (resinfo == 7)
3881 temp -= 2;
3882 }
3883 } else if (resinfo == 7) {
3884 temp -= 2;
3885 }
3886 }
3887 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003888
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003889 /* 0x05 Horizontal Display Start */
3890 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3891 /* 0x06 Horizontal Blank end */
3892 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303894 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3895 if (pVBInfo->VBInfo & SetCRT2ToTV)
3896 tempax = pVBInfo->VGAHT;
3897 else
3898 tempax = XGI_GetVGAHT2(pVBInfo);
3899 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303901 if (tempax >= pVBInfo->VGAHT)
3902 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303904 if (modeflag & HalfDCLK)
3905 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303907 tempax = (tempax / tempcx) - 5;
3908 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003909 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303910 temp = (tempbx & 0x00FF) - 1;
3911 if (!(modeflag & HalfDCLK)) {
3912 temp -= 6;
3913 if (pVBInfo->TVInfo & TVSimuMode) {
3914 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003915 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303916 }
3917 }
3918 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303919 tempbx = (tempbx & 0xFF00) >> 8;
3920 tempcx = (tempcx + tempbx) >> 1;
3921 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303923 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3924 temp -= 1;
3925 if (!(modeflag & HalfDCLK)) {
3926 if ((modeflag & Charx8Dot)) {
3927 temp += 4;
3928 if (pVBInfo->VGAHDE >= 800)
3929 temp -= 6;
3930 }
3931 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003932 } else if (!(modeflag & HalfDCLK)) {
3933 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003934 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003935 pVBInfo->VGAHDE >= 800) {
3936 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003937 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003938 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003939 (pVBInfo->LCDInfo & LCDNonExpanding))
3940 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303941 }
3942 }
3943 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003944
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003945 /* 0x07 Horizontal Retrace Start */
3946 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3947 /* 0x08 Horizontal Retrace End */
3948 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303950 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3951 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003952 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303953 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003954 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303955 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003956 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303957 0x08, 0x03);
3958 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003959 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303960 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003961 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 0x08, 0x02);
3963 }
3964 }
3965 }
3966 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003967
Aaro Koskinen8104e322011-03-13 12:26:22 +02003968 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003969 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003970 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303972 tempbx = pVBInfo->VGAVT;
3973 push1 = tempbx;
3974 tempcx = 0x121;
3975 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977 if (tempbx == 357)
3978 tempbx = 350;
3979 if (tempbx == 360)
3980 tempbx = 350;
3981 if (tempbx == 375)
3982 tempbx = 350;
3983 if (tempbx == 405)
3984 tempbx = 400;
3985 if (tempbx == 525)
3986 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003987
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303988 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003989
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303990 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003991 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003992 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303993 if (tempbx == 350)
3994 tempbx += 5;
3995 if (tempbx == 480)
3996 tempbx += 5;
3997 }
3998 }
3999 }
4000 tempbx--;
4001 temp = tempbx & 0x00FF;
4002 tempbx--;
4003 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004004 /* 0x10 vertical Blank Start */
4005 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304006 tempbx = push2;
4007 tempbx--;
4008 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004009 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304011 if (tempbx & 0x0100)
4012 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004013
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304014 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 if (modeflag & DoubleScanMode)
4017 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004018
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304019 if (tempbx & 0x0200)
4020 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004021
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304022 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004023 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004024
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304025 if (tempbx & 0x0400)
4026 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004027
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004028 /* 0x11 Vertival Blank End */
4029 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304030
4031 tempax = push1;
4032 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4033 tempax = tempax >> 2;
4034 push1 = tempax; /* push ax */
4035
4036 if (resinfo != 0x09) {
4037 tempax = tempax << 1;
4038 tempbx += tempax;
4039 }
4040
Peter Huewe599801f2012-02-09 21:11:45 +01004041 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02004042 if ((pVBInfo->VBType & VB_SIS301LV) &&
4043 !(pVBInfo->TVInfo & TVSetHiVision)) {
4044 if ((pVBInfo->TVInfo & TVSimuMode) &&
4045 (pVBInfo->TVInfo & TVSetPAL)) {
4046 if (!(pVBInfo->VBType & VB_SIS301LV) ||
4047 !(pVBInfo->TVInfo &
4048 (TVSetYPbPr525p |
4049 TVSetYPbPr750p |
4050 TVSetHiVision)))
4051 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304052 }
4053 } else {
4054 tempbx -= 10;
4055 }
4056 } else {
4057 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004058 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01004059 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004060 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004061 (TVSetYPbPr525p |
4062 TVSetYPbPr750p |
4063 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304064 tempbx += 40;
4065 } else {
4066 tempbx += 40;
4067 }
4068 }
4069 }
4070 }
4071 tempax = push1;
4072 tempax = tempax >> 2;
4073 tempax++;
4074 tempax += tempbx;
4075 push1 = tempax; /* push ax */
4076
Peter Huewe599801f2012-02-09 21:11:45 +01004077 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304078 if (tempbx <= 513) {
4079 if (tempax >= 513)
4080 tempbx = 513;
4081 }
4082 }
4083
4084 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004085 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304086 tempbx--;
4087 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004088 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304089
4090 if (tempbx & 0x0100)
4091 tempcx |= 0x0008;
4092
4093 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004094 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304095
4096 tempbx++;
4097
4098 if (tempbx & 0x0100)
4099 tempcx |= 0x0004;
4100
4101 if (tempbx & 0x0200)
4102 tempcx |= 0x0080;
4103
4104 if (tempbx & 0x0400)
4105 tempcx |= 0x0C00;
4106
4107 tempbx = push1; /* pop ax */
4108 temp = tempbx & 0x00FF;
4109 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004110 /* 0x0D vertical Retrace End */
4111 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304112
4113 if (tempbx & 0x0010)
4114 tempcx |= 0x2000;
4115
4116 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004117 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304118 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004119 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304120 tempax = modeflag;
4121 temp = (tempax & 0xFF00) >> 8;
4122
4123 temp = (temp >> 1) & 0x09;
4124
Peter Huewe6896b942012-02-09 21:11:46 +01004125 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304126 temp |= 0x01;
4127
Aaro Koskinen8104e322011-03-13 12:26:22 +02004128 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4129 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4130 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304131
4132 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4133 temp = 0x80;
4134 else
4135 temp = 0x00;
4136
Aaro Koskinen8104e322011-03-13 12:26:22 +02004137 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304138
4139 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004140}
4141
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004142static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304143 unsigned short RefreshRateTableIndex,
4144 struct xgi_hw_device_info *HwDeviceExtension,
4145 struct vb_device_info *pVBInfo)
4146{
4147 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4148 modeflag, resinfo, crt2crtc;
4149 unsigned char *TimingPoint;
4150
4151 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4152
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004153 /* si+Ext_ResInfo */
4154 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4155 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4156 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304157
4158 tempax = 0;
4159
4160 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4161 tempax |= 0x0800;
4162
4163 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4164 tempax |= 0x0400;
4165
4166 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4167 tempax |= 0x0200;
4168
Peter Huewe599801f2012-02-09 21:11:45 +01004169 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304170 tempax |= 0x1000;
4171
Peter Huewe599801f2012-02-09 21:11:45 +01004172 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304173 tempax |= 0x0100;
4174
Peter Huewe599801f2012-02-09 21:11:45 +01004175 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304176 tempax &= 0xfe00;
4177
4178 tempax = (tempax & 0xff00) >> 8;
4179
Aaro Koskinen8104e322011-03-13 12:26:22 +02004180 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304181 TimingPoint = pVBInfo->NTSCTiming;
4182
Peter Huewe599801f2012-02-09 21:11:45 +01004183 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184 TimingPoint = pVBInfo->PALTiming;
4185
Peter Huewe599801f2012-02-09 21:11:45 +01004186 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304187 TimingPoint = pVBInfo->HiTVExtTiming;
4188
4189 if (pVBInfo->VBInfo & SetInSlaveMode)
4190 TimingPoint = pVBInfo->HiTVSt2Timing;
4191
4192 if (pVBInfo->SetFlag & TVSimuMode)
4193 TimingPoint = pVBInfo->HiTVSt1Timing;
4194
4195 if (!(modeflag & Charx8Dot))
4196 TimingPoint = pVBInfo->HiTVTextTiming;
4197 }
4198
Peter Huewe599801f2012-02-09 21:11:45 +01004199 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4200 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304201 TimingPoint = pVBInfo->YPbPr525iTiming;
4202
Peter Huewe599801f2012-02-09 21:11:45 +01004203 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304204 TimingPoint = pVBInfo->YPbPr525pTiming;
4205
Peter Huewe599801f2012-02-09 21:11:45 +01004206 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304207 TimingPoint = pVBInfo->YPbPr750pTiming;
4208 }
4209
4210 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004211 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304212
4213 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004214 /* di->temp2[j] */
4215 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304216
4217 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004218 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304219
4220 temp = pVBInfo->NewFlickerMode;
4221 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004222 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304223
Peter Huewe599801f2012-02-09 21:11:45 +01004224 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304225 tempax = 950;
4226
Peter Huewe599801f2012-02-09 21:11:45 +01004227 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304228 tempax = 520;
4229 else
4230 tempax = 440;
4231
4232 if (pVBInfo->VDE <= tempax) {
4233 tempax -= pVBInfo->VDE;
4234 tempax = tempax >> 2;
4235 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4236 push1 = tempax;
4237 temp = (tempax & 0xFF00) >> 8;
4238 temp += (unsigned short) TimingPoint[0];
4239
Peter Huewe6896b942012-02-09 21:11:46 +01004240 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4241 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304242 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4243 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004244 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304245 tempcx = pVBInfo->VGAHDE;
4246 if (tempcx >= 1024) {
4247 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004248 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304249 temp = 0x19; /* PAL */
4250 }
4251 }
4252 }
4253
Aaro Koskinen8104e322011-03-13 12:26:22 +02004254 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304255 tempax = push1;
4256 temp = (tempax & 0xFF00) >> 8;
4257 temp += TimingPoint[1];
4258
Peter Huewe6896b942012-02-09 21:11:46 +01004259 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4260 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304261 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4262 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004263 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304264 tempcx = pVBInfo->VGAHDE;
4265 if (tempcx >= 1024) {
4266 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004267 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304268 temp = 0x52; /* PAL */
4269 }
4270 }
4271 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004272 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304273 }
4274
4275 /* 301b */
4276 tempcx = pVBInfo->HT;
4277
4278 if (XGI_IsLCDDualLink(pVBInfo))
4279 tempcx = tempcx >> 1;
4280
4281 tempcx -= 2;
4282 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004283 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304284
4285 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004286 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304287
4288 tempcx = pVBInfo->HT >> 1;
4289 push1 = tempcx; /* push cx */
4290 tempcx += 7;
4291
Peter Huewe599801f2012-02-09 21:11:45 +01004292 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304293 tempcx -= 4;
4294
4295 temp = tempcx & 0x00FF;
4296 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004297 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304298
4299 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4300 tempbx += tempcx;
4301 push2 = tempbx;
4302 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004303 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304 temp = (tempbx & 0xFF00) >> 8;
4305 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004306 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304307
4308 tempbx = push2;
4309 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004310 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304311 tempbx = tempbx - 4;
4312 tempcx = tempbx;
4313 }
4314
4315 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004316 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304317
4318 j += 2;
4319 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4320 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004321 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304322 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004323 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304324
4325 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004326 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304327 tempcx -= 4;
4328
4329 temp = tempcx & 0xFF;
4330 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004331 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304332
4333 tempcx = push1; /* pop cx */
4334 j += 2;
4335 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4336 tempcx -= temp;
4337 temp = tempcx & 0x00FF;
4338 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004339 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304340
4341 tempcx -= 11;
4342
4343 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4344 tempax = XGI_GetVGAHT2(pVBInfo);
4345 tempcx = tempax - 1;
4346 }
4347 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004348 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349
4350 tempbx = pVBInfo->VDE;
4351
4352 if (pVBInfo->VGAVDE == 360)
4353 tempbx = 746;
4354 if (pVBInfo->VGAVDE == 375)
4355 tempbx = 746;
4356 if (pVBInfo->VGAVDE == 405)
4357 tempbx = 853;
4358
4359 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004360 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004361 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004362 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004363 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304364 tempbx = tempbx >> 1;
4365 } else
4366 tempbx = tempbx >> 1;
4367 }
4368
4369 tempbx -= 2;
4370 temp = tempbx & 0x00FF;
4371
Peter Huewe599801f2012-02-09 21:11:45 +01004372 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004373 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004374 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304375 if (pVBInfo->VBInfo & SetInSlaveMode) {
4376 if (ModeNo == 0x2f)
4377 temp += 1;
4378 }
4379 }
4380 } else {
4381 if (pVBInfo->VBInfo & SetInSlaveMode) {
4382 if (ModeNo == 0x2f)
4383 temp += 1;
4384 }
4385 }
4386 }
4387
Aaro Koskinen8104e322011-03-13 12:26:22 +02004388 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304389
4390 temp = (tempcx & 0xFF00) >> 8;
4391 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4392
Peter Huewe599801f2012-02-09 21:11:45 +01004393 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004394 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004395 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304396 temp |= 0x10;
4397
4398 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4399 temp |= 0x20;
4400 }
4401 } else {
4402 temp |= 0x10;
4403 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4404 temp |= 0x20;
4405 }
4406 }
4407
Aaro Koskinen8104e322011-03-13 12:26:22 +02004408 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304409
Peter Huewe6896b942012-02-09 21:11:46 +01004410 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4411 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304412 tempbx = pVBInfo->VDE;
4413 tempcx = tempbx - 2;
4414
4415 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004416 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4417 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304418 tempbx = tempbx >> 1;
4419 }
4420
Peter Huewe6896b942012-02-09 21:11:46 +01004421 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304422 temp = 0;
4423 if (tempcx & 0x0400)
4424 temp |= 0x20;
4425
4426 if (tempbx & 0x0400)
4427 temp |= 0x40;
4428
Aaro Koskinen8104e322011-03-13 12:26:22 +02004429 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304430 }
4431
4432 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004433 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304434 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004435 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304436 }
4437
4438 tempbx = tempbx & 0x00FF;
4439
4440 if (!(modeflag & HalfDCLK)) {
4441 tempcx = pVBInfo->VGAHDE;
4442 if (tempcx >= pVBInfo->HDE) {
4443 tempbx |= 0x2000;
4444 tempax &= 0x00FF;
4445 }
4446 }
4447
4448 tempcx = 0x0101;
4449
4450 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4451 if (pVBInfo->VGAHDE >= 1024) {
4452 tempcx = 0x1920;
4453 if (pVBInfo->VGAHDE >= 1280) {
4454 tempcx = 0x1420;
4455 tempbx = tempbx & 0xDFFF;
4456 }
4457 }
4458 }
4459
4460 if (!(tempbx & 0x2000)) {
4461 if (modeflag & HalfDCLK)
4462 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4463
4464 push1 = tempbx;
4465 tempeax = pVBInfo->VGAHDE;
4466 tempebx = (tempcx & 0xFF00) >> 8;
4467 longtemp = tempeax * tempebx;
4468 tempecx = tempcx & 0x00FF;
4469 longtemp = longtemp / tempecx;
4470
4471 /* 301b */
4472 tempecx = 8 * 1024;
4473
Peter Huewe6896b942012-02-09 21:11:46 +01004474 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4475 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304476 tempecx = tempecx * 8;
4477 }
4478
4479 longtemp = longtemp * tempecx;
4480 tempecx = pVBInfo->HDE;
4481 temp2 = longtemp % tempecx;
4482 tempeax = longtemp / tempecx;
4483 if (temp2 != 0)
4484 tempeax += 1;
4485
4486 tempax = (unsigned short) tempeax;
4487
4488 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004489 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4490 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304491 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4492 }
4493 /* end 301b */
4494
4495 tempbx = push1;
4496 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4497 | (tempbx & 0x00FF));
4498 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4499 | (tempax & 0x00FF));
4500 temp = (tempax & 0xFF00) >> 8;
4501 } else {
4502 temp = (tempax & 0x00FF) >> 8;
4503 }
4504
Aaro Koskinen8104e322011-03-13 12:26:22 +02004505 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304506 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004507 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 temp = tempcx & 0x00FF;
4509
4510 if (tempbx & 0x2000)
4511 temp = 0;
4512
4513 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4514 temp |= 0x18;
4515
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004516 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004517 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304518 tempbx = 0x0382;
4519 tempcx = 0x007e;
4520 } else {
4521 tempbx = 0x0369;
4522 tempcx = 0x0061;
4523 }
4524
4525 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004526 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304527 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004528 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304529
4530 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4531 temp = temp << 2;
4532 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4533
Peter Huewe599801f2012-02-09 21:11:45 +01004534 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304535 temp |= 0x10;
4536
Peter Huewe599801f2012-02-09 21:11:45 +01004537 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304538 temp |= 0x20;
4539
Peter Huewe599801f2012-02-09 21:11:45 +01004540 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304541 temp |= 0x60;
4542 }
4543
Aaro Koskinen8104e322011-03-13 12:26:22 +02004544 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004545 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004546 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304547
Peter Huewe599801f2012-02-09 21:11:45 +01004548 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 if (pVBInfo->TVInfo & NTSC1024x768) {
4550 TimingPoint = XGI_NTSC1024AdjTime;
4551 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004552 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 TimingPoint[j]);
4554 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004555 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304556 }
4557 }
4558
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004559 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304560 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004561 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004562 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304563 0x08); /* PALM Mode */
4564 }
4565
Peter Huewe599801f2012-02-09 21:11:45 +01004566 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004567 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304568 0x01);
4569 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004570 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304571
Aaro Koskinendc505562011-03-13 12:26:26 +02004572 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304573 }
4574
Peter Huewe599801f2012-02-09 21:11:45 +01004575 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304576 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004577 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304578 }
4579
4580 if (pVBInfo->VBInfo & SetCRT2ToTV)
4581 return;
4582}
4583
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004584static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304585 struct xgi_hw_device_info *HwDeviceExtension,
4586 unsigned short RefreshRateTableIndex,
4587 struct vb_device_info *pVBInfo)
4588{
4589 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4590 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4591
4592 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4593
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004594 /* si+Ext_ResInfo */
4595 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4596 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4597 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4598 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304599
4600 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4601 return;
4602
4603 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4604
4605 if (XGI_IsLCDDualLink(pVBInfo))
4606 tempbx = tempbx >> 1;
4607
4608 tempbx -= 1;
4609 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004610 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304611 temp = (tempbx & 0xFF00) >> 8;
4612 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004613 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304614 temp = 0x01;
4615
Aaro Koskinen8104e322011-03-13 12:26:22 +02004616 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304617 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4618 push1 = tempbx;
4619 tempbx--;
4620 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004621 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304622 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004623 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624
4625 tempcx = pVBInfo->VT - 1;
4626 push2 = tempcx + 1;
4627 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004628 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304629 temp = (tempcx & 0xFF00) >> 8;
4630 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004631 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004632 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4633 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4634 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4635 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304636
4637 /* Customized LCDB Des no add */
4638 tempbx = 5;
4639 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
4640 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4641 tempah = pVBInfo->LCDResInfo;
4642 tempah &= PanelResInfo;
4643
Peter Huewe255aabd2012-02-09 21:11:44 +01004644 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304645 tempbx = 1024;
4646 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004647 } else if ((tempah == Panel_1280x1024) ||
4648 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304649 tempbx = 1280;
4650 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004651 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304652 tempbx = 1400;
4653 tempcx = 1050;
4654 } else {
4655 tempbx = 1600;
4656 tempcx = 1200;
4657 }
4658
4659 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4660 tempbx = pVBInfo->HDE;
4661 tempcx = pVBInfo->VDE;
4662 }
4663
4664 pushbx = tempbx;
4665 tempax = pVBInfo->VT;
4666 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4667 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4668 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4669 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4670 tempbx = pVBInfo->LCDVDES;
4671 tempcx += tempbx;
4672
4673 if (tempcx >= tempax)
4674 tempcx -= tempax; /* lcdvdes */
4675
4676 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004677 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304678 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004679 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304680 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4681 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4682 tempah = tempch;
4683 tempah = tempah << 3;
4684 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004685 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304686
4687 /* getlcdsync() */
4688 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4689 tempcx = tempbx;
4690 tempax = pVBInfo->VT;
4691 tempbx = pVBInfo->LCDVRS;
4692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304693 tempcx += tempbx;
4694 if (tempcx >= tempax)
4695 tempcx -= tempax;
4696
4697 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004698 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304699 temp = (tempbx & 0xFF00) >> 8;
4700 temp = temp << 4;
4701 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004702 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304703 tempcx = pushbx;
4704 tempax = pVBInfo->HT;
4705 tempbx = pVBInfo->LCDHDES;
4706 tempbx &= 0x0FFF;
4707
4708 if (XGI_IsLCDDualLink(pVBInfo)) {
4709 tempax = tempax >> 1;
4710 tempbx = tempbx >> 1;
4711 tempcx = tempcx >> 1;
4712 }
4713
Peter Huewe6896b942012-02-09 21:11:46 +01004714 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304715 tempbx += 1;
4716
4717 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4718 tempbx += 1;
4719
4720 tempcx += tempbx;
4721
4722 if (tempcx >= tempax)
4723 tempcx -= tempax;
4724
4725 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004726 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304727 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004728 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304729 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004730 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304731 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004732 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304734 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4735 tempcx = tempax;
4736 tempax = pVBInfo->HT;
4737 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304738 if (XGI_IsLCDDualLink(pVBInfo)) {
4739 tempax = tempax >> 1;
4740 tempbx = tempbx >> 1;
4741 tempcx = tempcx >> 1;
4742 }
4743
Peter Huewe6896b942012-02-09 21:11:46 +01004744 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304745 tempbx += 1;
4746
4747 tempcx += tempbx;
4748
4749 if (tempcx >= tempax)
4750 tempcx -= tempax;
4751
4752 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004753 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304754
4755 temp = (tempbx & 0xFF00) >> 8;
4756 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004757 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304758 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004759 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304760
Peter Huewea3d675c2012-02-09 21:11:47 +01004761 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304762 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004763 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4764 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304765 | VB_XGI301C)) {
4766 temp = 0xC6;
4767 } else
4768 temp = 0xC4;
4769
Aaro Koskinen8104e322011-03-13 12:26:22 +02004770 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4771 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 }
4773
4774 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004775 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4776 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777 | VB_XGI301C)) {
4778 temp = 0x4F;
4779 } else
4780 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004781 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 }
4783 }
4784}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
4786/* --------------------------------------------------------------------- */
4787/* Function : XGI_GetTap4Ptr */
4788/* Input : */
4789/* Output : di -> Tap4 Reg. Setting Pointer */
4790/* Description : */
4791/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004792static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304793 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004794{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304795 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304799 if (tempcx == 0) {
4800 tempax = pVBInfo->VGAHDE;
4801 tempbx = pVBInfo->HDE;
4802 } else {
4803 tempax = pVBInfo->VGAVDE;
4804 tempbx = pVBInfo->VDE;
4805 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004807 if (tempax <= tempbx)
4808 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304809 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004810 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004811
Peter Huewe599801f2012-02-09 21:11:45 +01004812 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304813 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004814
Peter Huewe599801f2012-02-09 21:11:45 +01004815 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4816 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4817 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004818 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004819 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 Tap4TimingPtr = YPbPr750pTap4Timing;
4821 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004822
Peter Huewe599801f2012-02-09 21:11:45 +01004823 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004824 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304826 i = 0;
4827 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4828 if (Tap4TimingPtr[i].DE == tempax)
4829 break;
4830 i++;
4831 }
4832 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004833}
4834
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004835static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004836{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304837 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304839 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 if (!(pVBInfo->VBType & VB_XGI301C))
4842 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304844 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4845 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004846 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004847
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004848 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004849 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004850 /* Set Vertical Scaling */
4851 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304852 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004853 xgifb_reg_set(pVBInfo->Part2Port,
4854 i,
4855 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304856 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004857
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004858 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004859 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004860 /* Enable V.Scaling */
4861 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304862 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004863 /* Enable H.Scaling */
4864 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004865}
4866
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004867static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304868 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004869{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304870 unsigned short i;
4871 unsigned char *tempdi;
4872 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004873
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004874 /* si+Ext_ResInfo */
4875 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004876
Aaro Koskinen8104e322011-03-13 12:26:22 +02004877 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004878 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004879 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4880 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304881 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004882 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4883 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304884 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004885
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304886 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4887 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004888
Peter Huewe599801f2012-02-09 21:11:45 +01004889 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004890 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4891 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4892 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304893 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004894
Peter Huewe599801f2012-02-09 21:11:45 +01004895 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4896 & SetCRT2ToYPbPr525750)) {
4897 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304898 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004899
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304900 tempdi = pVBInfo->HiTVGroup3Data;
4901 if (pVBInfo->SetFlag & TVSimuMode) {
4902 tempdi = pVBInfo->HiTVGroup3Simu;
4903 if (!(modeflag & Charx8Dot))
4904 tempdi = pVBInfo->HiTVGroup3Text;
4905 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004906
Peter Huewe599801f2012-02-09 21:11:45 +01004907 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004909
Peter Huewe599801f2012-02-09 21:11:45 +01004910 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304911 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304913 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004914 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304916 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004917 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004918 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304919 }
4920 }
4921 return;
4922} /* {end of XGI_SetGroup3} */
4923
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004924static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 unsigned short RefreshRateTableIndex,
4926 struct xgi_hw_device_info *HwDeviceExtension,
4927 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004928{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304929 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304931 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004932
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004933 /* si+Ext_ResInfo */
4934 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304935 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004936 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004937
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304938 tempbx = pVBInfo->RVBHCMAX;
4939 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004940 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304941 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4942 tempcx = pVBInfo->VGAHT - 1;
4943 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004944 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004945
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304946 temp = ((tempcx & 0xFF00) >> 8) << 3;
4947 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004948
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304949 tempcx = pVBInfo->VGAVT - 1;
4950 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4951 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304953 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004954 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304955 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004956 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004957 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 tempcx = pVBInfo->VBInfo;
4959 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304961 if (modeflag & HalfDCLK)
4962 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304964 if (XGI_IsLCDDualLink(pVBInfo))
4965 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004966
Peter Huewe599801f2012-02-09 21:11:45 +01004967 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304968 temp = 0;
4969 if (tempbx <= 1024)
4970 temp = 0xA0;
4971 if (tempbx == 1280)
4972 temp = 0xC0;
4973 } else if (tempcx & SetCRT2ToTV) {
4974 temp = 0xA0;
4975 if (tempbx <= 800)
4976 temp = 0x80;
4977 } else {
4978 temp = 0x80;
4979 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4980 temp = 0;
4981 if (tempbx > 800)
4982 temp = 0x60;
4983 }
4984 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004985
Peter Huewe599801f2012-02-09 21:11:45 +01004986 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304987 temp = 0x00;
4988 if (pVBInfo->VGAHDE == 1280)
4989 temp = 0x40;
4990 if (pVBInfo->VGAHDE == 1024)
4991 temp = 0x20;
4992 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004993 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304995 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Peter Huewe599801f2012-02-09 21:11:45 +01004997 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304998 if (!(temp & 0xE000))
4999 tempbx = tempbx >> 1;
5000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305002 tempcx = pVBInfo->RVBHRS;
5003 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005004 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305006 tempeax = pVBInfo->VGAVDE;
5007 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305009 if (tempeax <= tempebx) {
5010 tempcx = (tempcx & (~0x4000));
5011 tempeax = pVBInfo->VGAVDE;
5012 } else {
5013 tempeax -= tempebx;
5014 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 templong = (tempeax * 256 * 1024) % tempebx;
5017 tempeax = (tempeax * 256 * 1024) / tempebx;
5018 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305020 if (templong != 0)
5021 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005022
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305023 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005024 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005025
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305026 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005027 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305028 tempbx = (unsigned short) (tempebx >> 16);
5029 temp = tempbx & 0x00FF;
5030 temp = temp << 4;
5031 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005032 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005033
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305034 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005035 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5036 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305037 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005038 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305039 tempax = pVBInfo->VGAHDE;
5040 if (modeflag & HalfDCLK)
5041 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005042
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043 if (XGI_IsLCDDualLink(pVBInfo))
5044 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005045
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305046 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5047 if (tempax > 800)
5048 tempax -= 800;
5049 } else {
5050 if (pVBInfo->VGAHDE > 800) {
5051 if (pVBInfo->VGAHDE == 1024)
5052 tempax = (tempax * 25 / 32) - 1;
5053 else
5054 tempax = (tempax * 20 / 32) - 1;
5055 }
5056 }
5057 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305059 temp = (tempax & 0xFF00) >> 8;
5060 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005061 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305062 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005063 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005064
Peter Huewe599801f2012-02-09 21:11:45 +01005065 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305066 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005067 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305069 }
5070 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005071
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305072 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5073 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01005074 | TVSetYPbPr525p | TVSetYPbPr750p
5075 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305076 temp |= 0x0001;
5077 if ((pVBInfo->VBInfo & SetInSlaveMode)
5078 && (!(pVBInfo->TVInfo
5079 & TVSimuMode)))
5080 temp &= (~0x0001);
5081 }
5082 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005083
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005084 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305085 tempbx = pVBInfo->HT;
5086 if (XGI_IsLCDDualLink(pVBInfo))
5087 tempbx = tempbx >> 1;
5088 tempbx = (tempbx >> 1) - 2;
5089 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005090 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305091 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005092 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305093 }
5094 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305096 if (pVBInfo->ISXPDOS == 0)
5097 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5098 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005099}
5100
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005101static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5102{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005103 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005104}
5105
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005106static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305107 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005108{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305109 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305111 Pindex = pVBInfo->Part5Port;
5112 Pdata = pVBInfo->Part5Port + 1;
5113 if (pVBInfo->ModeType == ModeVGA) {
5114 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005115 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305116 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305117 }
5118 }
5119 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005120}
5121
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005122static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305123 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005124{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005125 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005126}
5127
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005128static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005130{
5131
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005132 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005133}
5134
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005135static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5136 unsigned short ModeNo, unsigned short ModeIdIndex,
5137 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005138{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005139 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005140
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 /= 9;
5149 xres *= 8;
5150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005151
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005152 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5153 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005154
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005155 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5156 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005157
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005158 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305159 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005160
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005161 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 return 0;
5163
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005164 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5165 yres != xgifb_info->lvds_data.LVDSVDE) {
5166 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
5167 if (colordepth > 2)
5168 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305169 }
5170 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005171}
5172
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005173static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5174 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005175 unsigned short ModeNo,
5176 unsigned short ModeIdIndex,
5177 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005178{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305179 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005180 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305181 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5182 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5183 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005184
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005185 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005186 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305187 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005188 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005189
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005190 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005191
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005192 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005193 /* SR35[7] FP VSync polarity */
5194 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5195 /* SR30[5] FP HSync polarity */
5196 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005197
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005198 if (chip_id == XG27)
5199 XGI_SetXG27FPBits(pVBInfo);
5200 else
5201 XGI_SetXG21FPBits(pVBInfo);
5202
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03005203 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005204 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5205 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
5206 /* si+St_ModeFlag */
5207 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305209 if (!(modeflag & Charx8Dot))
5210 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005211
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005212 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005213
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005214 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005215
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305216 if (LVDSHBS > LVDSHT)
5217 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005218
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005219 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305220 if (LVDSHRS > LVDSHT)
5221 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005222
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005223 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305224 if (LVDSHRE > LVDSHT)
5225 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005226
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005227 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005228
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005229 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005230
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005231 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005232 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305233 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305235 if (LVDSVBS > LVDSVT)
5236 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005237
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005238 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305239 if (LVDSVRS > LVDSVT)
5240 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005241
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005242 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305243 if (LVDSVRE > LVDSVT)
5244 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005245
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005246 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005247
Aaro Koskinen58839b02011-03-13 12:26:23 +02005248 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005249 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005252 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305254 /* HT SR0B[1:0] CR00 */
5255 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005256 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005257 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005258
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305259 /* HBS SR0B[5:4] CR02 */
5260 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005261 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005262 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005263
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305264 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5265 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005266 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5267 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5268 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305270 /* HRS SR0B[7:6] CR04 */
5271 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005272 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005273 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005274
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305275 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5276 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005277 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005278 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305280 /* HRE SR0C[2] CR05[4:0] */
5281 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005282 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5283 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305285 /* Panel HRE SR2F[7:2] */
5286 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005287 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005288
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305289 /* VT SR0A[0] CR07[5][0] CR06 */
5290 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005291 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5292 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5293 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005294 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005295
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305296 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5297 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005298 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5299 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5300 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005301 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005302
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305303 /* VBE SR0A[4] CR16 */
5304 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005305 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005306 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005307
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305308 /* VRS SR0A[3] CR7[7][2] CR10 */
5309 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005310 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5311 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5312 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005313 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005314
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005315 if (chip_id == XG27) {
5316 /* Panel VRS SR35[2:0] SR34[7:0] */
5317 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5318 (value & 0x700) >> 8);
5319 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5320 } else {
5321 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5322 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5323 (value & 0x600) >> 9);
5324 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5325 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5326 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305328 /* VRE SR0A[5] CR11[3:0] */
5329 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005330 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5331 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005332
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305333 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005334 if (chip_id == XG27)
5335 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5336 (value << 2) & 0xFC);
5337 else
5338 /* SR3F[7] has to be 0, h/w bug */
5339 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5340 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305342 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005343
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005344 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005345 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005346 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005347 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005348 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305349 value += 0x10;
5350 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305352 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005353 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005354 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005355 /* set data, panning = 0, shift left 1 dot*/
5356 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005357
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005358 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005359 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305360
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005361 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305362 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005363
5364}
5365
5366/* --------------------------------------------------------------------- */
5367/* Function : XGI_IsLCDON */
5368/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005369/* Output : 0 : Skip PSC Control */
5370/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005371/* Description : */
5372/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005373static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005374{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305375 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305377 tempax = pVBInfo->VBInfo;
5378 if (tempax & SetCRT2ToDualEdge)
5379 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005380 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305381 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005382
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305383 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005384}
5385
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005386/* --------------------------------------------------------------------- */
5387/* Function : XGI_DisableChISLCD */
5388/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005389/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005390/* Description : */
5391/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005392static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005393{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305394 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305396 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005397 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005398
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305399 if (tempbx & (EnableChA | DisableChA)) {
5400 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5401 return 0;
5402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305404 if (!(tempbx & (EnableChB | DisableChB)))
5405 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 if (tempah & 0x01) /* Chk LCDB Mode */
5408 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005409
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305410 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005411}
5412
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005413/* --------------------------------------------------------------------- */
5414/* Function : XGI_EnableChISLCD */
5415/* Input : */
5416/* Output : 0 -> Not LCD mode */
5417/* Description : */
5418/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005419static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005420{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305421 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305423 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005424 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305426 if (tempbx & (EnableChA | DisableChA)) {
5427 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5428 return 0;
5429 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005430
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305431 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005432 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305434 if (tempah & 0x01) /* Chk LCDB Mode */
5435 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005436
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305437 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005438}
5439
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005440static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5441 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305442 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005443{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005444 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005445
Peter Huewe6896b942012-02-09 21:11:46 +01005446 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5447 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305448 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005449 if (!(pVBInfo->VBInfo &
5450 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005451 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305452 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5453 tempah = 0x7F; /* Disable Channel A */
Peter Huewea3d675c2012-02-09 21:11:47 +01005454 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005455 /* Disable Channel B */
5456 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305458 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005459 /* force to disable Cahnnel */
5460 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005461
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305462 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005463 /* Force to disable Channel B */
5464 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305465 }
5466 }
5467 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005468
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005469 /* disable part4_1f */
5470 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005471
Peter Huewe6896b942012-02-09 21:11:46 +01005472 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005473 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305474 || (XGI_DisableChISLCD(pVBInfo))
5475 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005476 /* LVDS Driver power down */
5477 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305478 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305480 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005481 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305482 | SetSimuScanMode))) {
5483 if (pVBInfo->SetFlag & GatingCRT)
5484 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005485 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305486 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005487
Peter Huewea3d675c2012-02-09 21:11:47 +01005488 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305489 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005490 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005491 /* Power down */
5492 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005494
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005495 /* disable TV as primary VGA swap */
5496 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305498 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005499 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005500
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005501 if ((pVBInfo->SetFlag & DisableChB) ||
5502 (pVBInfo->VBInfo &
5503 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005504 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005505 (pVBInfo->VBInfo &
5506 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005507 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005508
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005509 if ((pVBInfo->SetFlag & DisableChB) ||
5510 (pVBInfo->VBInfo &
5511 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005512 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005513 (pVBInfo->VBInfo &
5514 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5515 /* save Part1 index 0 */
5516 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5517 /* BTDAC = 1, avoid VB reset */
5518 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5519 /* disable CRT2 */
5520 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5521 /* restore Part1 index 0 */
5522 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305523 }
5524 } else { /* {301} */
5525 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005526 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5527 /* Disable CRT2 */
5528 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5529 /* Disable TV asPrimary VGA swap */
5530 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305531 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005532
Peter Huewea3d675c2012-02-09 21:11:47 +01005533 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305534 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005535 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305536 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005537}
5538
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005539/* --------------------------------------------------------------------- */
5540/* Function : XGI_GetTVPtrIndex */
5541/* Input : */
5542/* Output : */
5543/* Description : bx 0 : ExtNTSC */
5544/* 1 : StNTSC */
5545/* 2 : ExtPAL */
5546/* 3 : StPAL */
5547/* 4 : ExtHiTV */
5548/* 5 : StHiTV */
5549/* 6 : Ext525i */
5550/* 7 : St525i */
5551/* 8 : Ext525p */
5552/* 9 : St525p */
5553/* A : Ext750p */
5554/* B : St750p */
5555/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005556static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005557{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305558 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005559
Peter Huewe599801f2012-02-09 21:11:45 +01005560 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305561 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005562 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305563 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005564 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305565 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005566 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305567 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005568 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305569 tempbx = 10;
5570 if (pVBInfo->TVInfo & TVSimuMode)
5571 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005572
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305573 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005574}
5575
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005576/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005577/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005578/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005579/* Output : bx 0 : NTSC */
5580/* 1 : PAL */
5581/* 2 : PALM */
5582/* 3 : PALN */
5583/* 4 : NTSC1024x768 */
5584/* 5 : PAL-M 1024x768 */
5585/* 6-7: reserved */
5586/* cl 0 : YFilter1 */
5587/* 1 : YFilter2 */
5588/* ch 0 : 301A */
5589/* 1 : 301B/302B/301LV/302LV */
5590/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005591/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005592static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5593 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005594{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005595 *tempbx = 0;
5596 *tempcl = 0;
5597 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005598
Peter Huewe599801f2012-02-09 21:11:45 +01005599 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005600 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005601
Peter Huewe599801f2012-02-09 21:11:45 +01005602 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005603 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005604
Peter Huewe599801f2012-02-09 21:11:45 +01005605 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005606 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005607
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005608 if (pVBInfo->TVInfo & NTSC1024x768) {
5609 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005610 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005611 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305612 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005613
Peter Huewe6896b942012-02-09 21:11:46 +01005614 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5615 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005616 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5617 & TVSimuMode)) {
5618 *tempbx += 8;
5619 *tempcl += 1;
5620 }
5621 }
5622
Peter Huewe6896b942012-02-09 21:11:46 +01005623 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5624 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005625 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005626}
5627
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005628static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005629{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305630 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005631
Peter Huewe6896b942012-02-09 21:11:46 +01005632 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5633 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005634 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305636 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005637 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305639 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5640 tempbl = tempbl >> 4;
Peter Huewea3d675c2012-02-09 21:11:47 +01005641 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005642 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005643
Peter Huewea3d675c2012-02-09 21:11:47 +01005644 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305645 tempbl = tempbh;
5646 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 tempbl &= 0x0F;
5649 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005650 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305652 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5653 | SetCRT2ToTV)) { /* Channel B */
5654 tempah &= 0xF0;
5655 tempah |= tempbl;
5656 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005657
Peter Huewea3d675c2012-02-09 21:11:47 +01005658 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) { /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305659 tempah &= 0x0F;
5660 tempah |= tempbh;
5661 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005662 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305663 }
5664 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5665 tempbl = 0;
5666 tempbh = 0;
5667 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005668 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305669 tempah &= 0x0f;
5670 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005671 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305672 tempah);
5673 }
5674 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005675}
5676
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005677static void XGI_SetLCDCap_A(unsigned short tempcx,
5678 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005679{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305680 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681
Aaro Koskinen58839b02011-03-13 12:26:23 +02005682 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305684 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005685 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005686 /* Enable Dither */
5687 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005688 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305689 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005690 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305691 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005692 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005694}
5695
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005696/* --------------------------------------------------------------------- */
5697/* Function : XGI_SetLCDCap_B */
5698/* Input : cx -> LCD Capability */
5699/* Output : */
5700/* Description : */
5701/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005702static void XGI_SetLCDCap_B(unsigned short tempcx,
5703 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005704{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305705 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005706 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305707 (unsigned short) (((tempcx & 0x00ff) >> 6)
5708 | 0x0c));
5709 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005710 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305711 (unsigned short) (((tempcx & 0x00ff) >> 6)
5712 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005713}
5714
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005715static void XGI_LongWait(struct vb_device_info *pVBInfo)
5716{
5717 unsigned short i;
5718
5719 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5720
5721 if (!(i & 0xC0)) {
5722 for (i = 0; i < 0xFFFF; i++) {
5723 if (!(inb(pVBInfo->P3da) & 0x08))
5724 break;
5725 }
5726
5727 for (i = 0; i < 0xFFFF; i++) {
5728 if ((inb(pVBInfo->P3da) & 0x08))
5729 break;
5730 }
5731 }
5732}
5733
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005734static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005735{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305736 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305738 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005739
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005740 /* disable down spectrum D[4] */
5741 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005743 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305744 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005745
Aaro Koskinen8104e322011-03-13 12:26:22 +02005746 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305747 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005748 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305749 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005750 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305751 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005752 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305753 pVBInfo->LCDCapList[index].Spectrum_34);
5754 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005755 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005756}
5757
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005758static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5759{
5760 unsigned short tempcx;
5761
5762 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5763
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005764 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005765 (VB_SIS301B |
5766 VB_SIS302B |
5767 VB_SIS301LV |
5768 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005769 VB_XGI301C)) { /* 301LV/302LV only */
5770 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005771 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005772 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005773 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005774 (unsigned char) (tempcx & 0x1F));
5775 }
5776 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005777 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005778 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5779 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5780 | EnablePLLSPLOW)) >> 8));
5781 }
5782
Peter Huewe6896b942012-02-09 21:11:46 +01005783 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5784 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005785 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5786 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005787 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005788 XGI_SetLCDCap_A(tempcx, pVBInfo);
5789
Peter Huewe6896b942012-02-09 21:11:46 +01005790 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005791 if (tempcx & EnableSpectrum)
5792 SetSpectrum(pVBInfo);
5793 }
5794 } else {
5795 /* LVDS,CH7017 */
5796 XGI_SetLCDCap_A(tempcx, pVBInfo);
5797 }
5798}
5799
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005800/* --------------------------------------------------------------------- */
5801/* Function : XGI_SetAntiFlicker */
5802/* Input : */
5803/* Output : */
5804/* Description : Set TV Customized Param. */
5805/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005806static void XGI_SetAntiFlicker(unsigned short ModeNo,
5807 unsigned short ModeIdIndex,
5808 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005809{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005810 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005811
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305812 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005813
Peter Huewe599801f2012-02-09 21:11:45 +01005814 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305815 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305817 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5818 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305819 tempah = TVAntiFlickList[tempbx];
5820 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005821
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005822 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005823}
5824
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005825static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5826 unsigned short ModeIdIndex,
5827 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005828{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005829 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305831 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305833 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5834 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305835 tempah = TVEdgeList[tempbx];
5836 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005837
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005838 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005839}
5840
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005841static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005842{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305843 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305845 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305847 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005848
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305849 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5850 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005851
Aaro Koskinen8104e322011-03-13 12:26:22 +02005852 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305853 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005854 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305855 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005856 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305857 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005858 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305859 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005860}
5861
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005862static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305863 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005864{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305865 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305867 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305869 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305871 switch (tempbx) {
5872 case 0x00:
5873 case 0x04:
5874 filterPtr = NTSCYFilter1;
5875 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305877 case 0x01:
5878 filterPtr = PALYFilter1;
5879 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005880
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305881 case 0x02:
5882 case 0x05:
5883 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305884 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005885 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305886 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305888 case 0x08:
5889 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305890 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305891 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305892 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005893 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305894 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005895
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305896 default:
5897 return;
5898 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005899
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005900 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305901 if (tempcl == 0)
5902 index = tempal * 4;
5903 else
5904 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305906 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005907 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5908 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5909 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5910 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305911 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005912 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5913 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5914 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5915 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305916 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005917
Peter Huewe6896b942012-02-09 21:11:46 +01005918 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5919 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005920 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5921 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5922 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305923 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005924}
5925
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005926/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005927/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005928/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005929/* Output : */
5930/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005931/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005932static void XGI_OEM310Setting(unsigned short ModeNo,
5933 unsigned short ModeIdIndex,
5934 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005935{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005936 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005937
Peter Huewea3d675c2012-02-09 21:11:47 +01005938 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005939 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005940
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005941 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005942 XGI_SetPhaseIncr(pVBInfo);
5943 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5944 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005945
Peter Huewe6896b942012-02-09 21:11:46 +01005946 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005947 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305948 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005949}
5950
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005951/* --------------------------------------------------------------------- */
5952/* Function : XGI_SetCRT2ModeRegs */
5953/* Input : */
5954/* Output : */
5955/* Description : Origin code for crt2group */
5956/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005957static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305958 struct xgi_hw_device_info *HwDeviceExtension,
5959 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005960{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305961 unsigned short tempbl;
5962 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305964 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005965
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305966 tempah = 0;
5967 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005968 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305969 tempah &= ~0x10; /* BTRAMDAC */
5970 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305972 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5973 | SetCRT2ToLCD)) {
5974 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005975 tempcl = pVBInfo->ModeType;
5976 tempcl -= ModeVGA;
5977 if (tempcl >= 0) {
5978 /* BT Color */
5979 tempah = (0x008 >> tempcl);
5980 if (tempah == 0)
5981 tempah = 1;
5982 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305983 }
5984 if (pVBInfo->VBInfo & SetInSlaveMode)
5985 tempah ^= 0x50; /* BTDAC */
5986 }
5987 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005988
Aaro Koskinen8104e322011-03-13 12:26:22 +02005989 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305990 tempah = 0x08;
5991 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Miguel Gómeze123e462012-07-06 12:40:52 +02005993 if (pVBInfo->VBInfo & DisableCRT2Display)
5994 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005995
Miguel Gómeze123e462012-07-06 12:40:52 +02005996 tempah = 0x00;
5997 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005998
Miguel Gómeze123e462012-07-06 12:40:52 +02005999 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
6000 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
6001 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006002
Miguel Gómeze123e462012-07-06 12:40:52 +02006003 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6004 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
6005 tempbl &= 0xf7;
6006 tempah |= 0x01;
6007 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306008 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006009
Miguel Gómeze123e462012-07-06 12:40:52 +02006010 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6011 tempbl &= 0xf7;
6012 tempah |= 0x01;
6013 }
6014
6015 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
6016 goto reg_and_or;
6017
6018 tempbl &= 0xf8;
6019 tempah = 0x01;
6020
6021 if (!(pVBInfo->VBInfo & SetInSlaveMode))
6022 tempah |= 0x02;
6023
6024 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6025 tempah = tempah ^ 0x05;
6026 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
6027 tempah = tempah ^ 0x01;
6028 }
6029
6030 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6031 tempah |= 0x08;
6032
6033reg_and_or:
6034 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
6035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306036 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006037 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306038 tempah &= (~0x08);
6039 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
6040 & SetInSlaveMode))) {
6041 tempah |= 0x010;
6042 }
6043 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006044
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306045 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306046 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006047 if (pVBInfo->VBInfo & DriverMode)
6048 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306049 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006050
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006051 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306052 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306054 if (pVBInfo->LCDInfo & SetLCDDualLink)
6055 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306057 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306058 if (pVBInfo->TVInfo & RPLLDIV2XO)
6059 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306060 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006061
Peter Huewe255aabd2012-02-09 21:11:44 +01006062 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
6063 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306064 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006065
Peter Huewe255aabd2012-02-09 21:11:44 +01006066 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306067 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006068
Aaro Koskinen8104e322011-03-13 12:26:22 +02006069 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306070 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006071
Peter Huewe6896b942012-02-09 21:11:46 +01006072 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6073 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306074 tempah = 0;
6075 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006076
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306077 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6078 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01006079 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306080 tempah |= 0x04; /* shampoo 0129 */
6081 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006082
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006083 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306084 tempah = 0x00;
6085 tempbl = 0xcf;
6086 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6087 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6088 tempah |= 0x30;
6089 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006090
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006091 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306092 tempah = 0;
6093 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306095 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6096 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6097 tempah |= 0xc0;
6098 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006099 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306102 tempah = 0;
6103 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01006104 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306105 tempbl = 0xff;
6106 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6107 tempah |= 0x80;
6108 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006109
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006110 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006111
Peter Huewe6896b942012-02-09 21:11:46 +01006112 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306113 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006114 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6115 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306116 }
6117 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006118}
6119
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306121void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6122 struct vb_device_info *pVBInfo)
6123{
6124
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006125 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006126
6127}
6128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306129void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6130 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006131{
6132
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006133 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006134
6135}
6136
Bill Pemberton80adad82010-06-17 13:10:51 -04006137unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006138{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306139 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306141 if (pVBInfo->IF_DEF_LVDS == 1) {
6142 return 1;
6143 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006144 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306145 if ((flag == 1) || (flag == 2))
6146 return 1; /* 301b */
6147 else
6148 return 0;
6149 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006150}
6151
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006152unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6153 unsigned short ModeNo, unsigned short ModeIdIndex,
6154 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006155{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006156 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6157 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6158 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006159
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006160 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006161
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006162 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006163
Aaro Koskinen58839b02011-03-13 12:26:23 +02006164 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006165 index = index >> pVBInfo->SelectCRT2Rate;
6166 index &= 0x0F;
6167
6168 if (pVBInfo->LCDInfo & LCDNonExpanding)
6169 index = 0;
6170
6171 if (index > 0)
6172 index--;
6173
6174 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006175 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006176 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006177 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6178 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006179 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006180 /* 301b */
6181 temp = LCDARefreshIndex[
6182 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006183 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006184 temp = LCDRefreshIndex[
6185 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006186
6187 if (index > temp)
6188 index = temp;
6189 } else {
6190 index = 0;
6191 }
6192 }
6193 }
6194
6195 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6196 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6197 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006198 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6199 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006200 index++;
6201 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006202 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006203 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6204 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006205 index++;
6206 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006207 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6208 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006209 index++;
6210 }
6211 }
6212
6213 i = 0;
6214 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006215 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6216 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006217 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006218 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6219 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006220 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006221 if (temp < pVBInfo->ModeType)
6222 break;
6223 i++;
6224 index--;
6225
6226 } while (index != 0xFFFF);
6227 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6228 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006229 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6230 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006231 if (temp & InterlaceMode)
6232 i++;
6233 }
6234 }
6235 i--;
6236 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
6237 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
6238 RefreshRateTableIndex, &i, pVBInfo);
6239 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02006240 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006241}
6242
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006243static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306244 struct xgi_hw_device_info *HwDeviceExtension,
6245 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006246{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006247 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006248
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006249 pVBInfo->SetFlag |= ProgrammingCRT2;
6250 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6251 ModeIdIndex, pVBInfo);
6252 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6253 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6254 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6255 HwDeviceExtension, pVBInfo);
6256 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6257 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006258}
6259
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006260static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006261 struct xgi_hw_device_info *HwDeviceExtension,
6262 struct vb_device_info *pVBInfo)
6263{
6264 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6265
6266 tempbx = pVBInfo->VBInfo;
6267 pVBInfo->SetFlag |= ProgrammingCRT2;
6268 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6269 pVBInfo->SelectCRT2Rate = 4;
6270 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6271 ModeIdIndex, pVBInfo);
6272 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6273 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6274 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6275 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6276 RefreshRateTableIndex, pVBInfo);
6277 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6278 RefreshRateTableIndex, pVBInfo);
6279 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6280 RefreshRateTableIndex, pVBInfo);
6281 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6282 HwDeviceExtension, pVBInfo);
6283 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6284 RefreshRateTableIndex, pVBInfo);
6285 XGI_SetTap4Regs(pVBInfo);
6286 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6287 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6288 HwDeviceExtension, pVBInfo);
6289 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6290 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6291 XGI_AutoThreshold(pVBInfo);
6292 return 1;
6293}
6294
6295void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6296{
6297 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6298 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6299 0x05, 0x00 };
6300
6301 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6302
6303 unsigned char CR17, CR63, SR31;
6304 unsigned short temp;
6305 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6306
6307 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006308 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006309
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006310 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006311 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006312 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006313 pVBInfo->P3d4, 0x53) | 0x02));
6314
Aaro Koskinen58839b02011-03-13 12:26:23 +02006315 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6316 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6317 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006318
Aaro Koskinen8104e322011-03-13 12:26:22 +02006319 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6320 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006321
Aaro Koskinen58839b02011-03-13 12:26:23 +02006322 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006323 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006324
Aaro Koskinen58839b02011-03-13 12:26:23 +02006325 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006326 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006327
Aaro Koskinen58839b02011-03-13 12:26:23 +02006328 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006329 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006330 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006331 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006332
Aaro Koskinen8104e322011-03-13 12:26:22 +02006333 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006334
6335 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006336 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006337
6338 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006339 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006340 CRTCData[i]);
6341
6342 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006343 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006344 CRTCData[i]);
6345
6346 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006347 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006348 CRTCData[i]);
6349
Aaro Koskinen8104e322011-03-13 12:26:22 +02006350 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006351 & 0xE0));
6352
Aaro Koskinen8104e322011-03-13 12:26:22 +02006353 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6354 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6355 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006356
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006357 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006358
6359 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006360 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6361 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6362 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006363 }
6364
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006365 mdelay(1);
6366
6367 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006368 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006369
6370 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006371 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006372 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006373 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006374
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006375 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006376 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006377
6378 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006379 outb(0, (pVBInfo->P3c8 + 1));
6380 outb(0, (pVBInfo->P3c8 + 1));
6381 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006382 }
6383
Aaro Koskinen8104e322011-03-13 12:26:22 +02006384 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6385 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6386 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006387
Aaro Koskinen58839b02011-03-13 12:26:23 +02006388 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006389 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006390 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006391}
6392
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006393static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6394 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006395 struct vb_device_info *pVBInfo)
6396{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006397 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006398
Peter Huewe6896b942012-02-09 21:11:46 +01006399 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6400 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006401 if (!(pVBInfo->SetFlag & DisableChA)) {
6402 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006403 /* Power on */
6404 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006405 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006406 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6407 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006408 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006409 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006410 }
6411 }
6412 }
6413
6414 if (!(pVBInfo->SetFlag & DisableChB)) {
6415 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6416 & (SetCRT2ToLCD | SetCRT2ToTV
6417 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006418 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006419 pVBInfo->P3c4, 0x32);
6420 tempah &= 0xDF;
6421 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006422 if (!(pVBInfo->VBInfo &
6423 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006424 tempah |= 0x20;
6425 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006426 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006427 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006428
Aaro Koskinen58839b02011-03-13 12:26:23 +02006429 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006430 pVBInfo->Part1Port, 0x2E);
6431
6432 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006433 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006434 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006435 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006436 }
6437 }
6438
6439 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6440 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006441 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006442 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006443 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006444 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006445 if (XGI_EnableChISLCD(pVBInfo) ||
6446 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006447 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006448 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006449 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006450 pVBInfo->Part4Port,
6451 0x2A,
6452 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006453 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006454 /* LVDS Driver power on */
6455 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006456 }
6457 }
6458
6459 tempah = 0x00;
6460
6461 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6462 tempah = 0xc0;
6463
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006464 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6465 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6466 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6467 tempah = tempah & 0x40;
6468 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6469 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006470
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006471 if (pVBInfo->SetFlag & DisableChB)
6472 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006473
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006474 if (pVBInfo->SetFlag & DisableChA)
6475 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006476
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006477 if (pVBInfo->SetFlag & EnableChB)
6478 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006479
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006480 if (pVBInfo->SetFlag & EnableChA)
6481 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006482 }
6483 }
6484
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006485 /* EnablePart4_1F */
6486 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006487
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006488 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006489 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006490 XGI_DisableGatingCRT(HwDeviceExtension,
6491 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006492 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6493 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006494 }
6495 }
6496 } /* 301 */
6497 else { /* LVDS */
6498 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006499 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006500 /* enable CRT2 */
6501 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006502
Aaro Koskinen58839b02011-03-13 12:26:23 +02006503 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006504 0x2E);
6505 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006506 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006507
Aaro Koskinendc505562011-03-13 12:26:26 +02006508 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006509 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006510 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006511}
6512
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006513static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6514 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006515 unsigned short ModeNo, unsigned short ModeIdIndex,
6516 struct vb_device_info *pVBInfo)
6517{
Aaro Koskinena1579612012-04-07 01:14:05 +03006518 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006519
Aaro Koskinena1579612012-04-07 01:14:05 +03006520 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006521 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006522 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6523 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6524 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006525 XGI_ClearExt1Regs(pVBInfo);
6526
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006527 if (HwDeviceExtension->jChipType == XG27) {
6528 if (pVBInfo->IF_DEF_LVDS == 0)
6529 XGI_SetDefaultVCLK(pVBInfo);
6530 }
6531
6532 temp = ~ProgrammingCRT2;
6533 pVBInfo->SetFlag &= temp;
6534 pVBInfo->SelectCRT2Rate = 0;
6535
Peter Huewe6896b942012-02-09 21:11:46 +01006536 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6537 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006538 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006539 | SetInSlaveMode)) {
6540 pVBInfo->SetFlag |= ProgrammingCRT2;
6541 }
6542 }
6543
6544 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6545 ModeIdIndex, pVBInfo);
6546 if (RefreshRateTableIndex != 0xFFFF) {
6547 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6548 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6549 pVBInfo, HwDeviceExtension);
6550 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6551 RefreshRateTableIndex, pVBInfo);
6552 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6553 HwDeviceExtension, pVBInfo);
6554 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6555 RefreshRateTableIndex, pVBInfo);
6556 }
6557
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006558 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006559 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006560 if (temp & 0xA0) {
6561
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006562 if (HwDeviceExtension->jChipType == XG27)
6563 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6564 RefreshRateTableIndex, pVBInfo);
6565 else
6566 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6567 RefreshRateTableIndex, pVBInfo);
6568
6569 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6570 RefreshRateTableIndex);
6571
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006572 xgifb_set_lcd(HwDeviceExtension->jChipType,
6573 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006574
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006575 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006576 xgifb_set_lvds(xgifb_info,
6577 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006578 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006579 }
6580 }
6581
6582 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6583 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6584 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6585 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006586 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006587}
6588
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006589unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6590 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006591 unsigned short ModeNo)
6592{
6593 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006594 struct vb_device_info VBINF;
6595 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006596 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006597 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006598 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006599
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006600 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006601 pVBInfo->IF_DEF_YPbPr = 0;
6602 pVBInfo->IF_DEF_HiVision = 0;
6603 pVBInfo->IF_DEF_CRT2Monitor = 0;
6604 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006605 } else {
6606 pVBInfo->IF_DEF_YPbPr = 1;
6607 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006608 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006609 }
6610
6611 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6612 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6613 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6614 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6615 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6616 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6617 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6618 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6619 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6620 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6621 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6622 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6623 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006624 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6625 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6626 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6627 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6628 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006629
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006630 /* for x86 Linux, XG21 LVDS */
6631 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006632 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006633 pVBInfo->IF_DEF_LVDS = 1;
6634 }
6635 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006636 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6637 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006638 pVBInfo->IF_DEF_LVDS = 1;
6639 }
6640 }
6641
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006642 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006643 XGI_GetVBType(pVBInfo);
6644
6645 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006646 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006647 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006648 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006649
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006650 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006651 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6652
6653 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6654
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006655 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006656 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6657 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6658 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006659 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006660
Peter Huewea3d675c2012-02-09 21:11:47 +01006661 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006662 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006663 ModeIdIndex, pVBInfo);
6664
Peter Huewea3d675c2012-02-09 21:11:47 +01006665 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006666 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6667 HwDeviceExtension, pVBInfo);
6668 }
6669 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01006670 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006671 XGI_SetCRT1Group(xgifb_info,
6672 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006673 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006674 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006675 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6676 HwDeviceExtension,
6677 pVBInfo);
6678 }
6679 }
6680 }
6681
Peter Huewe6896b942012-02-09 21:11:46 +01006682 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006683 switch (HwDeviceExtension->ujVBChipID) {
6684 case VB_CHIP_301:
6685 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6686 pVBInfo); /*add for CRT2 */
6687 break;
6688
6689 case VB_CHIP_302:
6690 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6691 pVBInfo); /*add for CRT2 */
6692 break;
6693
6694 default:
6695 break;
6696 }
6697 }
6698
6699 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6700 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006701 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006702 } /* !XG20 */
6703 else {
6704 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006705 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006706 ModeIdIndex,
6707 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006708 return 0;
6709
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006710 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006711 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006712
6713 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006714 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006715
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006716 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006717
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006718 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6719 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006720
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006721 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006722 }
6723
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006724 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6725
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006726 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006727 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
6728 }
6729
6730 return 1;
6731}