blob: 42eaec7c8b241f35050d4c637cf7d9e1aafd1c68 [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002#include <linux/io.h>
Aaro Koskinend80aaa02011-02-17 23:29:14 +02003#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include <linux/types.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
8#include "vb_def.h"
9#include "vgatypes.h"
10#include "vb_struct.h"
Aaro Koskinen09d1cad2011-09-13 22:49:34 +030011#include "vb_init.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020012#include "vb_util.h"
13#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020014#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020015
16
17#define IndexMask 0xff
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020018
Aaro Koskinen624554d2011-10-11 21:47:35 +030019static const unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
22 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
23 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
25 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
26 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
27 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020028
Aaro Koskinen624554d2011-10-11 21:47:35 +030029static const unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040030 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
31 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
32 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
33 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
34 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
35 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
36 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
37 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020038
Aaro Koskinen624554d2011-10-11 21:47:35 +030039static const unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040040 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
41 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
42 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
43 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
44 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
45 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
46 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
47 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020048
Aaro Koskinen624554d2011-10-11 21:47:35 +030049static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040050 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
51 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
52 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
53 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
54 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
55 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
56 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
57 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
58 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
59 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020060
Bill Pemberton80adad82010-06-17 13:10:51 -040061void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020062{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053063 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
Peter Huewefc39dcb2012-01-15 19:22:12 +010064 pVBInfo->StandTable = (struct SiS_StandTable_S *) XGI330_StandTable;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053065 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
66 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
67 pVBInfo->XGINEWUB_CRT1Table
68 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020069
Peter Huewefc39dcb2012-01-15 19:22:12 +010070 pVBInfo->MCLKData = (struct SiS_MCLKData *) XGI340New_MCLKData;
Aaro Koskinen06587332011-03-13 12:26:10 +020071 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Peter Huewefc39dcb2012-01-15 19:22:12 +010072 pVBInfo->VCLKData = (struct SiS_VCLKData *) XGI_VCLKData;
73 pVBInfo->VBVCLKData = (struct SiS_VBVCLKData *) XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053074 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Peter Huewefc39dcb2012-01-15 19:22:12 +010075 pVBInfo->StResInfo = (struct SiS_StResInfo_S *) XGI330_StResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053076 pVBInfo->ModeResInfo
Peter Huewefc39dcb2012-01-15 19:22:12 +010077 = (struct SiS_ModeResInfo_S *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020078
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053079 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
80 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
81 pVBInfo->pSR07 = &XGI330_SR07;
82 pVBInfo->LCDResInfo = 0;
83 pVBInfo->LCDTypeInfo = 0;
84 pVBInfo->LCDInfo = 0;
85 pVBInfo->VBInfo = 0;
86 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020087
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053088 pVBInfo->SR15 = XGI340_SR13;
89 pVBInfo->CR40 = XGI340_cr41;
90 pVBInfo->SR25 = XGI330_sr25;
91 pVBInfo->pSR31 = &XGI330_sr31;
92 pVBInfo->pSR32 = &XGI330_sr32;
93 pVBInfo->CR6B = XGI340_CR6B;
94 pVBInfo->CR6E = XGI340_CR6E;
95 pVBInfo->CR6F = XGI340_CR6F;
96 pVBInfo->CR89 = XGI340_CR89;
97 pVBInfo->AGPReg = XGI340_AGPReg;
98 pVBInfo->SR16 = XGI340_SR16;
99 pVBInfo->pCRCF = &XG40_CRCF;
100 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530102 pVBInfo->CR49 = XGI330_CR49;
103 pVBInfo->pSR1F = &XGI330_SR1F;
104 pVBInfo->pSR21 = &XGI330_SR21;
105 pVBInfo->pSR22 = &XGI330_SR22;
106 pVBInfo->pSR23 = &XGI330_SR23;
107 pVBInfo->pSR24 = &XGI330_SR24;
108 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530110 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
111 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
112 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
113 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
114 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
115 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
116 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
117 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
118 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
119 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530121 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
122 pVBInfo->PALTiming = XGI330_PALTiming;
123 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
124 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
125 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
126 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
127 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
128 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
129 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
130 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
131 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
132 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
133 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
134 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530136 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
137 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
138 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530140 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +0100141 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530142 pVBInfo->LCDCapList = XGI_LCDDLCapList;
143 else
144 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530146 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
147 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530149 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530151 if (ChipType >= XG20)
152 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200153
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530154 if (ChipType == XG27) {
155 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +0100156 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530157 pVBInfo->CR40 = XGI27_cr41;
158 pVBInfo->pXGINew_CR97 = &XG27_CR97;
159 pVBInfo->pSR36 = &XG27_SR36;
160 pVBInfo->pCR8F = &XG27_CR8F;
161 pVBInfo->pCRD0 = XG27_CRD0;
162 pVBInfo->pCRDE = XG27_CRDE;
163 pVBInfo->pSR40 = &XG27_SR40;
164 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530166 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200167
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530168 if (ChipType >= XG20) {
169 pVBInfo->pDVOSetting = &XG21_DVOSetting;
170 pVBInfo->pCR2E = &XG21_CR2E;
171 pVBInfo->pCR2F = &XG21_CR2F;
172 pVBInfo->pCR46 = &XG21_CR46;
173 pVBInfo->pCR47 = &XG21_CR47;
174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175
176}
177
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800178static unsigned char XGI_GetModePtr(unsigned short ModeNo,
179 unsigned short ModeIdIndex,
180 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200181{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530182 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530184 if (ModeNo <= 0x13)
185 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
186 else {
187 if (pVBInfo->ModeType <= 0x02)
188 index = 0x1B; /* 02 -> ModeEGA */
189 else
190 index = 0x0F;
191 }
192 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200193}
194
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800195static void XGI_SetSeqRegs(unsigned short ModeNo,
196 unsigned short StandTableIndex,
197 unsigned short ModeIdIndex,
198 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200199{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530200 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530201 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200202
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530203 if (ModeNo <= 0x13)
204 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
205 else
206 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207
Aaro Koskinen8104e322011-03-13 12:26:22 +0200208 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530209 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200210
Peter Huewea3d675c2012-02-09 21:11:47 +0100211 i = XGI_SetCRT2ToLCDA;
212 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530213 tempah |= 0x01;
214 } else {
215 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
216 if (pVBInfo->VBInfo & SetInSlaveMode)
217 tempah |= 0x01;
218 }
219 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530221 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200222 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530224 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800225 /* Get SR2,3,4 from file */
226 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200227 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530228 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200229}
230
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200231static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800232 unsigned short StandTableIndex,
233 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200234{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530235 unsigned char CRTCdata;
236 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200237
Aaro Koskinen58839b02011-03-13 12:26:23 +0200238 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530239 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200240 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530242 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800243 /* Get CRTC from file */
244 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200245 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530246 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200247}
248
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800249static void XGI_SetATTRegs(unsigned short ModeNo,
250 unsigned short StandTableIndex,
251 unsigned short ModeIdIndex,
252 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200253{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530254 unsigned char ARdata;
255 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530257 if (ModeNo <= 0x13)
258 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
259 else
260 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530262 for (i = 0; i <= 0x13; i++) {
263 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
264 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
265 if (i == 0x13) {
Peter Huewea3d675c2012-02-09 21:11:47 +0100266 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530267 ARdata = 0;
268 } else {
269 if (pVBInfo->VBInfo & (SetCRT2ToTV
270 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800271 if (pVBInfo->VBInfo &
272 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530273 ARdata = 0;
274 }
275 }
276 }
277 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200278
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200279 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200280 outb(i, pVBInfo->P3c0); /* set index */
281 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530282 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200283
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200284 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200285 outb(0x14, pVBInfo->P3c0); /* set index */
286 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200287 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200288 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200289}
290
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200291static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800292 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200293{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530294 unsigned char GRdata;
295 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530297 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800298 /* Get GR from file */
299 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200300 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200302
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530303 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200304 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530305 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200306 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530307 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200308}
309
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200310static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200311{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530312 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200315 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200316}
317
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200318static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200319{
320
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200321 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200322 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
323 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200324
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200325 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200326 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
327 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200328
Aaro Koskinendc505562011-03-13 12:26:26 +0200329 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530330 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200331}
332
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200333static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 unsigned short ModeIdIndex,
335 unsigned short RefreshRateTableIndex, unsigned short *i,
336 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200337{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530338 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530340 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800341 /* si+St_ModeFlag */
342 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530343 else
344 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200345
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530346 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
347 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
348 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530350 if (pVBInfo->IF_DEF_LVDS == 0) {
351 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
352 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530354 if (pVBInfo->VBType & VB_XGI301C)
355 tempax |= SupportCRT2in301C;
356 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200357
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800358 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100359 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530360 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200361
Peter Huewe255aabd2012-02-09 21:11:44 +0100362 if (pVBInfo->LCDResInfo != Panel_1280x1024) {
363 if (pVBInfo->LCDResInfo != Panel_1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800364 if (pVBInfo->LCDInfo &
365 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530366 if (resinfo >= 9) {
367 tempax = 0;
368 return 0;
369 }
370 }
371 }
372 }
373 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200374
Peter Huewe599801f2012-02-09 21:11:45 +0100375 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Peter Huewe6896b942012-02-09 21:11:46 +0100376 if ((pVBInfo->VBType & VB_SIS301LV) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800377 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100378 tempax |= SupportYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530379 if (pVBInfo->VBInfo & SetInSlaveMode) {
380 if (resinfo == 4)
381 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200382
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530383 if (resinfo == 3)
384 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 if (resinfo > 7)
387 return 0;
388 }
389 } else {
Peter Huewe6896b942012-02-09 21:11:46 +0100390 tempax |= SupportHiVision;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530391 if (pVBInfo->VBInfo & SetInSlaveMode) {
392 if (resinfo == 4)
393 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530395 if (resinfo == 3) {
396 if (pVBInfo->SetFlag
397 & TVSimuMode)
398 return 0;
399 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530401 if (resinfo > 7)
402 return 0;
403 }
404 }
405 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800406 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
407 SetCRT2ToSVIDEO |
408 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100409 SetCRT2ToYPbPr525750 |
410 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530411 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200412
Peter Huewe6896b942012-02-09 21:11:46 +0100413 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
414 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530415 | VB_XGI301C)) {
416 tempax |= SupportTV1024;
417 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200418
Peter Huewe599801f2012-02-09 21:11:45 +0100419 if (!(pVBInfo->VBInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530420 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800421 if (pVBInfo->VBInfo &
422 SetInSlaveMode) {
423 if (!(pVBInfo->VBInfo &
424 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 return 0;
426 }
427 }
428 }
429 }
430 }
431 }
432 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530433 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
434 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530436 if (resinfo > 0x08)
437 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200438
Peter Huewe255aabd2012-02-09 21:11:44 +0100439 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530440 if (resinfo > 0x07)
441 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530443 if (resinfo == 0x04)
444 return 0; /* 512x384 */
445 }
446 }
447 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200448
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800449 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
450 tempbx; (*i)--) {
451 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
452 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530453 if (infoflag & tempax)
454 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530456 if ((*i) == 0)
457 break;
458 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530460 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800461 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
462 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530463 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
464 != tempbx) {
465 return 0;
466 }
467
468 if (infoflag & tempax)
469 return 1;
470 }
471 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200472}
473
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200474static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530475 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200476{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530477 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200478
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800479 /* di+0x00 */
480 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530481 sync &= 0xC0;
482 temp = 0x2F;
483 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200484 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200485}
486
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200487static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530488 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200489{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530490 unsigned char data, data1, pushax;
491 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200492
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800493 /* unlock cr0-7 */
494 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530495 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200496 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530498 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200499 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530501 for (i = 0x01; i <= 0x04; i++) {
502 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200503 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530504 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530506 for (i = 0x05; i <= 0x06; i++) {
507 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200508 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530509 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200510
Aaro Koskinen58839b02011-03-13 12:26:23 +0200511 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530512 j &= 0x1F;
513 data = pVBInfo->TimingH[0].data[7];
514 data &= 0xE0;
515 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200516 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530518 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200519 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530520 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200521 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200522 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530523 data1 = data;
524 data1 &= 0xE0;
525 data &= 0x1F;
526 if (data == 0) {
527 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200528 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530529 0x0c);
530 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200531 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530532 data = pushax;
533 }
534 data = data - 1;
535 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200536 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200537 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530538 data = data >> 5;
539 data = data + 3;
540 if (data > 7)
541 data = data - 7;
542 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200543 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530544 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200545}
546
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800547static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
548 unsigned short ModeNo,
549 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200550{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530551 unsigned char data;
552 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530554 for (i = 0x00; i <= 0x01; i++) {
555 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200556 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530557 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200558
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530559 for (i = 0x02; i <= 0x03; i++) {
560 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200561 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530562 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200563
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530564 for (i = 0x04; i <= 0x05; i++) {
565 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200566 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530567 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200568
Aaro Koskinen58839b02011-03-13 12:26:23 +0200569 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530570 j &= 0xC0;
571 data = pVBInfo->TimingV[0].data[6];
572 data &= 0x3F;
573 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200574 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200575
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530576 data = pVBInfo->TimingV[0].data[6];
577 data &= 0x80;
578 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200579
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530580 if (ModeNo <= 0x13)
581 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
582 else
583 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530585 i &= DoubleScanMode;
586 if (i)
587 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200588
Aaro Koskinen58839b02011-03-13 12:26:23 +0200589 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530590 j &= 0x5F;
591 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200592 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200593}
594
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200595static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
596 unsigned short RefreshRateTableIndex,
597 struct vb_device_info *pVBInfo,
598 struct xgi_hw_device_info *HwDeviceExtension)
599{
600 unsigned char index, data;
601 unsigned short i;
602
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800603 /* Get index */
604 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200605 index = index & IndexMask;
606
Aaro Koskinen58839b02011-03-13 12:26:23 +0200607 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200608 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200609 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200610
611 for (i = 0; i < 8; i++)
612 pVBInfo->TimingH[0].data[i]
613 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
614
615 for (i = 0; i < 7; i++)
616 pVBInfo->TimingV[0].data[i]
617 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
618
619 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
620
621 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
622
623 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200624 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200625}
626
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200627/* --------------------------------------------------------------------- */
628/* Function : XGI_SetXG21CRTC */
629/* Input : Stand or enhance CRTC table */
630/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
631/* Description : Set LCD timing */
632/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200633static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530634 unsigned short RefreshRateTableIndex,
635 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200636{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530637 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
638 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200639
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530640 if (ModeNo <= 0x13) {
641 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800642 /* CR04 HRS */
643 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
644 /* SR2E [7:0]->HRS */
645 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
646 /* Tempbx: CR05 HRE */
647 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530648 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
649 Tempcx = Tempax;
650 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
651 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
652 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
653 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
654 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800655 /* SR2F [7:2]->HRE */
656 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200657 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200658
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800659 /* Tempax: CR16 VRS */
660 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530661 Tempbx = Tempax; /* Tempbx=Tempax */
662 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200663 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800664
665 /* Tempax: CR7 VRS */
666 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530667 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
668 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
669 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
670 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800671 /* SR34[7:0]: VRS[8:1] */
672 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200673
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800674 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
675 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530676 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
677 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
678 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
679 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200680
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800681 /* CR16 VRE */
682 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530683 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
684 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
685 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
686 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
687 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
688 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
689 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
690 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
691 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
692 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
693 Temp1 >>= 9; /* [10:9]->[1:0] */
694 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
695 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
696 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800697 /* SR3F D[7:2]->VRE D[1:0]->VRS */
698 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530699 } else {
700 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800701 /* Tempax: CR4 HRS */
702 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530703 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800704 /* SR2E[7:0]->HRS */
705 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530707 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
708 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
709 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
710 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
711 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200712
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530713 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
714 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530716 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
717 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
718 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
719 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530721 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
722 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200723
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530724 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
725 if (Tempax < Tempcx) /* HRE < HRS */
726 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530728 Temp2 &= 0xFF;
729 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
730 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
731 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
732 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800733 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
734 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200735 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200736
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800737 /* CR10 VRS */
738 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530739 Tempbx = Tempax; /* Tempbx: VRS */
740 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200741 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800742 /* CR7[2][7] VRE */
743 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530744 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
745 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
746 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
747 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200748 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530750 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
751 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
752 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
753 Tempax &= 0x80;
754 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
755 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800756 /* Tempax: SRA */
757 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530758 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
759 Temp2 = Tempax;
760 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
761 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200762
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800763 /* Tempax: CR11 VRE */
764 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530765 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800766 /* Tempbx: SRA */
767 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530768 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
769 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
770 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
771 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
772 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530774 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
775 if (Tempax < Temp3) /* VRE < VRS */
776 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530778 Temp2 &= 0xFF;
779 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
780 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
781 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
782 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
783 Tempbx = (unsigned char) Temp1;
784 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
785 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800786 /* SR3F D[7:2]->VRE D[1:0]->VRS */
787 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530788 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200789}
790
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800791static void XGI_SetXG27CRTC(unsigned short ModeNo,
792 unsigned short ModeIdIndex,
793 unsigned short RefreshRateTableIndex,
794 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200795{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400796 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530798 if (ModeNo <= 0x13) {
799 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800800 /* CR04 HRS */
801 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
802 /* SR2E [7:0]->HRS */
803 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
804 /* Tempbx: CR05 HRE */
805 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530806 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
807 Tempcx = Tempax;
808 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
809 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
810 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
811 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
812 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800813 /* SR2F [7:2]->HRE */
814 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200815 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200816
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800817 /* Tempax: CR10 VRS */
818 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200819 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530820 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800821 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
822 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530823 Tempbx = Tempax; /* Tempbx=CR07 */
824 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
825 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800826 /* SR35 D[0]->VRS D[8] */
827 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530828 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
829 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200830
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800831 /* CR11 VRE */
832 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530833 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
834 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
835 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
836 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
837 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
838 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800839 /* Tempax[7:0]: VRE[7:0] */
840 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530841 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
842 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800843 /* SR3F D[7:2]->VRE D[5:0] */
844 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
845 /* SR35 D[2:1]->VRS[10:9] */
846 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530847 } else {
848 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800849 /* Tempax: CR4 HRS */
850 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530851 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800852 /* SR2E[7:0]->HRS */
853 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200854
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800855 /* SR0B */
856 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530857 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
858 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530860 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
861 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
862 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530864 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
865 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
866 Tempax <<= 3; /* Tempax[5]: HRE[5] */
867 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530869 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
870 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200871
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800872 /* Tempax: CR4 HRS */
873 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530874 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
875 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
876 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200877
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530878 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
879 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
880 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
881 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800882 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
883 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200884 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200885
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800886 /* CR10 VRS */
887 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
888 /* SR34[7:0]->VRS[7:0] */
889 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530891 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800892 /* CR7[7][2] VRS[9][8] */
893 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530894 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
895 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
896 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800897 /* SR35[0]: VRS[8] */
898 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530899 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
900 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800901 /* Tempax: SR0A */
902 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530903 Tempax &= 0x08; /* SR0A[3] VRS[10] */
904 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200905
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800906 /* Tempax: CR11 VRE */
907 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530908 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800909 /* Tempbx: SR0A */
910 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530911 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
912 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
913 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
914 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
915 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
916 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200917
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530918 if (Tempbx <= Tempcx) /* VRE <= VRS */
919 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200920
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800921 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
922 Tempax = (Tempbx << 2) & 0xFF;
923 /* SR3F[7:2]:VRE[5:0] */
924 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530925 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800926 /* SR35[2:0]:VRS[10:8] */
927 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530928 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200929}
930
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200931static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
932{
933 unsigned char temp;
934
935 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
936 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
937 temp = (temp & 3) << 6;
938 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
939 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
940 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
941 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
942
943}
944
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300945static void xgifb_set_lcd(int chip_id,
946 struct vb_device_info *pVBInfo,
947 unsigned short RefreshRateTableIndex,
948 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200949{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400950 unsigned short Data, Temp, b3CC;
951 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530953 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200954
Aaro Koskinen8104e322011-03-13 12:26:22 +0200955 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
956 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
957 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
958 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300959
960 if (chip_id == XG27) {
961 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
962 if ((Temp & 0x03) == 0) { /* dual 12 */
963 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
964 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
965 }
966 }
967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530968 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200969 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
970 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
971 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
972 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530973 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200974
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300975 if (chip_id == XG27) {
976 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530977 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300978 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
979 if (Temp & 0x01) {
980 /* 18 bits FP */
981 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
982 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
983 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530984 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200985
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200986 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200987
Aaro Koskinendc505562011-03-13 12:26:26 +0200988 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
989 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530991 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200992 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530993 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800994 /* Hsync polarity */
995 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530996 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800997 /* Vsync polarity */
998 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530999 } else {
1000 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1001 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001002 /* Hsync polarity */
1003 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301004 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001005 /* Vsync polarity */
1006 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301007 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001008}
1009
1010/* --------------------------------------------------------------------- */
1011/* Function : XGI_UpdateXG21CRTC */
1012/* Input : */
1013/* Output : CRT1 CRTC */
1014/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1015/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001016static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1017 struct vb_device_info *pVBInfo,
1018 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001019{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301020 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001021
Aaro Koskinendc505562011-03-13 12:26:26 +02001022 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301023 if (ModeNo <= 0x13) {
1024 for (i = 0; i < 12; i++) {
1025 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1026 index = i;
1027 }
1028 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001029 if (ModeNo == 0x2E &&
1030 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1031 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301032 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001033 else if (ModeNo == 0x2E &&
1034 (pVBInfo->RefIndex[RefreshRateTableIndex].
1035 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301036 index = 13;
1037 else if (ModeNo == 0x2F)
1038 index = 14;
1039 else if (ModeNo == 0x50)
1040 index = 15;
1041 else if (ModeNo == 0x59)
1042 index = 16;
1043 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001044
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301045 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001046 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301047 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001048 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301049 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001050 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301051 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001052 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301053 pVBInfo->UpdateCRT1[index].CR16);
1054 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001055}
1056
Aaro Koskinen06465962011-11-27 23:03:06 +02001057static unsigned short XGI_GetResInfo(unsigned short ModeNo,
1058 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
1059{
1060 unsigned short resindex;
1061
1062 if (ModeNo <= 0x13)
1063 /* si+St_ResInfo */
1064 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1065 else
1066 /* si+Ext_ResInfo */
1067 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1068 return resindex;
1069}
1070
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001071static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301072 unsigned short ModeNo, unsigned short ModeIdIndex,
1073 unsigned short RefreshRateTableIndex,
1074 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001075{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001076 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301078 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301080 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001081
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301082 if (ModeNo <= 0x13) {
1083 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1084 tempax = pVBInfo->StResInfo[resindex].HTotal;
1085 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1086 } else {
1087 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1088 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1089 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1090 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301092 if (modeflag & HalfDCLK)
1093 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301095 if (ModeNo > 0x13) {
1096 if (modeflag & HalfDCLK)
1097 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301101 if (temp & InterlaceMode)
1102 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301104 if (modeflag & DoubleScanMode)
1105 tempbx = tempbx << 1;
1106 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301108 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301110 tempax /= tempcx;
1111 tempax -= 1;
1112 tempbx -= 1;
1113 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001114 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1115 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301116 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001117 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1118 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001119 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301120 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001121 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301122 tempax = 0;
1123 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301125 if (tempbx & 0x01)
1126 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301128 if (tempbx & 0x02)
1129 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001130
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001131 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001132 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301133 data &= 0xFF;
1134 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301136 if (tempbx & 0x04)
1137 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001138
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001139 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001140 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001141}
1142
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001143static void XGI_SetCRT1Offset(unsigned short ModeNo,
1144 unsigned short ModeIdIndex,
1145 unsigned short RefreshRateTableIndex,
1146 struct xgi_hw_device_info *HwDeviceExtension,
1147 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001148{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301149 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301151 /* GetOffset */
1152 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1153 temp = temp >> 8;
1154 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1157 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301159 if (temp2)
1160 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301162 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001163
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301164 switch (temp2) {
1165 case 0:
1166 temp2 = 1;
1167 break;
1168 case 1:
1169 temp2 = 2;
1170 break;
1171 case 2:
1172 temp2 = 4;
1173 break;
1174 case 3:
1175 temp2 = 4;
1176 break;
1177 case 4:
1178 temp2 = 6;
1179 break;
1180 case 5:
1181 temp2 = 8;
1182 break;
1183 default:
1184 break;
1185 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001186
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301187 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1188 temp = temp * temp2 + temp2 / 2;
1189 else
1190 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301192 /* SetOffset */
1193 DisplayUnit = temp;
1194 temp2 = temp;
1195 temp = temp >> 8; /* ah */
1196 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001197 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301198 i &= 0xF0;
1199 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001200 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301202 temp = (unsigned char) temp2;
1203 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001204 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001205
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301206 /* SetDisplayUnit */
1207 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1208 temp2 &= InterlaceMode;
1209 if (temp2)
1210 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001211
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301212 DisplayUnit = DisplayUnit << 5;
1213 ah = (DisplayUnit & 0xff00) >> 8;
1214 al = DisplayUnit & 0x00ff;
1215 if (al == 0)
1216 ah += 1;
1217 else
1218 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001219
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301220 if (HwDeviceExtension->jChipType >= XG20)
1221 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1222 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001223
Aaro Koskinen8104e322011-03-13 12:26:22 +02001224 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001225}
1226
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001227static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1228 unsigned short ModeIdIndex,
1229 unsigned short RefreshRateTableIndex,
1230 struct xgi_hw_device_info *HwDeviceExtension,
1231 struct vb_device_info *pVBInfo)
1232{
Peter Huewe6896b942012-02-09 21:11:46 +01001233 unsigned short LCDXlat1VCLK[4] = { VCLK65_315 + 2,
1234 VCLK65_315 + 2,
1235 VCLK65_315 + 2,
1236 VCLK65_315 + 2 };
1237 unsigned short LCDXlat2VCLK[4] = { VCLK108_2_315 + 5,
1238 VCLK108_2_315 + 5,
1239 VCLK108_2_315 + 5,
1240 VCLK108_2_315 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001241 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Peter Huewe6896b942012-02-09 21:11:46 +01001242 unsigned short LVDSXlat2VCLK[4] = { VCLK65_315 + 2,
1243 VCLK65_315 + 2,
1244 VCLK65_315 + 2,
1245 VCLK65_315 + 2 };
1246 unsigned short LVDSXlat3VCLK[4] = { VCLK65_315 + 2,
1247 VCLK65_315 + 2,
1248 VCLK65_315 + 2,
1249 VCLK65_315 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001250
1251 unsigned short CRT2Index, VCLKIndex;
1252 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001253
1254 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001255 /* si+St_ResInfo */
1256 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001257 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1258 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1259 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001260 /* si+Ext_ResInfo */
1261 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001262 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001263 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1264 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001265 }
1266
1267 if (pVBInfo->IF_DEF_LVDS == 0) {
1268 CRT2Index = CRT2Index >> 6; /* for LCD */
Peter Huewea3d675c2012-02-09 21:11:47 +01001269 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +01001270 if (pVBInfo->LCDResInfo != Panel_1024x768)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001271 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1272 else
1273 VCLKIndex = LCDXlat1VCLK[CRT2Index];
Peter Huewe599801f2012-02-09 21:11:45 +01001274 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001275 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1276 VCLKIndex = HiTVVCLKDIV2;
1277 VCLKIndex += 25;
1278 } else {
1279 VCLKIndex = HiTVVCLK;
1280 VCLKIndex += 25;
1281 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001282
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001283 if (pVBInfo->SetFlag & TVSimuMode) {
1284 if (modeflag & Charx8Dot) {
1285 VCLKIndex = HiTVSimuVCLK;
1286 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001287 } else {
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001288 VCLKIndex = HiTVTextVCLK;
1289 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001290 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001291 }
1292
1293 /* 301lv */
Peter Huewe6896b942012-02-09 21:11:46 +01001294 if ((pVBInfo->VBType & VB_SIS301LV) &&
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001295 !(pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +01001296 if (pVBInfo->VBExtInfo == YPbPr750p)
Peter Huewea3d675c2012-02-09 21:11:47 +01001297 VCLKIndex = XGI_YPbPr750pVCLK;
Peter Huewe6896b942012-02-09 21:11:46 +01001298 else if (pVBInfo->VBExtInfo == YPbPr525p)
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001299 VCLKIndex = YPbPr525pVCLK;
1300 else if (pVBInfo->SetFlag & RPLLDIV2XO)
1301 VCLKIndex = YPbPr525iVCLK_2;
1302 else
1303 VCLKIndex = YPbPr525iVCLK;
1304 }
1305 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
1306 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1307 VCLKIndex = TVVCLKDIV2;
1308 VCLKIndex += 25;
1309 } else {
1310 VCLKIndex = TVVCLK;
1311 VCLKIndex += 25;
1312 }
1313 } else { /* for CRT2 */
1314 /* Port 3cch */
1315 VCLKIndex = (unsigned char) inb((pVBInfo->P3ca + 0x02));
1316 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1317 if (ModeNo > 0x13) {
1318 /* di+Ext_CRTVCLK */
1319 VCLKIndex = pVBInfo->RefIndex[
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001320 RefreshRateTableIndex].
1321 Ext_CRTVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001322 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001323 }
1324 }
1325 } else { /* LVDS */
1326 if (ModeNo <= 0x13)
1327 VCLKIndex = CRT2Index;
1328 else
1329 VCLKIndex = CRT2Index;
1330
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001331 VCLKIndex = VCLKIndex >> 6;
Peter Huewe255aabd2012-02-09 21:11:44 +01001332 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
1333 (pVBInfo->LCDResInfo == Panel_320x480))
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001334 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
Peter Huewe255aabd2012-02-09 21:11:44 +01001335 else if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1336 (pVBInfo->LCDResInfo == Panel_1024x768x75))
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001337 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1338 else
1339 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001340 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001341
1342 return VCLKIndex;
1343}
1344
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001345static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1346 unsigned short ModeIdIndex,
1347 struct xgi_hw_device_info *HwDeviceExtension,
1348 unsigned short RefreshRateTableIndex,
1349 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001350{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001351 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301352 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301354 if (pVBInfo->IF_DEF_LVDS == 1) {
1355 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001356 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001357 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1358 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301359 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001360 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301361 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001362 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001363 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1364 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001365 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301366 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1367 RefreshRateTableIndex, HwDeviceExtension,
1368 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001369 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001370 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301371 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001372 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301373 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001374 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1375 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301376 } else {
1377 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001378 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001379 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1380 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301381 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001382 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301383 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001384 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301385 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001386
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301387 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001388 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1389 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001390 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001391 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001392 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301393 index = data;
1394 index &= 0xE0;
1395 data &= 0x1F;
1396 data = data << 1;
1397 data += 1;
1398 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001399 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301400 }
1401 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001402}
1403
Aaro Koskinene85f2032011-11-27 23:03:07 +02001404static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1405{
1406 unsigned char temp;
1407
1408 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1409 temp = (temp & 1) << 6;
1410 /* SR06[6] 18bit Dither */
1411 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1412 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1413 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1414
1415}
1416
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001417static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301418 struct xgi_hw_device_info *HwDeviceExtension,
1419 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001420{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301421 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001422
Aaro Koskinen58839b02011-03-13 12:26:23 +02001423 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301424 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001425 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301427 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001428 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001429 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301430 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001431 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001432 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301433 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001434 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301435 } else {
1436 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001437 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001438 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301439 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001440 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301441 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001442 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001443 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301444 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001445 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301446 }
1447 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001448
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301449 if (HwDeviceExtension->jChipType == XG21)
1450 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001451}
1452
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001453static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1454 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1455 struct vb_device_info *pVBInfo)
1456{
1457 unsigned short data, data2 = 0;
1458 short VCLK;
1459
1460 unsigned char index;
1461
1462 if (ModeNo <= 0x13)
1463 VCLK = 0;
1464 else {
1465 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1466 index &= IndexMask;
1467 VCLK = pVBInfo->VCLKData[index].CLOCK;
1468 }
1469
Aaro Koskinen58839b02011-03-13 12:26:23 +02001470 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001471 data &= 0xf3;
1472 if (VCLK >= 200)
1473 data |= 0x0c; /* VCLK > 200 */
1474
1475 if (HwDeviceExtension->jChipType >= XG20)
1476 data &= ~0x04; /* 2 pixel mode */
1477
Aaro Koskinen8104e322011-03-13 12:26:22 +02001478 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001479
1480 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001481 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001482 data &= 0xE7;
1483 if (VCLK < 200)
1484 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001485 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001486 }
1487
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001488 data2 = 0x00;
1489
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001490 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001491 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001492 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001493
1494}
1495
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001496static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301497 unsigned short ModeNo, unsigned short ModeIdIndex,
1498 unsigned short RefreshRateTableIndex,
1499 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001500{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301501 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1502 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001503
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301504 if (ModeNo > 0x13) {
1505 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001506 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1507 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301508 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001509 /* si+St_ModeFlag */
1510 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001511
Aaro Koskinen58839b02011-03-13 12:26:23 +02001512 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001513 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301515 if (ModeNo > 0x13)
1516 data = infoflag;
1517 else
1518 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301520 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301522 if (ModeNo > 0x13) {
1523 if (pVBInfo->ModeType > 0x02) {
1524 data2 |= 0x02;
1525 data3 = pVBInfo->ModeType - ModeVGA;
1526 data3 = data3 << 2;
1527 data2 |= data3;
1528 }
1529 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301531 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001532
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301533 if (data)
1534 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001535
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001536 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301537 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1538 if (ModeNo <= 0x13)
1539 xres = pVBInfo->StResInfo[resindex].HTotal;
1540 else
1541 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001542
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301543 data = 0x0000;
1544 if (infoflag & InterlaceMode) {
1545 if (xres == 1024)
1546 data = 0x0035;
1547 else if (xres == 1280)
1548 data = 0x0048;
1549 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301551 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001552 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301553 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001554 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301556 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001557 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001558
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301559 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301561 if (modeflag & LineCompareOff)
1562 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001563
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301564 if (ModeNo > 0x13) {
1565 if (pVBInfo->ModeType == ModeEGA)
1566 data2 |= 0x40;
1567 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001568
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001569 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301570 data = 0x60;
1571 if (pVBInfo->ModeType != ModeText) {
1572 data = data ^ 0x60;
1573 if (pVBInfo->ModeType != ModeEGA)
1574 data = data ^ 0xA0;
1575 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001576 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301578 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1579 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001580
Aaro Koskinen58839b02011-03-13 12:26:23 +02001581 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001582
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301583 if (HwDeviceExtension->jChipType == XG27) {
1584 if (data & 0x40)
1585 data = 0x2c;
1586 else
1587 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001588 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001589 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301590 } else if (HwDeviceExtension->jChipType >= XG20) {
1591 if (data & 0x40)
1592 data = 0x33;
1593 else
1594 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001595 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1596 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301597 } else {
1598 if (data & 0x40)
1599 data = 0x2c;
1600 else
1601 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001602 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301603 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001604
1605}
1606
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001607static void XGI_WriteDAC(unsigned short dl,
1608 unsigned short ah,
1609 unsigned short al,
1610 unsigned short dh,
1611 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001612{
1613 unsigned short temp, bh, bl;
1614
1615 bh = ah;
1616 bl = al;
1617
1618 if (dl != 0) {
1619 temp = bh;
1620 bh = dh;
1621 dh = temp;
1622 if (dl == 1) {
1623 temp = bl;
1624 bl = dh;
1625 dh = temp;
1626 } else {
1627 temp = bl;
1628 bl = bh;
1629 bh = temp;
1630 }
1631 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001632 outb((unsigned short) dh, pVBInfo->P3c9);
1633 outb((unsigned short) bh, pVBInfo->P3c9);
1634 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001635}
1636
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001637static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301638 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001639{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301640 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
Aaro Koskinen624554d2011-10-11 21:47:35 +03001641 ah, dh;
1642 const unsigned short *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301644 if (ModeNo <= 0x13)
1645 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1646 else
1647 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301649 data &= DACInfoFlag;
1650 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301652 if (data == 0x00)
1653 table = XGINew_MDA_DAC;
1654 else if (data == 0x08)
1655 table = XGINew_CGA_DAC;
1656 else if (data == 0x10)
1657 table = XGINew_EGA_DAC;
1658 else if (data == 0x18) {
1659 time = 256;
1660 table = XGINew_VGA_DAC;
1661 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001662
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301663 if (time == 256)
1664 j = 16;
1665 else
1666 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001667
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001668 outb(0xFF, pVBInfo->P3c6);
1669 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301671 for (i = 0; i < j; i++) {
1672 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301674 for (k = 0; k < 3; k++) {
1675 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001676
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301677 if (data & 0x01)
1678 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001679
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301680 if (data & 0x02)
1681 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001682
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001683 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301684 data = data >> 2;
1685 }
1686 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301688 if (time == 256) {
1689 for (i = 16; i < 32; i++) {
1690 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301692 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001693 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301694 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001695
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301696 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001697
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301698 for (m = 0; m < 9; m++) {
1699 di = si;
1700 bx = si + 0x04;
1701 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301703 for (n = 0; n < 3; n++) {
1704 for (o = 0; o < 5; o++) {
1705 dh = table[si];
1706 ah = table[di];
1707 al = table[bx];
1708 si++;
1709 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1710 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301712 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001713
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301714 for (o = 0; o < 3; o++) {
1715 dh = table[bx];
1716 ah = table[di];
1717 al = table[si];
1718 si--;
1719 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1720 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001721
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301722 dl++;
1723 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001724
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301725 si += 5;
1726 }
1727 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001728}
1729
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001730static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1731 unsigned short ModeIdIndex,
1732 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001733{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301734 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001735
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301736 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001737 /* si+St_ResInfo */
1738 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301739 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001740 /* si+Ext_ResInfo */
1741 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301743 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001744 /* si+St_ResInfo */
1745 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301746 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001747 /* si+Ext_ResInfo */
1748 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301750 if (ModeNo <= 0x13) {
1751 xres = pVBInfo->StResInfo[resindex].HTotal;
1752 yres = pVBInfo->StResInfo[resindex].VTotal;
1753 } else {
1754 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1755 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1756 }
1757 if (ModeNo > 0x13) {
1758 if (modeflag & HalfDCLK)
1759 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001760
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301761 if (modeflag & DoubleScanMode)
1762 yres = yres << 1;
1763 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301765 if (xres == 720)
1766 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001767
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301768 pVBInfo->VGAHDE = xres;
1769 pVBInfo->HDE = xres;
1770 pVBInfo->VGAVDE = yres;
1771 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001772}
1773
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001774static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1775 unsigned short ModeIdIndex,
1776 unsigned short RefreshRateTableIndex,
1777 struct vb_device_info *pVBInfo)
1778{
1779 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1780
1781 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1782
1783 tempbx = BX;
1784
1785 if (ModeNo <= 0x13) {
1786 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1787 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1788 } else {
1789 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1790 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1791 }
1792
1793 tempal = tempal & 0x0f;
1794
1795 if (tempbx <= 1) { /* ExpLink */
1796 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001797 /* find no Ext_CRT2CRTC2 */
1798 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001799 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001800 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1801 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001802 }
1803
Peter Huewea3d675c2012-02-09 21:11:47 +01001804 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001805 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001806 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1807 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001808 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001809 tempal = pVBInfo->RefIndex[
1810 RefreshRateTableIndex].
1811 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001812 }
1813
1814 if (tempbx & 0x01)
1815 tempal = (tempal >> 4);
1816
1817 tempal = (tempal & 0x0f);
1818 }
1819
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001820 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001821
1822 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1823 if ((tempbx == 5) || (tempbx) == 7)
1824 tempcx = LCDDesDataLen2;
1825 else if ((tempbx == 3) || (tempbx == 8))
1826 tempcx = LVDSDesDataLen2;
1827 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001828
1829 switch (tempbx) {
1830 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001831 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001832 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001833 break;
1834 case 2:
1835 tempdi = XGI_EPLLCDDataPtr;
1836 break;
1837 case 3:
1838 tempdi = XGI_EPLLCDDesDataPtr;
1839 break;
1840 case 4:
1841 tempdi = XGI_LCDDataTable;
1842 break;
1843 case 5:
1844 tempdi = XGI_LCDDesDataTable;
1845 break;
1846 case 6:
1847 tempdi = XGI_EPLCHLCDRegPtr;
1848 break;
1849 case 7:
1850 case 8:
1851 case 9:
1852 tempdi = NULL;
1853 break;
1854 default:
1855 break;
1856 }
1857
1858 if (tempdi == NULL) /* OEMUtil */
1859 return NULL;
1860
1861 table = tempbx;
1862 i = 0;
1863
1864 while (tempdi[i].PANELID != 0xff) {
1865 tempdx = pVBInfo->LCDResInfo;
1866 if (tempbx & 0x0080) { /* OEMUtil */
1867 tempbx &= (~0x0080);
1868 tempdx = pVBInfo->LCDTypeInfo;
1869 }
1870
1871 if (pVBInfo->LCDInfo & EnableScalingLCD)
1872 tempdx &= (~PanelResInfo);
1873
1874 if (tempdi[i].PANELID == tempdx) {
1875 tempbx = tempdi[i].MASK;
1876 tempdx = pVBInfo->LCDInfo;
1877
1878 if (ModeNo <= 0x13) /* alan 09/10/2003 */
1879 tempdx |= SetLCDStdMode;
1880
1881 if (modeflag & HalfDCLK)
1882 tempdx |= SetLCDLowResolution;
1883
1884 tempbx &= tempdx;
1885 if (tempbx == tempdi[i].CAP)
1886 break;
1887 }
1888 i++;
1889 }
1890
1891 if (table == 0) {
1892 switch (tempdi[i].DATAPTR) {
1893 case 0:
1894 return &XGI_LVDSCRT11024x768_1_H[tempal];
1895 break;
1896 case 1:
1897 return &XGI_LVDSCRT11024x768_2_H[tempal];
1898 break;
1899 case 2:
1900 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1901 break;
1902 case 3:
1903 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1904 break;
1905 case 4:
1906 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1907 break;
1908 case 5:
1909 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1910 break;
1911 case 6:
1912 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1913 break;
1914 case 7:
1915 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1916 break;
1917 case 8:
1918 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1919 break;
1920 case 9:
1921 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1922 break;
1923 case 10:
1924 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1925 break;
1926 default:
1927 break;
1928 }
1929 } else if (table == 1) {
1930 switch (tempdi[i].DATAPTR) {
1931 case 0:
1932 return &XGI_LVDSCRT11024x768_1_V[tempal];
1933 break;
1934 case 1:
1935 return &XGI_LVDSCRT11024x768_2_V[tempal];
1936 break;
1937 case 2:
1938 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1939 break;
1940 case 3:
1941 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1942 break;
1943 case 4:
1944 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1945 break;
1946 case 5:
1947 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1948 break;
1949 case 6:
1950 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1951 break;
1952 case 7:
1953 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1954 break;
1955 case 8:
1956 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1957 break;
1958 case 9:
1959 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1960 break;
1961 case 10:
1962 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1963 break;
1964 default:
1965 break;
1966 }
1967 } else if (table == 2) {
1968 switch (tempdi[i].DATAPTR) {
1969 case 0:
1970 return &XGI_LVDS1024x768Data_1[tempal];
1971 break;
1972 case 1:
1973 return &XGI_LVDS1024x768Data_2[tempal];
1974 break;
1975 case 2:
1976 return &XGI_LVDS1280x1024Data_1[tempal];
1977 break;
1978 case 3:
1979 return &XGI_LVDS1280x1024Data_2[tempal];
1980 break;
1981 case 4:
1982 return &XGI_LVDS1400x1050Data_1[tempal];
1983 break;
1984 case 5:
1985 return &XGI_LVDS1400x1050Data_2[tempal];
1986 break;
1987 case 6:
1988 return &XGI_LVDS1600x1200Data_1[tempal];
1989 break;
1990 case 7:
1991 return &XGI_LVDSNoScalingData[tempal];
1992 break;
1993 case 8:
1994 return &XGI_LVDS1024x768Data_1x75[tempal];
1995 break;
1996 case 9:
1997 return &XGI_LVDS1024x768Data_2x75[tempal];
1998 break;
1999 case 10:
2000 return &XGI_LVDS1280x1024Data_1x75[tempal];
2001 break;
2002 case 11:
2003 return &XGI_LVDS1280x1024Data_2x75[tempal];
2004 break;
2005 case 12:
2006 return &XGI_LVDSNoScalingDatax75[tempal];
2007 break;
2008 default:
2009 break;
2010 }
2011 } else if (table == 3) {
2012 switch (tempdi[i].DATAPTR) {
2013 case 0:
2014 return &XGI_LVDS1024x768Des_1[tempal];
2015 break;
2016 case 1:
2017 return &XGI_LVDS1024x768Des_3[tempal];
2018 break;
2019 case 2:
2020 return &XGI_LVDS1024x768Des_2[tempal];
2021 break;
2022 case 3:
2023 return &XGI_LVDS1280x1024Des_1[tempal];
2024 break;
2025 case 4:
2026 return &XGI_LVDS1280x1024Des_2[tempal];
2027 break;
2028 case 5:
2029 return &XGI_LVDS1400x1050Des_1[tempal];
2030 break;
2031 case 6:
2032 return &XGI_LVDS1400x1050Des_2[tempal];
2033 break;
2034 case 7:
2035 return &XGI_LVDS1600x1200Des_1[tempal];
2036 break;
2037 case 8:
2038 return &XGI_LVDSNoScalingDesData[tempal];
2039 break;
2040 case 9:
2041 return &XGI_LVDS1024x768Des_1x75[tempal];
2042 break;
2043 case 10:
2044 return &XGI_LVDS1024x768Des_3x75[tempal];
2045 break;
2046 case 11:
2047 return &XGI_LVDS1024x768Des_2x75[tempal];
2048 break;
2049 case 12:
2050 return &XGI_LVDS1280x1024Des_1x75[tempal];
2051 break;
2052 case 13:
2053 return &XGI_LVDS1280x1024Des_2x75[tempal];
2054 break;
2055 case 14:
2056 return &XGI_LVDSNoScalingDesDatax75[tempal];
2057 break;
2058 default:
2059 break;
2060 }
2061 } else if (table == 4) {
2062 switch (tempdi[i].DATAPTR) {
2063 case 0:
2064 return &XGI_ExtLCD1024x768Data[tempal];
2065 break;
2066 case 1:
2067 return &XGI_StLCD1024x768Data[tempal];
2068 break;
2069 case 2:
2070 return &XGI_CetLCD1024x768Data[tempal];
2071 break;
2072 case 3:
2073 return &XGI_ExtLCD1280x1024Data[tempal];
2074 break;
2075 case 4:
2076 return &XGI_StLCD1280x1024Data[tempal];
2077 break;
2078 case 5:
2079 return &XGI_CetLCD1280x1024Data[tempal];
2080 break;
2081 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002082 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002083 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002084 break;
2085 case 8:
2086 return &XGI_CetLCD1400x1050Data[tempal];
2087 break;
2088 case 9:
2089 return &XGI_ExtLCD1600x1200Data[tempal];
2090 break;
2091 case 10:
2092 return &XGI_StLCD1600x1200Data[tempal];
2093 break;
2094 case 11:
2095 return &XGI_NoScalingData[tempal];
2096 break;
2097 case 12:
2098 return &XGI_ExtLCD1024x768x75Data[tempal];
2099 break;
2100 case 13:
2101 return &XGI_ExtLCD1024x768x75Data[tempal];
2102 break;
2103 case 14:
2104 return &XGI_CetLCD1024x768x75Data[tempal];
2105 break;
2106 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002107 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002108 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002109 break;
2110 case 17:
2111 return &XGI_CetLCD1280x1024x75Data[tempal];
2112 break;
2113 case 18:
2114 return &XGI_NoScalingDatax75[tempal];
2115 break;
2116 default:
2117 break;
2118 }
2119 } else if (table == 5) {
2120 switch (tempdi[i].DATAPTR) {
2121 case 0:
2122 return &XGI_ExtLCDDes1024x768Data[tempal];
2123 break;
2124 case 1:
2125 return &XGI_StLCDDes1024x768Data[tempal];
2126 break;
2127 case 2:
2128 return &XGI_CetLCDDes1024x768Data[tempal];
2129 break;
2130 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01002131 if ((pVBInfo->VBType & VB_SIS301LV) ||
2132 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002133 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2134 else
2135 return &XGI_ExtLCDDes1280x1024Data[tempal];
2136 break;
2137 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01002138 if ((pVBInfo->VBType & VB_SIS301LV) ||
2139 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002140 return &XGI_StLCDDLDes1280x1024Data[tempal];
2141 else
2142 return &XGI_StLCDDes1280x1024Data[tempal];
2143 break;
2144 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01002145 if ((pVBInfo->VBType & VB_SIS301LV) ||
2146 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002147 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2148 else
2149 return &XGI_CetLCDDes1280x1024Data[tempal];
2150 break;
2151 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002152 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01002153 if ((pVBInfo->VBType & VB_SIS301LV) ||
2154 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002155 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002156 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002157 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002158 break;
2159 case 8:
2160 return &XGI_CetLCDDes1400x1050Data[tempal];
2161 break;
2162 case 9:
2163 return &XGI_CetLCDDes1400x1050Data2[tempal];
2164 break;
2165 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01002166 if ((pVBInfo->VBType & VB_SIS301LV) ||
2167 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002168 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2169 else
2170 return &XGI_ExtLCDDes1600x1200Data[tempal];
2171 break;
2172 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01002173 if ((pVBInfo->VBType & VB_SIS301LV) ||
2174 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002175 return &XGI_StLCDDLDes1600x1200Data[tempal];
2176 else
2177 return &XGI_StLCDDes1600x1200Data[tempal];
2178 break;
2179 case 12:
2180 return &XGI_NoScalingDesData[tempal];
2181 break;
2182 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002183 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002184 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002185 break;
2186 case 15:
2187 return &XGI_CetLCDDes1024x768x75Data[tempal];
2188 break;
2189 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002190 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01002191 if ((pVBInfo->VBType & VB_SIS301LV) ||
2192 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002193 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002194 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002195 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002196 break;
2197 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01002198 if ((pVBInfo->VBType & VB_SIS301LV) ||
2199 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002200 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2201 else
2202 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2203 break;
2204 case 19:
2205 return &XGI_NoScalingDesDatax75[tempal];
2206 break;
2207 default:
2208 break;
2209 }
2210 } else if (table == 6) {
2211 switch (tempdi[i].DATAPTR) {
2212 case 0:
2213 return &XGI_CH7017LV1024x768[tempal];
2214 break;
2215 case 1:
2216 return &XGI_CH7017LV1400x1050[tempal];
2217 break;
2218 default:
2219 break;
2220 }
2221 }
2222 return NULL;
2223}
2224
2225static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2226 unsigned short ModeIdIndex,
2227 unsigned short RefreshRateTableIndex,
2228 struct vb_device_info *pVBInfo)
2229{
2230 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2231 struct XGI330_TVDataTablStruct *tempdi = NULL;
2232
2233 tempbx = BX;
2234
2235 if (ModeNo <= 0x13) {
2236 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2237 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2238 } else {
2239 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2240 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2241 }
2242
2243 tempal = tempal & 0x3f;
2244 table = tempbx;
2245
2246 switch (tempbx) {
2247 case 0:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02002248 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002249 break;
2250 case 1:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02002251 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002252 break;
2253 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03002254 case 6:
2255 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002256 break;
2257 case 3:
2258 tempdi = NULL;
2259 break;
2260 case 4:
2261 tempdi = XGI_TVDataTable;
2262 break;
2263 case 5:
2264 tempdi = NULL;
2265 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002266 default:
2267 break;
2268 }
2269
2270 if (tempdi == NULL) /* OEMUtil */
2271 return NULL;
2272
2273 tempdx = pVBInfo->TVInfo;
2274
2275 if (pVBInfo->VBInfo & SetInSlaveMode)
2276 tempdx = tempdx | SetTVLockMode;
2277
2278 if (modeflag & HalfDCLK)
2279 tempdx = tempdx | SetTVLowResolution;
2280
2281 i = 0;
2282
2283 while (tempdi[i].MASK != 0xffff) {
2284 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2285 break;
2286 i++;
2287 }
2288
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002289 /* 07/05/22 */
Aaro Koskinenebe33022011-11-27 23:03:18 +02002290 if (table == 0x04) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002291 switch (tempdi[i].DATAPTR) {
2292 case 0:
2293 return &XGI_ExtPALData[tempal];
2294 break;
2295 case 1:
2296 return &XGI_ExtNTSCData[tempal];
2297 break;
2298 case 2:
2299 return &XGI_StPALData[tempal];
2300 break;
2301 case 3:
2302 return &XGI_StNTSCData[tempal];
2303 break;
2304 case 4:
2305 return &XGI_ExtHiTVData[tempal];
2306 break;
2307 case 5:
2308 return &XGI_St2HiTVData[tempal];
2309 break;
2310 case 6:
2311 return &XGI_ExtYPbPr525iData[tempal];
2312 break;
2313 case 7:
2314 return &XGI_ExtYPbPr525pData[tempal];
2315 break;
2316 case 8:
2317 return &XGI_ExtYPbPr750pData[tempal];
2318 break;
2319 case 9:
2320 return &XGI_StYPbPr525iData[tempal];
2321 break;
2322 case 10:
2323 return &XGI_StYPbPr525pData[tempal];
2324 break;
2325 case 11:
2326 return &XGI_StYPbPr750pData[tempal];
2327 break;
2328 case 12: /* avoid system hang */
2329 return &XGI_ExtNTSCData[tempal];
2330 break;
2331 case 13:
2332 return &XGI_St1HiTVData[tempal];
2333 break;
2334 default:
2335 break;
2336 }
2337 } else if (table == 0x02) {
2338 switch (tempdi[i].DATAPTR) {
2339 case 0:
2340 return &XGI_CHTVUNTSCData[tempal];
2341 break;
2342 case 1:
2343 return &XGI_CHTVONTSCData[tempal];
2344 break;
2345 case 2:
2346 return &XGI_CHTVUPALData[tempal];
2347 break;
2348 case 3:
2349 return &XGI_CHTVOPALData[tempal];
2350 break;
2351 default:
2352 break;
2353 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002354 }
2355 return NULL;
2356}
2357
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002358static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302359 unsigned short RefreshRateTableIndex,
2360 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002361{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302362 unsigned short tempbx;
2363 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302365 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002366
Peter Huewea3d675c2012-02-09 21:11:47 +01002367 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302368 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2369 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2370 pVBInfo);
2371 pVBInfo->VGAHT = LCDPtr->VGAHT;
2372 pVBInfo->VGAVT = LCDPtr->VGAVT;
2373 pVBInfo->HT = LCDPtr->LCDHT;
2374 pVBInfo->VT = LCDPtr->LCDVT;
2375 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002376
Peter Huewea3d675c2012-02-09 21:11:47 +01002377 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302378 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2379 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002380 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2381 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302382 pVBInfo->HDE = 1024;
2383 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002384 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2385 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302386 pVBInfo->HDE = 1280;
2387 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002388 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302389 pVBInfo->HDE = 1400;
2390 pVBInfo->VDE = 1050;
2391 } else {
2392 pVBInfo->HDE = 1600;
2393 pVBInfo->VDE = 1200;
2394 }
2395 }
2396 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002397}
2398
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002399static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302400 unsigned short RefreshRateTableIndex,
2401 struct xgi_hw_device_info *HwDeviceExtension,
2402 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002403{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302404 unsigned char index;
2405 unsigned short tempbx, i;
2406 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2407 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302409 if (ModeNo <= 0x13)
2410 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2411 else
2412 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302414 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002415
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002416 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002417
Peter Huewea3d675c2012-02-09 21:11:47 +01002418 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002419 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2420 XGI_GetLcdPtr(tempbx, ModeNo,
2421 ModeIdIndex,
2422 RefreshRateTableIndex,
2423 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002424
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002425 for (i = 0; i < 8; i++)
2426 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302427 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002428
2429 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
2430
2431 tempbx = 1;
2432
Peter Huewea3d675c2012-02-09 21:11:47 +01002433 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002434 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2435 XGI_GetLcdPtr(
2436 tempbx,
2437 ModeNo,
2438 ModeIdIndex,
2439 RefreshRateTableIndex,
2440 pVBInfo);
2441 for (i = 0; i < 7; i++)
2442 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2443 }
2444
2445 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002446}
2447
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002448static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2449{
2450 unsigned char tempal, tempah, tempbl, i;
2451
Aaro Koskinen58839b02011-03-13 12:26:23 +02002452 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002453 tempal = tempah & 0x0F;
2454 tempah = tempah & 0xF0;
2455 i = 0;
2456 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2457
2458 while (tempbl != 0xFF) {
2459 if (tempbl & 0x80) { /* OEMUtil */
2460 tempal = tempah;
2461 tempbl = tempbl & ~(0x80);
2462 }
2463
2464 if (tempal == tempbl)
2465 break;
2466
2467 i++;
2468
2469 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2470 }
2471
2472 return i;
2473}
2474
2475static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2476{
2477 unsigned short tempah, tempal, tempbl, i;
2478
2479 tempal = pVBInfo->LCDResInfo;
2480 tempah = pVBInfo->LCDTypeInfo;
2481
2482 i = 0;
2483 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2484
2485 while (tempbl != 0xFF) {
2486 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2487 tempal = tempah;
2488 tempbl &= ~0x80;
2489 }
2490
2491 if (tempal == tempbl)
2492 break;
2493
2494 i++;
2495 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2496 }
2497
2498 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002499 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002500 pVBInfo->LCDTypeInfo = 0;
2501 i = 0;
2502 }
2503
2504 return i;
2505}
2506
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002507static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2508 unsigned short *VSyncWidth,
2509 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002510{
2511 unsigned short Index;
2512
2513 Index = XGI_GetLCDCapPtr(pVBInfo);
2514 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2515 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2516
2517 return;
2518}
2519
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002520static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302521 unsigned short RefreshRateTableIndex,
2522 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002523{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302524 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2525 unsigned long temp, temp1, temp2, temp3, push3;
2526 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2527 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002528
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302529 if (ModeNo > 0x13)
2530 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2531 else
2532 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002533
Aaro Koskinen66cface2011-08-31 21:46:13 +03002534 tempbx = 3;
2535 if (pVBInfo->LCDInfo & EnableScalingLCD)
2536 LCDPtr1 =
2537 (struct XGI330_LCDDataDesStruct2 *)
2538 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002539 tempbx,
2540 ModeNo,
2541 ModeIdIndex,
2542 RefreshRateTableIndex,
2543 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002544 else
2545 LCDPtr =
2546 (struct XGI330_LCDDataDesStruct *)
2547 XGI_GetLcdPtr(
2548 tempbx,
2549 ModeNo,
2550 ModeIdIndex,
2551 RefreshRateTableIndex,
2552 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002553
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002554 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2555 push1 = tempbx;
2556 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002557
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002558 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002559 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2560 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002561 tempax = 1024;
2562 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002563 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2564 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002565 tempax = 1280;
2566 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002567 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002568 tempax = 1400;
2569 tempbx = 1050;
2570 } else {
2571 tempax = 1600;
2572 tempbx = 1200;
2573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002574
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002575 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2576 pVBInfo->HDE = tempax;
2577 pVBInfo->VDE = tempbx;
2578 pVBInfo->VGAHDE = tempax;
2579 pVBInfo->VGAVDE = tempbx;
2580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002581
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002582 tempax = pVBInfo->HT;
2583
2584 if (pVBInfo->LCDInfo & EnableScalingLCD)
2585 tempbx = LCDPtr1->LCDHDES;
2586 else
2587 tempbx = LCDPtr->LCDHDES;
2588
2589 tempcx = pVBInfo->HDE;
2590 tempbx = tempbx & 0x0fff;
2591 tempcx += tempbx;
2592
2593 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002594 tempcx -= tempax;
2595
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002596 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002597
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002598 tempcx = tempcx >> 3;
2599 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002600
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002601 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2602 (unsigned short) (tempbx & 0xff));
2603 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2604 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002605
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002606 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002607
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002608 if (pVBInfo->LCDInfo & EnableScalingLCD)
2609 tempbx = LCDPtr1->LCDHRS;
2610 else
2611 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002612
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002613 tempcx = push2;
2614
2615 if (pVBInfo->LCDInfo & EnableScalingLCD)
2616 tempcx = LCDPtr1->LCDHSync;
2617
2618 tempcx += tempbx;
2619
2620 if (tempcx >= tempax)
2621 tempcx -= tempax;
2622
2623 tempax = tempbx & 0x07;
2624 tempax = tempax >> 5;
2625 tempcx = tempcx >> 3;
2626 tempbx = tempbx >> 3;
2627
2628 tempcx &= 0x1f;
2629 tempax |= tempcx;
2630
2631 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2632 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2633 (unsigned short) (tempbx & 0xff));
2634
2635 tempax = pVBInfo->VT;
2636 if (pVBInfo->LCDInfo & EnableScalingLCD)
2637 tempbx = LCDPtr1->LCDVDES;
2638 else
2639 tempbx = LCDPtr->LCDVDES;
2640 tempcx = pVBInfo->VDE;
2641
2642 tempbx = tempbx & 0x0fff;
2643 tempcx += tempbx;
2644 if (tempcx >= tempax)
2645 tempcx -= tempax;
2646
2647 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2648 (unsigned short) (tempbx & 0xff));
2649 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2650 (unsigned short) (tempcx & 0xff));
2651
2652 tempbx = (tempbx >> 8) & 0x07;
2653 tempcx = (tempcx >> 8) & 0x07;
2654
2655 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2656 (unsigned short) ((tempcx << 3)
2657 | tempbx));
2658
2659 tempax = pVBInfo->VT;
2660 if (pVBInfo->LCDInfo & EnableScalingLCD)
2661 tempbx = LCDPtr1->LCDVRS;
2662 else
2663 tempbx = LCDPtr->LCDVRS;
2664
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002665 tempcx = push1;
2666
2667 if (pVBInfo->LCDInfo & EnableScalingLCD)
2668 tempcx = LCDPtr1->LCDVSync;
2669
2670 tempcx += tempbx;
2671 if (tempcx >= tempax)
2672 tempcx -= tempax;
2673
2674 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2675 (unsigned short) (tempbx & 0xff));
2676 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2677 (unsigned short) (tempcx & 0x0f));
2678
2679 tempax = ((tempbx >> 8) & 0x07) << 3;
2680
2681 tempbx = pVBInfo->VGAVDE;
2682 if (tempbx != pVBInfo->VDE)
2683 tempax |= 0x40;
2684
Peter Huewea3d675c2012-02-09 21:11:47 +01002685 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002686 tempax |= 0x40;
2687
2688 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2689 tempax);
2690
2691 tempcx = pVBInfo->VGAVT;
2692 tempbx = pVBInfo->VDE;
2693 tempax = pVBInfo->VGAVDE;
2694 tempcx -= tempax;
2695
2696 temp = tempax; /* 0430 ylshieh */
2697 temp1 = (temp << 18) / tempbx;
2698
2699 tempdx = (unsigned short) ((temp << 18) % tempbx);
2700
2701 if (tempdx != 0)
2702 temp1 += 1;
2703
2704 temp2 = temp1;
2705 push3 = temp2;
2706
2707 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2708 (unsigned short) (temp2 & 0xff));
2709 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2710 (unsigned short) ((temp2 >> 8) & 0xff));
2711
2712 tempbx = (unsigned short) (temp2 >> 16);
2713 tempax = tempbx & 0x03;
2714
2715 tempbx = pVBInfo->VGAVDE;
2716 if (tempbx == pVBInfo->VDE)
2717 tempax |= 0x04;
2718
2719 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2720
2721 if (pVBInfo->VBType & VB_XGI301C) {
2722 temp2 = push3;
2723 xgifb_reg_set(pVBInfo->Part4Port,
2724 0x3c,
2725 (unsigned short) (temp2 & 0xff));
2726 xgifb_reg_set(pVBInfo->Part4Port,
2727 0x3b,
2728 (unsigned short) ((temp2 >> 8) &
2729 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002730 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002731 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2732 ~0xc0,
2733 (unsigned short) ((tempbx &
2734 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002735
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002736 tempcx = pVBInfo->VGAVDE;
2737 if (tempcx == pVBInfo->VDE)
2738 xgifb_reg_and_or(pVBInfo->Part4Port,
2739 0x30, ~0x0c, 0x00);
2740 else
2741 xgifb_reg_and_or(pVBInfo->Part4Port,
2742 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302743 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002744
2745 tempcx = pVBInfo->VGAHDE;
2746 tempbx = pVBInfo->HDE;
2747
2748 temp1 = tempcx << 16;
2749
2750 tempax = (unsigned short) (temp1 / tempbx);
2751
2752 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2753 tempax = 65535;
2754
2755 temp3 = tempax;
2756 temp1 = pVBInfo->VGAHDE << 16;
2757
2758 temp1 /= temp3;
2759 temp3 = temp3 << 16;
2760 temp1 -= 1;
2761
2762 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2763
2764 tempax = (unsigned short) (temp3 & 0xff);
2765 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2766
2767 temp1 = pVBInfo->VGAVDE << 18;
2768 temp1 = temp1 / push3;
2769 tempbx = (unsigned short) (temp1 & 0xffff);
2770
Peter Huewe255aabd2012-02-09 21:11:44 +01002771 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002772 tempbx -= 1;
2773
2774 tempax = ((tempbx >> 8) & 0xff) << 3;
2775 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2776 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2777 (unsigned short) (tempax & 0xff));
2778 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2779 (unsigned short) (tempbx & 0xff));
2780
2781 temp3 = temp3 >> 16;
2782
2783 if (modeflag & HalfDCLK)
2784 temp3 = temp3 >> 1;
2785
2786 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2787 (unsigned short) ((temp3 >> 8) & 0xff));
2788 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2789 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002790}
2791
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002792/* --------------------------------------------------------------------- */
2793/* Function : XGI_GETLCDVCLKPtr */
2794/* Input : */
2795/* Output : al -> VCLK Index */
2796/* Description : */
2797/* --------------------------------------------------------------------- */
2798static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2799 struct vb_device_info *pVBInfo)
2800{
2801 unsigned short index;
2802
Peter Huewea3d675c2012-02-09 21:11:47 +01002803 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002804 index = XGI_GetLCDCapPtr1(pVBInfo);
2805
2806 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2807 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2808 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2809 } else { /* LCDA */
2810 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2811 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2812 }
2813 }
2814 return;
2815}
2816
2817static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2818 unsigned short ModeNo, unsigned short ModeIdIndex,
2819 struct vb_device_info *pVBInfo)
2820{
2821
2822 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002823 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002824
2825 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002826 /* si+St_ResInfo */
2827 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002828 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002829 /* si+Ext_ResInfo */
2830 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002831
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002832 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2833 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002834 index = XGI_GetLCDCapPtr(pVBInfo);
2835 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2836
Peter Huewea3d675c2012-02-09 21:11:47 +01002837 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002838 return tempal;
2839
2840 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002841 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002842 (VB_SIS301B |
2843 VB_SIS302B |
2844 VB_SIS301LV |
2845 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002846 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002847 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002848 tempal = HiTVVCLKDIV2;
2849 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2850 tempal = HiTVVCLK;
2851 if (pVBInfo->TVInfo & TVSimuMode) {
2852 tempal = HiTVSimuVCLK;
2853 if (!(modeflag & Charx8Dot))
2854 tempal = HiTVTextVCLK;
2855
2856 }
2857 return tempal;
2858 }
2859
Peter Huewe599801f2012-02-09 21:11:45 +01002860 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002861 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002862 return tempal;
2863 }
2864
Peter Huewe599801f2012-02-09 21:11:45 +01002865 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002866 tempal = YPbPr525pVCLK;
2867 return tempal;
2868 }
2869
2870 tempal = NTSC1024VCLK;
2871
2872 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
2873 tempal = TVVCLKDIV2;
2874 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2875 tempal = TVVCLK;
2876 }
2877
2878 if (pVBInfo->VBInfo & SetCRT2ToTV)
2879 return tempal;
2880 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002881 } /* {End of VB} */
2882
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002883 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002884 tempal = tempal >> 2;
2885 tempal &= 0x03;
2886
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002887 /* for Dot8 Scaling LCD */
2888 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002889 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2890
2891 if (ModeNo <= 0x13)
2892 return tempal;
2893
2894 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2895 return tempal;
2896}
2897
2898static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2899 unsigned char *di_1, struct vb_device_info *pVBInfo)
2900{
Peter Huewe6896b942012-02-09 21:11:46 +01002901 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2902 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002903 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) && (pVBInfo->SetFlag
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002904 & ProgrammingCRT2)) {
2905 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2906 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2907 }
2908 } else {
2909 *di_0 = XGI_VCLKData[tempal].SR2B;
2910 *di_1 = XGI_VCLKData[tempal].SR2C;
2911 }
2912}
2913
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002914static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302915 unsigned short RefreshRateTableIndex,
2916 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002917{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302918 unsigned char di_0, di_1, tempal;
2919 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002920
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302921 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2922 pVBInfo);
2923 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2924 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002927 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302928 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002929 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302930 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002931 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2932 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302933 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002934 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2935 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302936 }
2937 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002938}
2939
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002940static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302941 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002942{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002944
Peter Huewe6896b942012-02-09 21:11:46 +01002945 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2946 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302947 tempcl = 0;
2948 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002949 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302951 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002952 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302953 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002954 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302955 if (!(temp & 0x40))
2956 tempcl |= ActiveCRT1;
2957 }
2958 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002959
Aaro Koskinen58839b02011-03-13 12:26:23 +02002960 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302961 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302963 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002964 /* Check ChannelA by Part1_13 [2003/10/03] */
2965 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302966 if (tempax & 0x04)
2967 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302969 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002970
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302971 if (!(tempcl & ActiveLCD))
2972 if (temp == 0x01)
2973 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002974
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302975 if (temp == 0x04)
2976 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302978 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002979 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302981 if (!(temp & 0x08))
2982 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302984 if (!(temp & 0x04))
2985 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302987 if (temp & 0x02)
2988 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002989
Peter Huewe599801f2012-02-09 21:11:45 +01002990 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302991 if (temp & 0x01)
2992 tempch |= ActiveHiTV;
2993 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002994
Peter Huewe599801f2012-02-09 21:11:45 +01002995 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002996 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 pVBInfo->Part2Port,
2998 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303000 if (temp & 0x10)
3001 tempch |= ActiveYPbPr;
3002 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303004 if (tempch != 0)
3005 tempcl |= ActiveTV;
3006 }
3007 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003008
Aaro Koskinen58839b02011-03-13 12:26:23 +02003009 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303010 if (tempcl & ActiveLCD) {
3011 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3012 if (temp & ActiveTV)
3013 tempcl |= ActiveTV;
3014 }
3015 }
3016 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01003017 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003018 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303020 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003021 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303022 } else {
3023 return;
3024 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003025}
3026
Bill Pemberton80adad82010-06-17 13:10:51 -04003027void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003028{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303029 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303031 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003032 tempbx = VB_SIS302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003033 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303034 if (flag != 0x02) {
Peter Huewe6896b942012-02-09 21:11:46 +01003035 tempbx = VB_SIS301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003036 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303037 if (flag >= 0xB0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003038 tempbx = VB_SIS301B;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303039 if (flag >= 0xC0) {
3040 tempbx = VB_XGI301C;
3041 if (flag >= 0xD0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003042 tempbx = VB_SIS301LV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303043 if (flag >= 0xE0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003044 tempbx = VB_SIS302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003045 tempah = xgifb_reg_get(
3046 pVBInfo->Part4Port,
3047 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303048 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003049 tempbx =
3050 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303051 }
3052 }
3053 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003054
Peter Huewe6896b942012-02-09 21:11:46 +01003055 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003056 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303057 pVBInfo->Part4Port,
3058 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303060 if (!(flag & 0x02))
3061 tempbx = tempbx | VB_NoLCD;
3062 }
3063 }
3064 }
3065 pVBInfo->VBType = tempbx;
3066 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003067}
3068
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003069static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303070 struct xgi_hw_device_info *HwDeviceExtension,
3071 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003072{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303073 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303075 if (ModeNo <= 0x13)
3076 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3077 else
3078 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303080 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01003081 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303082 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303084 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003085 /* Check Display Device */
3086 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303087 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003088 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 push = temp;
3090 push = push << 8;
3091 tempax = temp << 8;
3092 tempbx = tempbx | tempax;
Peter Huewea3d675c2012-02-09 21:11:47 +01003093 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303094 | SetInSlaveMode | DisableCRT2Display);
3095 temp = 0xFFFF ^ temp;
3096 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003097
Aaro Koskinen58839b02011-03-13 12:26:23 +02003098 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003099
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303100 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003101
Aaro Koskinen9ffc7e92011-11-27 23:03:14 +02003102 if ((HwDeviceExtension->jChipType >= XG20) ||
3103 (HwDeviceExtension->jChipType >= XG40)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303104 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003105 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003106 (VB_SIS302B |
3107 VB_SIS301LV |
3108 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003109 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303110 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003111 tempbx |=
3112 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303114 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003115 tempbx |=
Peter Huewea3d675c2012-02-09 21:11:47 +01003116 XGI_SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303117 }
3118 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303119 }
3120 }
3121 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303123 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003124 /* [Billy] 07/05/04 */
3125 if (((pVBInfo->IF_DEF_LVDS == 0) &&
Peter Huewe6896b942012-02-09 21:11:46 +01003126 ((pVBInfo->VBType & VB_SIS301LV) ||
3127 (pVBInfo->VBType & VB_SIS302LV) ||
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003128 (pVBInfo->VBType & VB_XGI301C)))) {
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02003129 if (temp & SetYPbPr) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303130 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003131 /* shampoo add for new
3132 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003133 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303134 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003135 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303136 temp &= YPbPrMode;
Peter Huewe599801f2012-02-09 21:11:45 +01003137 tempbx |= SetCRT2ToHiVision;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303139 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003140 tempbx &=
Peter Huewe599801f2012-02-09 21:11:45 +01003141 (~SetCRT2ToHiVision);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003142 tempbx |=
Peter Huewe599801f2012-02-09 21:11:45 +01003143 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303144 }
3145 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 }
3147 }
3148 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303150 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 if (pVBInfo->IF_DEF_LVDS == 0) {
3153 if (pVBInfo->IF_DEF_YPbPr == 1) {
3154 if (pVBInfo->IF_DEF_HiVision == 1)
3155 temp = 0x09FC;
3156 else
3157 temp = 0x097C;
3158 } else {
3159 if (pVBInfo->IF_DEF_HiVision == 1)
3160 temp = 0x01FC;
3161 else
3162 temp = 0x017C;
3163 }
3164 } else { /* 3nd party chip */
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003165 temp = SetCRT2ToLCD;
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 if (!(tempbx & temp)) {
3169 tempax |= DisableCRT2Display;
3170 tempbx = 0;
3171 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3174 if (!(pVBInfo->VBType & VB_NoLCD)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003175 if (tempbx & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003177 tempbx &= (~(SetCRT2ToLCD |
3178 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01003179 SwitchCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303180 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003181 tempbx &= (~(SetCRT2ToLCD |
3182 SetCRT2ToRAMDAC |
3183 SetCRT2ToTV |
Peter Huewe6896b942012-02-09 21:11:46 +01003184 SwitchCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303185 }
3186 }
3187 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303189 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003190 /* for driver abnormal */
Peter Huewe6896b942012-02-09 21:11:46 +01003191 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303192 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3193 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003194 tempbx &= (0xFF00 |
3195 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01003196 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003197 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003198 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303199 }
3200 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003201 tempbx &= (~(SetCRT2ToRAMDAC |
3202 SetCRT2ToLCD |
3203 SetCRT2ToTV));
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 (!(pVBInfo->VBType & VB_NoLCD)) {
3208 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003209 tempbx &= (0xFF00 |
3210 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01003211 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003212 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003213 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 }
3215 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003216
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303217 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003218 tempbx &= (0xFF00 |
3219 SetCRT2ToSCART |
Peter Huewe6896b942012-02-09 21:11:46 +01003220 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003221 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003222 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303223 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003224
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303225 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003226 if (tempbx & SetCRT2ToYPbPr525750)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003227 tempbx &= (0xFF00 |
Peter Huewe6896b942012-02-09 21:11:46 +01003228 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003229 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303230 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303232 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003233 if (tempbx & SetCRT2ToHiVision)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003234 tempbx &= (0xFF00 |
Peter Huewe599801f2012-02-09 21:11:45 +01003235 SetCRT2ToHiVision |
Peter Huewe6896b942012-02-09 21:11:46 +01003236 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003237 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303238 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303240 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
Peter Huewe6896b942012-02-09 21:11:46 +01003241 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303242 tempbx = DisableCRT2Display;
3243 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003246 if ((!(tempbx & DriverMode)) ||
3247 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303248 if (pVBInfo->IF_DEF_LCDA == 1) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003249 if (!(tempbx & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003250 tempbx |= (SetInSlaveMode |
3251 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303252 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303253 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003254
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003255 /* LCD+TV can't support in slave mode
3256 * (Force LCDA+TV->LCDB) */
3257 if ((tempbx & SetInSlaveMode) &&
Peter Huewea3d675c2012-02-09 21:11:47 +01003258 (tempbx & XGI_SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003259 tempbx ^= (SetCRT2ToLCD |
Peter Huewea3d675c2012-02-09 21:11:47 +01003260 XGI_SetCRT2ToLCDA |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003261 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303262 pVBInfo->SetFlag |= ReserveTVOption;
3263 }
3264 }
3265 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003266
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303267 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003268}
3269
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003270static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303271 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003272{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303273 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003274
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303275 tempbx = 0;
3276 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303278 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3279 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003280 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3281 St_ModeFlag; /* si+St_ModeFlag */
3282 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3283 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303284 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003285 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3286 Ext_ModeFlag;
3287 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3288 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003292 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303293 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01003294 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003295 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01003296 TVSetPALM |
3297 TVSetPALN |
3298 TVSetPAL);
3299 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003300 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01003301 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303302 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003303 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01003304 TVSetNTSCJ |
3305 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303306 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003307
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303308 if (pVBInfo->IF_DEF_LVDS == 0) {
3309 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01003310 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303311 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003314 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003315 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303316 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303318 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01003319 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003320
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303321 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01003322 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303323 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01003324 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303325 }
3326 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303328 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003329 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3330 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003332
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303333 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003334 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3335 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303336 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003337
Peter Huewe599801f2012-02-09 21:11:45 +01003338 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003339 (modeflag > 13) &&
3340 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303341 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003342
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303343 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003344
Peter Huewe599801f2012-02-09 21:11:45 +01003345 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303346 if (pVBInfo->VBInfo & SetInSlaveMode)
3347 tempbx &= (~RPLLDIV2XO);
3348 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003349 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01003350 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003352 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003353 (VB_SIS301B |
3354 VB_SIS302B |
3355 VB_SIS301LV |
3356 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003357 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303358 if (tempbx & TVSimuMode)
3359 tempbx &= (~RPLLDIV2XO);
3360 }
3361 }
3362 }
3363 }
3364 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003365}
3366
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003367static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
3368 unsigned short ModeIdIndex, 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 temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003371
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303372 pVBInfo->LCDResInfo = 0;
3373 pVBInfo->LCDTypeInfo = 0;
3374 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303376 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003377 /* si+St_ModeFlag // */
3378 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303379 } else {
3380 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003381 /* si+Ext_ResInfo // */
3382 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003384
Aaro Koskinen58839b02011-03-13 12:26:23 +02003385 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303386 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003387
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303388 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01003389 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303391 /* LCD75 [2003/8/22] Vicent */
Peter Huewe255aabd2012-02-09 21:11:44 +01003392 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303393 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003394 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01003395 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303396 tempax &= 0x0F;
3397 else
3398 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 if ((resinfo == 6) || (resinfo == 9)) {
3401 if (tempax >= 3)
3402 tempbx |= PanelRef75Hz;
3403 } else if ((resinfo == 7) || (resinfo == 8)) {
3404 if (tempax >= 4)
3405 tempbx |= PanelRef75Hz;
3406 }
3407 }
3408 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003409
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303410 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303412 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003413
Peter Huewea3d675c2012-02-09 21:11:47 +01003414 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303415 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303417 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003418
Aaro Koskinen58839b02011-03-13 12:26:23 +02003419 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003420
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303423 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303425 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303427 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003428
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303429 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01003430 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01003431 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303432 tempbx |= SetLCDDualLink;
3433 }
3434 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303436 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003437 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303438 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3439 == 9) && (!(tempbx & EnableScalingLCD)))
Peter Huewe255aabd2012-02-09 21:11:44 +01003440 /* set to center in 1280x1024 LCDB for Panel_1400x1050 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003441 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303442 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303444 if (pVBInfo->IF_DEF_ExpLink == 1) {
3445 if (modeflag & HalfDCLK) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303446 if (!(tempbx & SetLCDtoNonExpanding)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003447 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303448 } else {
3449 if (ModeNo > 0x13) {
3450 if (pVBInfo->LCDResInfo
Peter Huewe255aabd2012-02-09 21:11:44 +01003451 == Panel_1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003452 if (resinfo == 4) {/* 512x384 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003453 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303454 }
3455 }
3456 }
3457 }
3458 }
3459 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303461 if (pVBInfo->VBInfo & SetInSlaveMode) {
3462 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01003463 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303464 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01003465 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303466 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003469
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303470 if (pVBInfo->IF_DEF_LVDS == 0) {
3471 if (tempax & (LockLCDBToA | StLCDBToA)) {
3472 if (pVBInfo->VBInfo & SetInSlaveMode) {
3473 if (!(tempax & LockLCDBToA)) {
3474 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003475 pVBInfo->VBInfo &=
3476 ~(SetSimuScanMode |
3477 SetInSlaveMode |
3478 SetCRT2ToLCD);
3479 pVBInfo->VBInfo |=
Peter Huewea3d675c2012-02-09 21:11:47 +01003480 XGI_SetCRT2ToLCDA |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003481 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303482 }
3483 }
3484 }
3485 }
3486 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003487
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303488 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003489}
3490
Bill Pemberton108afbf2010-06-17 13:10:47 -04003491unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303492 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003493{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303494 if (ModeNo <= 5)
3495 ModeNo |= 1;
3496 if (ModeNo <= 0x13) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303497 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003498 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3499 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303500 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003501 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3502 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303503 return 0;
3504 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303506 if (ModeNo == 0x07)
3507 (*ModeIdIndex)++; /* 400 lines */
3508 if (ModeNo <= 3)
3509 (*ModeIdIndex) += 2; /* 400 lines */
3510 /* else 350 lines */
3511 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303512 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003513 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3514 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003516 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3517 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303518 return 0;
3519 }
3520 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003523}
3524
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003525static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3526{
3527 unsigned char ujRet = 0;
3528 unsigned char i = 0;
3529
3530 for (i = 0; i < 8; i++) {
3531 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003532 ujRet |= (ujDate >> i) & 1;
3533 }
3534
3535 return ujRet;
3536}
3537
3538/*----------------------------------------------------------------------------*/
3539/* output */
3540/* bl[5] : LVDS signal */
3541/* bl[1] : LVDS backlight */
3542/* bl[0] : LVDS VDD */
3543/*----------------------------------------------------------------------------*/
3544static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3545{
3546 unsigned char CR4A, temp;
3547
Aaro Koskinen58839b02011-03-13 12:26:23 +02003548 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003549 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003550
Aaro Koskinen58839b02011-03-13 12:26:23 +02003551 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003552
3553 temp = XG21GPIODataTransfer(temp);
3554 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003555 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003556 return temp;
3557}
3558
3559/*----------------------------------------------------------------------------*/
3560/* output */
3561/* bl[5] : LVDS signal */
3562/* bl[1] : LVDS backlight */
3563/* bl[0] : LVDS VDD */
3564/*----------------------------------------------------------------------------*/
3565static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3566{
3567 unsigned char CR4A, CRB4, temp;
3568
Aaro Koskinen58839b02011-03-13 12:26:23 +02003569 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003570 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003571
Aaro Koskinen58839b02011-03-13 12:26:23 +02003572 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003573
3574 temp &= 0x0C;
3575 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003576 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003577 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003578 temp |= ((CRB4 & 0x04) << 3);
3579 return temp;
3580}
3581
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003582/*----------------------------------------------------------------------------*/
3583/* input */
3584/* bl[5] : 1;LVDS signal on */
3585/* bl[1] : 1;LVDS backlight on */
3586/* bl[0] : 1:LVDS VDD on */
3587/* bh: 100000b : clear bit 5, to set bit5 */
3588/* 000010b : clear bit 1, to set bit1 */
3589/* 000001b : clear bit 0, to set bit0 */
3590/*----------------------------------------------------------------------------*/
3591static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3592 struct vb_device_info *pVBInfo)
3593{
3594 unsigned char CR4A, temp;
3595
3596 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3597 tempbh &= 0x23;
3598 tempbl &= 0x23;
3599 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3600
3601 if (tempbh & 0x20) {
3602 temp = (tempbl >> 4) & 0x02;
3603
3604 /* CR B4[1] */
3605 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3606
3607 }
3608
3609 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3610
3611 temp = XG21GPIODataTransfer(temp);
3612 temp &= ~tempbh;
3613 temp |= tempbl;
3614 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3615}
3616
Aaro Koskinen776115a2011-11-27 23:03:10 +02003617static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3618 struct vb_device_info *pVBInfo)
3619{
3620 unsigned char CR4A, temp;
3621 unsigned short tempbh0, tempbl0;
3622
3623 tempbh0 = tempbh;
3624 tempbl0 = tempbl;
3625 tempbh0 &= 0x20;
3626 tempbl0 &= 0x20;
3627 tempbh0 >>= 3;
3628 tempbl0 >>= 3;
3629
3630 if (tempbh & 0x20) {
3631 temp = (tempbl >> 4) & 0x02;
3632
3633 /* CR B4[1] */
3634 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3635
3636 }
3637 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3638
3639 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3640 tempbh &= 0x03;
3641 tempbl &= 0x03;
3642 tempbh <<= 2;
3643 tempbl <<= 2; /* GPIOC,GPIOD */
3644 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3645 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3646}
3647
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003648/* --------------------------------------------------------------------- */
3649/* Function : XGI_XG21SetPanelDelay */
3650/* Input : */
3651/* Output : */
3652/* Description : */
3653/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
3654/* : bl : 2 ; T2 : the duration signal on and Vdd on */
3655/* : bl : 3 ; T3 : the duration between CPL off and signal off */
3656/* : bl : 4 ; T4 : the duration signal off and Vdd off */
3657/* --------------------------------------------------------------------- */
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003658static void XGI_XG21SetPanelDelay(struct xgifb_video_info *xgifb_info,
3659 unsigned short tempbl,
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003660 struct vb_device_info *pVBInfo)
3661{
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003662 if (tempbl == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003663 mdelay(xgifb_info->lvds_data.PSC_S1);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003664
3665 if (tempbl == 2)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003666 mdelay(xgifb_info->lvds_data.PSC_S2);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003667
3668 if (tempbl == 3)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003669 mdelay(xgifb_info->lvds_data.PSC_S3);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003670
3671 if (tempbl == 4)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003672 mdelay(xgifb_info->lvds_data.PSC_S4);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003673}
3674
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003675static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3676 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303677 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003678{
3679
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003680 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303681 if (pXGIHWDE->jChipType == XG21) {
3682 if (pVBInfo->IF_DEF_LVDS == 1) {
3683 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003684 /* LVDS VDD on */
3685 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003686 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303687 }
3688 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003689 /* LVDS signal on */
3690 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003691 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003692 /* LVDS backlight on */
3693 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303694 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003695 /* DVO/DVI signal on */
3696 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303697 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303699 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003700
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 if (pXGIHWDE->jChipType == XG27) {
3702 if (pVBInfo->IF_DEF_LVDS == 1) {
3703 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003704 /* LVDS VDD on */
3705 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003706 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303707 }
3708 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003709 /* LVDS signal on */
3710 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003711 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003712 /* LVDS backlight on */
3713 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303714 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003715 /* DVO/DVI signal on */
3716 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303717 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303719 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003720}
3721
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003722void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3723 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303724 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003725{
3726
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303727 if (pXGIHWDE->jChipType == XG21) {
3728 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003729 /* LVDS backlight off */
3730 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003731 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303732 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003733 /* DVO/DVI signal off */
3734 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303735 }
3736 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303738 if (pXGIHWDE->jChipType == XG27) {
3739 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003740 /* LVDS backlight off */
3741 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003742 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303745 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003746 /* DVO/DVI signal off */
3747 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003749
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003750 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003751}
3752
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003753static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003754{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003755 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303756 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003757
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003758 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303759 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003760}
3761
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003762static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003763{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003764 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003765}
3766
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003767static void XGI_SaveCRT2Info(unsigned short ModeNo,
3768 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003769{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303770 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003771
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003772 /* reserve CR34 for CRT1 Mode No */
3773 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303774 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3775 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003776 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003777}
3778
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003779static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3780 unsigned short ModeIdIndex,
3781 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003782{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303783 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003784
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303785 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
3786 if (ModeNo <= 0x13) {
3787 xres = pVBInfo->StResInfo[resindex].HTotal;
3788 yres = pVBInfo->StResInfo[resindex].VTotal;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303789 } else {
3790 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3791 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003792 /* si+St_ModeFlag */
3793 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303795 if (modeflag & HalfDCLK)
3796 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303798 if (modeflag & DoubleScanMode)
3799 yres *= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303800 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303802 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
3803 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003804 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003805 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303806 if (yres == 1024)
3807 yres = 1056;
3808 }
3809 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003810
Peter Huewe255aabd2012-02-09 21:11:44 +01003811 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303812 if (yres == 400)
3813 yres = 405;
3814 else if (yres == 350)
3815 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003816
Peter Huewea3d675c2012-02-09 21:11:47 +01003817 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303818 if (yres == 360)
3819 yres = 375;
3820 }
3821 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003822
Peter Huewe255aabd2012-02-09 21:11:44 +01003823 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003824 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303825 if (!(pVBInfo->LCDInfo
3826 & LCDNonExpanding)) {
3827 if (yres == 350)
3828 yres = 357;
3829 else if (yres == 400)
3830 yres = 420;
3831 else if (yres == 480)
3832 yres = 525;
3833 }
3834 }
3835 }
3836 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303838 if (xres == 720)
3839 xres = 640;
3840 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303842 pVBInfo->VGAHDE = xres;
3843 pVBInfo->HDE = xres;
3844 pVBInfo->VGAVDE = yres;
3845 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003846}
3847
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003848static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003849{
3850
Peter Huewea3d675c2012-02-09 21:11:47 +01003851 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003852 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303853 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303855 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003856}
3857
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003858static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3859 unsigned short ModeIdIndex,
3860 unsigned short RefreshRateTableIndex,
3861 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003862{
3863 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
3864 StandTableIndex, CRT1Index;
3865
3866 pVBInfo->RVBHCMAX = 1;
3867 pVBInfo->RVBHCFACT = 1;
3868
3869 if (ModeNo <= 0x13) {
3870 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3871 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
3872 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
3873 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
3874 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
3875 } else {
3876 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003877 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
3878 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003879 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003880 temp1 = (unsigned short) pVBInfo->
3881 XGINEWUB_CRT1Table[CRT1Index].CR[0];
3882 temp2 = (unsigned short) pVBInfo->
3883 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003884 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003885 tempbx = (unsigned short) pVBInfo->
3886 XGINEWUB_CRT1Table[CRT1Index].CR[8];
3887 tempcx = (unsigned short) pVBInfo->
3888 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003889 tempcx &= 0x0100;
3890 tempcx = tempcx << 2;
3891 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003892 temp1 = (unsigned short) pVBInfo->
3893 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003894 }
3895
3896 if (temp1 & 0x01)
3897 tempbx |= 0x0100;
3898
3899 if (temp1 & 0x20)
3900 tempbx |= 0x0200;
3901 tempax += 5;
3902
3903 if (modeflag & Charx8Dot)
3904 tempax *= 8;
3905 else
3906 tempax *= 9;
3907
3908 pVBInfo->VGAHT = tempax;
3909 pVBInfo->HT = tempax;
3910 tempbx++;
3911 pVBInfo->VGAVT = tempbx;
3912 pVBInfo->VT = tempbx;
3913}
3914
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003915static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303916 unsigned short RefreshRateTableIndex,
3917 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003918{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303919 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003920
Peter Huewefc39dcb2012-01-15 19:22:12 +01003921 struct SiS_LCDData *LCDPtr = NULL;
3922 struct SiS_TVData *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303924 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003925 /* si+St_ResInfo */
3926 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303927 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
3928 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003929 /* si+Ext_ResInfo */
3930 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303931 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3932 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003933
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303934 pVBInfo->NewFlickerMode = 0;
3935 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303937 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3938 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3939 pVBInfo);
3940 return;
3941 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003942
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303943 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003944
Peter Huewea3d675c2012-02-09 21:11:47 +01003945 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003946 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303947 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3948 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303950 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3951 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3952 pVBInfo->VGAHT = LCDPtr->VGAHT;
3953 pVBInfo->VGAVT = LCDPtr->VGAVT;
3954 pVBInfo->HT = LCDPtr->LCDHT;
3955 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003956
Peter Huewe255aabd2012-02-09 21:11:44 +01003957 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303958 tempax = 1024;
3959 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003960
Peter Huewea3d675c2012-02-09 21:11:47 +01003961 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 if (pVBInfo->VGAVDE == 357)
3963 tempbx = 527;
3964 else if (pVBInfo->VGAVDE == 420)
3965 tempbx = 620;
3966 else if (pVBInfo->VGAVDE == 525)
3967 tempbx = 775;
3968 else if (pVBInfo->VGAVDE == 600)
3969 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303970 else
3971 tempbx = 768;
3972 } else
3973 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003974 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303975 tempax = 1024;
3976 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003977 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303978 tempax = 1280;
3979 if (pVBInfo->VGAVDE == 360)
3980 tempbx = 768;
3981 else if (pVBInfo->VGAVDE == 375)
3982 tempbx = 800;
3983 else if (pVBInfo->VGAVDE == 405)
3984 tempbx = 864;
3985 else
3986 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003987 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303988 tempax = 1280;
3989 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003990 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303991 tempax = 1280;
3992 if (pVBInfo->VGAVDE == 350)
3993 tempbx = 700;
3994 else if (pVBInfo->VGAVDE == 400)
3995 tempbx = 800;
3996 else if (pVBInfo->VGAVDE == 1024)
3997 tempbx = 960;
3998 else
3999 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01004000 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304001 tempax = 1400;
4002 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 if (pVBInfo->VGAVDE == 1024) {
4005 tempax = 1280;
4006 tempbx = 1024;
4007 }
Peter Huewe255aabd2012-02-09 21:11:44 +01004008 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 tempax = 1600;
4010 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01004011 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304012 if (pVBInfo->VGAVDE == 350)
4013 tempbx = 875;
4014 else if (pVBInfo->VGAVDE == 400)
4015 tempbx = 1000;
4016 }
4017 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004018
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304019 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4020 tempax = pVBInfo->VGAHDE;
4021 tempbx = pVBInfo->VGAVDE;
4022 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004023
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304024 pVBInfo->HDE = tempax;
4025 pVBInfo->VDE = tempbx;
4026 return;
4027 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304029 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4030 tempbx = 4;
Peter Huewefc39dcb2012-01-15 19:22:12 +01004031 TVPtr = (struct SiS_TVData *) XGI_GetTVPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304032 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4033 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004034
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304035 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4036 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4037 pVBInfo->VGAHT = TVPtr->VGAHT;
4038 pVBInfo->VGAVT = TVPtr->VGAVT;
4039 pVBInfo->HDE = TVPtr->TVHDE;
4040 pVBInfo->VDE = TVPtr->TVVDE;
4041 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4042 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004043
Peter Huewe599801f2012-02-09 21:11:45 +01004044 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304045 if (resinfo == 0x08)
4046 pVBInfo->NewFlickerMode = 0x40;
4047 else if (resinfo == 0x09)
4048 pVBInfo->NewFlickerMode = 0x40;
4049 else if (resinfo == 0x12)
4050 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004051
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304052 if (pVBInfo->VGAVDE == 350)
4053 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004054
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304055 tempax = ExtHiTVHT;
4056 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004057
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304058 if (pVBInfo->VBInfo & SetInSlaveMode) {
4059 if (pVBInfo->TVInfo & TVSimuMode) {
4060 tempax = StHiTVHT;
4061 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304063 if (!(modeflag & Charx8Dot)) {
4064 tempax = StHiTextTVHT;
4065 tempbx = StHiTextTVVT;
4066 }
4067 }
4068 }
Peter Huewe599801f2012-02-09 21:11:45 +01004069 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4070 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304071 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4072 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4073 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004074
Peter Huewe599801f2012-02-09 21:11:45 +01004075 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304076 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4077 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01004078 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304079 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4080 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4081 if (pVBInfo->TVInfo & NTSC1024x768)
4082 tempax = NTSC1024x768HT;
4083 }
4084 } else {
4085 tempax = PALHT;
4086 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01004087 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304088 tempax = NTSCHT;
4089 tempbx = NTSCVT;
4090 if (pVBInfo->TVInfo & NTSC1024x768)
4091 tempax = NTSC1024x768HT;
4092 }
4093 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304095 pVBInfo->HT = tempax;
4096 pVBInfo->VT = tempbx;
4097 return;
4098 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004099}
4100
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004101static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304102 unsigned short RefreshRateTableIndex,
4103 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004104{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004105 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304107 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4108 pVBInfo);
4109 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4110 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004111
Peter Huewe6896b942012-02-09 21:11:46 +01004112 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304113 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004114 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4115 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4116 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304117 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004118 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4119 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304120 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004121
Aaro Koskinen8104e322011-03-13 12:26:22 +02004122 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004123
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304124 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004125 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304126 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004127 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004128}
4129
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004130static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4131 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004132{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004133 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4134 short index;
4135 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304136
4137 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004138 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304139 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004140 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304141
Peter Huewe6896b942012-02-09 21:11:46 +01004142 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304143
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004144 if (index < 0)
4145 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304146
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004147 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304148}
4149
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004150static unsigned short XGI_GetOffset(unsigned short ModeNo,
4151 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304152 unsigned short RefreshRateTableIndex,
4153 struct xgi_hw_device_info *HwDeviceExtension,
4154 struct vb_device_info *pVBInfo)
4155{
4156 unsigned short temp, colordepth, modeinfo, index, infoflag,
4157 ColorDepth[] = { 0x01, 0x02, 0x04 };
4158
4159 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4160 if (ModeNo <= 0x14)
4161 infoflag = 0;
4162 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004163 infoflag = pVBInfo->
4164 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304165
4166 index = (modeinfo >> 8) & 0xFF;
4167
4168 temp = pVBInfo->ScreenOffset[index];
4169
4170 if (infoflag & InterlaceMode)
4171 temp = temp << 1;
4172
4173 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4174
4175 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4176 temp = ModeNo - 0x7C;
4177 colordepth = ColorDepth[temp];
4178 temp = 0x6B;
4179 if (infoflag & InterlaceMode)
4180 temp = temp << 1;
4181 return temp * colordepth;
4182 } else {
4183 return temp * colordepth;
4184 }
4185}
4186
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004187static void XGI_SetCRT2Offset(unsigned short ModeNo,
4188 unsigned short ModeIdIndex,
4189 unsigned short RefreshRateTableIndex,
4190 struct xgi_hw_device_info *HwDeviceExtension,
4191 struct vb_device_info *pVBInfo)
4192{
4193 unsigned short offset;
4194 unsigned char temp;
4195
4196 if (pVBInfo->VBInfo & SetInSlaveMode)
4197 return;
4198
4199 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4200 HwDeviceExtension, pVBInfo);
4201 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004202 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004203 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004204 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004205 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004206 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004207}
4208
Randy Dunlap89229672010-08-10 08:46:44 -07004209static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004210{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004211 /* threshold high ,disable auto threshold */
4212 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4213 /* threshold low default 04h */
4214 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004215}
4216
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004217static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304218 struct xgi_hw_device_info *HwDeviceExtension,
4219 unsigned short RefreshRateTableIndex,
4220 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004221{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304222 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304224 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004225 CRT1Index = pVBInfo->
4226 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304227 CRT1Index &= IndexMask;
4228 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4229 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304231 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4232 HwDeviceExtension, pVBInfo);
4233 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304235 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004236 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004237
Aaro Koskinen8104e322011-03-13 12:26:22 +02004238 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4239 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004240}
4241
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004242static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304243 struct xgi_hw_device_info *HwDeviceExtension,
4244 unsigned short RefreshRateTableIndex,
4245 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004246{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304247 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4248 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004249
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304250 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004251 CRT1Index = pVBInfo->
4252 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304253 CRT1Index &= IndexMask;
4254 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004255 }
4256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304257 if (ModeNo <= 0x13)
4258 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4259 else
4260 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304262 /* bainy change table name */
4263 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004264 /* BTVGA2HT 0x08,0x09 */
4265 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004266 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304267 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004268 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004269 /* BTVGA2HDEE 0x0A,0x0C */
4270 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004271 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304272 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4273 pushbx = pVBInfo->VGAHDE / 2 + 16;
4274 tempcx = tempcx >> 1;
4275 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4276 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304278 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4279 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004280 tempbx |= ((pVBInfo->
4281 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4282 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304283 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4284 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4285 tempcx &= 0x1F;
4286 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4287 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4288 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304291 tempbx += 4;
4292 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304294 if (tempcx > (pVBInfo->VGAHT / 2))
4295 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304297 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004298
Aaro Koskinen8104e322011-03-13 12:26:22 +02004299 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304300 } else {
4301 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004302 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304303 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004304 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004305 /* BTVGA2HDEE 0x0A,0x0C */
4306 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004307 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4309 pushbx = pVBInfo->VGAHDE + 16;
4310 tempcx = tempcx >> 1;
4311 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4312 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304314 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4315 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004316 tempbx |= ((pVBInfo->
4317 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4318 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304319 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4320 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4321 tempcx &= 0x1F;
4322 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4323 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4324 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4325 tempbx += 16;
4326 tempcx += 16;
4327 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 if (tempcx > pVBInfo->VGAHT)
4330 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004331
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304332 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004333 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304336 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4337 tempbx = pushbx;
4338 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4339 tempax |= (tempbx & 0xFF00);
4340 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004341 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304342 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004343 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304344 tempcx = (pVBInfo->VGAVT - 1);
4345 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004346
Aaro Koskinen8104e322011-03-13 12:26:22 +02004347 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304348 tempbx = pVBInfo->VGAVDE - 1;
4349 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004350 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304351 temp = ((tempbx & 0xFF00) << 3) >> 8;
4352 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004353 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 tempax = pVBInfo->VGAVDE;
4356 tempbx = pVBInfo->VGAVDE;
4357 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004358 /* BTVGA2VRS 0x10,0x11 */
4359 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4360 /* BTVGA2VRE 0x11 */
4361 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304363 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4364 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4365 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004366
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304367 if (temp & 0x04)
4368 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004369
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 if (temp & 0x080)
4371 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304373 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304375 if (temp & 0x08)
4376 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004377
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304378 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4379 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4380 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004381
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304382 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004383 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304384 temp = ((tempbx & 0xFF00) >> 8) << 4;
4385 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004386 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304387 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304389 if (modeflag & DoubleScanMode)
4390 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 if (modeflag & HalfDCLK)
4393 tempax |= 0x40;
4394
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004395 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004396}
4397
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004398static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4399{
4400 unsigned long tempax, tempbx;
4401
4402 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4403 & 0xFFFF;
4404 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4405 tempax = (tempax * pVBInfo->HT) / tempbx;
4406
4407 return (unsigned short) tempax;
4408}
4409
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004410static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304411 struct xgi_hw_device_info *HwDeviceExtension,
4412 unsigned short RefreshRateTableIndex,
4413 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004414{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304415 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4416 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304418 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004419 /* si+St_ResInfo */
4420 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304421 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4422 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004423 /* si+Ext_ResInfo */
4424 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304425 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004426 CRT1Index = pVBInfo->
4427 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304428 CRT1Index &= IndexMask;
4429 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004430
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304431 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4432 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304434 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004435 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304436 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004437
Peter Huewe6896b942012-02-09 21:11:46 +01004438 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304439 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304441 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304443 if (modeflag & HalfDCLK)
4444 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004445
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304446 tempax = (tempax / tempcx) - 1;
4447 tempbx |= ((tempax & 0x00FF) << 8);
4448 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004449 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304451 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304453 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01004454 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4455 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304456 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004457
Peter Huewe599801f2012-02-09 21:11:45 +01004458 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004459 if (pVBInfo->VBType & VB_SIS301LV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304460 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4461 if (resinfo == 7)
4462 temp -= 2;
4463 }
4464 } else if (resinfo == 7) {
4465 temp -= 2;
4466 }
4467 }
4468 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004469
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004470 /* 0x05 Horizontal Display Start */
4471 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
4472 /* 0x06 Horizontal Blank end */
4473 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004474
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304475 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4476 if (pVBInfo->VBInfo & SetCRT2ToTV)
4477 tempax = pVBInfo->VGAHT;
4478 else
4479 tempax = XGI_GetVGAHT2(pVBInfo);
4480 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304482 if (tempax >= pVBInfo->VGAHT)
4483 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004484
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304485 if (modeflag & HalfDCLK)
4486 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004487
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304488 tempax = (tempax / tempcx) - 5;
4489 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01004490 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304491 temp = (tempbx & 0x00FF) - 1;
4492 if (!(modeflag & HalfDCLK)) {
4493 temp -= 6;
4494 if (pVBInfo->TVInfo & TVSimuMode) {
4495 temp -= 4;
4496 if (ModeNo > 0x13)
4497 temp -= 10;
4498 }
4499 }
4500 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304501 tempbx = (tempbx & 0xFF00) >> 8;
4502 tempcx = (tempcx + tempbx) >> 1;
4503 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304505 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4506 temp -= 1;
4507 if (!(modeflag & HalfDCLK)) {
4508 if ((modeflag & Charx8Dot)) {
4509 temp += 4;
4510 if (pVBInfo->VGAHDE >= 800)
4511 temp -= 6;
4512 }
4513 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004514 } else if (!(modeflag & HalfDCLK)) {
4515 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01004516 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004517 pVBInfo->VGAHDE >= 800) {
4518 temp -= 7;
4519 if (pVBInfo->ModeType == ModeEGA &&
4520 pVBInfo->VGAVDE == 1024) {
4521 temp += 15;
4522 if (pVBInfo->LCDResInfo !=
Peter Huewe255aabd2012-02-09 21:11:44 +01004523 Panel_1280x1024)
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004524 temp += 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304525 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004526
4527 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01004528 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004529 (pVBInfo->LCDInfo & LCDNonExpanding))
4530 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304531 }
4532 }
4533 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004534
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004535 /* 0x07 Horizontal Retrace Start */
4536 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4537 /* 0x08 Horizontal Retrace End */
4538 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304540 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4541 if (pVBInfo->TVInfo & TVSimuMode) {
4542 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4543 == 0x11) || (ModeNo == 0x13) || (ModeNo
4544 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004545 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
4546 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304547 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
4550 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004551 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304552 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004553 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304554 0x08, 0x61);
4555 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004556 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304557 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004558 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304559 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004560 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304561 0x0C, 0xF0);
4562 }
4563 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304565 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
4566 == 0x07)) {
4567 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004568 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304569 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004570 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304571 0x08, 0x00);
4572 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004573 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304574 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004575 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304576 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004577 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304578 0x0C, 0xF0);
4579 }
4580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004581
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304582 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
4583 == 0x0D) || (ModeNo == 0x50)) {
4584 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004585 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304586 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004587 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304588 0x08, 0x03);
4589 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004590 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304591 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004592 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304593 0x08, 0x02);
4594 }
4595 }
4596 }
4597 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004598
Aaro Koskinen8104e322011-03-13 12:26:22 +02004599 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004600 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004601 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304603 tempbx = pVBInfo->VGAVT;
4604 push1 = tempbx;
4605 tempcx = 0x121;
4606 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304608 if (tempbx == 357)
4609 tempbx = 350;
4610 if (tempbx == 360)
4611 tempbx = 350;
4612 if (tempbx == 375)
4613 tempbx = 350;
4614 if (tempbx == 405)
4615 tempbx = 400;
4616 if (tempbx == 525)
4617 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004618
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304619 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004620
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304621 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01004622 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004623 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624 if (tempbx == 350)
4625 tempbx += 5;
4626 if (tempbx == 480)
4627 tempbx += 5;
4628 }
4629 }
4630 }
4631 tempbx--;
4632 temp = tempbx & 0x00FF;
4633 tempbx--;
4634 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004635 /* 0x10 vertical Blank Start */
4636 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304637 tempbx = push2;
4638 tempbx--;
4639 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004640 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304642 if (tempbx & 0x0100)
4643 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304645 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004646
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304647 if (modeflag & DoubleScanMode)
4648 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004649
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304650 if (tempbx & 0x0200)
4651 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304653 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004654 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004655
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304656 if (tempbx & 0x0400)
4657 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004658
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004659 /* 0x11 Vertival Blank End */
4660 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661
4662 tempax = push1;
4663 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4664 tempax = tempax >> 2;
4665 push1 = tempax; /* push ax */
4666
4667 if (resinfo != 0x09) {
4668 tempax = tempax << 1;
4669 tempbx += tempax;
4670 }
4671
Peter Huewe599801f2012-02-09 21:11:45 +01004672 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004673 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004674 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304675 tempbx -= 10;
4676 } else {
4677 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004678 if (pVBInfo->TVInfo & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004679 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004680 VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004681 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004682 (TVSetYPbPr525p |
4683 TVSetYPbPr750p |
4684 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304685 tempbx += 40;
4686 } else {
4687 tempbx += 40;
4688 }
4689 }
4690 }
4691 }
4692 } else {
4693 tempbx -= 10;
4694 }
4695 } else {
4696 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004697 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01004698 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004699 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004700 (TVSetYPbPr525p |
4701 TVSetYPbPr750p |
4702 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304703 tempbx += 40;
4704 } else {
4705 tempbx += 40;
4706 }
4707 }
4708 }
4709 }
4710 tempax = push1;
4711 tempax = tempax >> 2;
4712 tempax++;
4713 tempax += tempbx;
4714 push1 = tempax; /* push ax */
4715
Peter Huewe599801f2012-02-09 21:11:45 +01004716 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304717 if (tempbx <= 513) {
4718 if (tempax >= 513)
4719 tempbx = 513;
4720 }
4721 }
4722
4723 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004724 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304725 tempbx--;
4726 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004727 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304728
4729 if (tempbx & 0x0100)
4730 tempcx |= 0x0008;
4731
4732 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004733 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304734
4735 tempbx++;
4736
4737 if (tempbx & 0x0100)
4738 tempcx |= 0x0004;
4739
4740 if (tempbx & 0x0200)
4741 tempcx |= 0x0080;
4742
4743 if (tempbx & 0x0400)
4744 tempcx |= 0x0C00;
4745
4746 tempbx = push1; /* pop ax */
4747 temp = tempbx & 0x00FF;
4748 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004749 /* 0x0D vertical Retrace End */
4750 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304751
4752 if (tempbx & 0x0010)
4753 tempcx |= 0x2000;
4754
4755 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004756 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304757 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004758 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304759 tempax = modeflag;
4760 temp = (tempax & 0xFF00) >> 8;
4761
4762 temp = (temp >> 1) & 0x09;
4763
Peter Huewe6896b942012-02-09 21:11:46 +01004764 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304765 temp |= 0x01;
4766
Aaro Koskinen8104e322011-03-13 12:26:22 +02004767 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4768 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4769 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304770
4771 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4772 temp = 0x80;
4773 else
4774 temp = 0x00;
4775
Aaro Koskinen8104e322011-03-13 12:26:22 +02004776 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777
4778 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004779}
4780
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004781static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 unsigned short RefreshRateTableIndex,
4783 struct xgi_hw_device_info *HwDeviceExtension,
4784 struct vb_device_info *pVBInfo)
4785{
4786 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4787 modeflag, resinfo, crt2crtc;
4788 unsigned char *TimingPoint;
4789
4790 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4791
4792 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004793 /* si+St_ResInfo */
4794 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304795 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4796 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
4797 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004798 /* si+Ext_ResInfo */
4799 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304800 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004801 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
4802 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304803 }
4804
4805 tempax = 0;
4806
4807 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4808 tempax |= 0x0800;
4809
4810 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4811 tempax |= 0x0400;
4812
4813 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4814 tempax |= 0x0200;
4815
Peter Huewe599801f2012-02-09 21:11:45 +01004816 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304817 tempax |= 0x1000;
4818
Peter Huewe599801f2012-02-09 21:11:45 +01004819 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 tempax |= 0x0100;
4821
Peter Huewe599801f2012-02-09 21:11:45 +01004822 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304823 tempax &= 0xfe00;
4824
4825 tempax = (tempax & 0xff00) >> 8;
4826
Aaro Koskinen8104e322011-03-13 12:26:22 +02004827 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304828 TimingPoint = pVBInfo->NTSCTiming;
4829
Peter Huewe599801f2012-02-09 21:11:45 +01004830 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304831 TimingPoint = pVBInfo->PALTiming;
4832
Peter Huewe599801f2012-02-09 21:11:45 +01004833 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304834 TimingPoint = pVBInfo->HiTVExtTiming;
4835
4836 if (pVBInfo->VBInfo & SetInSlaveMode)
4837 TimingPoint = pVBInfo->HiTVSt2Timing;
4838
4839 if (pVBInfo->SetFlag & TVSimuMode)
4840 TimingPoint = pVBInfo->HiTVSt1Timing;
4841
4842 if (!(modeflag & Charx8Dot))
4843 TimingPoint = pVBInfo->HiTVTextTiming;
4844 }
4845
Peter Huewe599801f2012-02-09 21:11:45 +01004846 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4847 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304848 TimingPoint = pVBInfo->YPbPr525iTiming;
4849
Peter Huewe599801f2012-02-09 21:11:45 +01004850 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 TimingPoint = pVBInfo->YPbPr525pTiming;
4852
Peter Huewe599801f2012-02-09 21:11:45 +01004853 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304854 TimingPoint = pVBInfo->YPbPr750pTiming;
4855 }
4856
4857 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004858 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304859
4860 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004861 /* di->temp2[j] */
4862 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304863
4864 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004865 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304866
4867 temp = pVBInfo->NewFlickerMode;
4868 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004869 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304870
Peter Huewe599801f2012-02-09 21:11:45 +01004871 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304872 tempax = 950;
4873
Peter Huewe599801f2012-02-09 21:11:45 +01004874 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304875 tempax = 520;
4876 else
4877 tempax = 440;
4878
4879 if (pVBInfo->VDE <= tempax) {
4880 tempax -= pVBInfo->VDE;
4881 tempax = tempax >> 2;
4882 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4883 push1 = tempax;
4884 temp = (tempax & 0xFF00) >> 8;
4885 temp += (unsigned short) TimingPoint[0];
4886
Peter Huewe6896b942012-02-09 21:11:46 +01004887 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4888 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304889 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4890 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004891 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304892 tempcx = pVBInfo->VGAHDE;
4893 if (tempcx >= 1024) {
4894 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004895 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304896 temp = 0x19; /* PAL */
4897 }
4898 }
4899 }
4900
Aaro Koskinen8104e322011-03-13 12:26:22 +02004901 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 tempax = push1;
4903 temp = (tempax & 0xFF00) >> 8;
4904 temp += TimingPoint[1];
4905
Peter Huewe6896b942012-02-09 21:11:46 +01004906 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4907 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4909 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004910 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304911 tempcx = pVBInfo->VGAHDE;
4912 if (tempcx >= 1024) {
4913 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004914 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304915 temp = 0x52; /* PAL */
4916 }
4917 }
4918 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004919 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304920 }
4921
4922 /* 301b */
4923 tempcx = pVBInfo->HT;
4924
4925 if (XGI_IsLCDDualLink(pVBInfo))
4926 tempcx = tempcx >> 1;
4927
4928 tempcx -= 2;
4929 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004930 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304931
4932 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004933 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304934
4935 tempcx = pVBInfo->HT >> 1;
4936 push1 = tempcx; /* push cx */
4937 tempcx += 7;
4938
Peter Huewe599801f2012-02-09 21:11:45 +01004939 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304940 tempcx -= 4;
4941
4942 temp = tempcx & 0x00FF;
4943 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004944 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304945
4946 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4947 tempbx += tempcx;
4948 push2 = tempbx;
4949 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004950 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304951 temp = (tempbx & 0xFF00) >> 8;
4952 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004953 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304954
4955 tempbx = push2;
4956 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004957 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 tempbx = tempbx - 4;
4959 tempcx = tempbx;
4960 }
4961
4962 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004963 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304964
4965 j += 2;
4966 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4967 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004968 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304969 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004970 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304971
4972 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004973 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304974 tempcx -= 4;
4975
4976 temp = tempcx & 0xFF;
4977 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004978 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304979
4980 tempcx = push1; /* pop cx */
4981 j += 2;
4982 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4983 tempcx -= temp;
4984 temp = tempcx & 0x00FF;
4985 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004986 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304987
4988 tempcx -= 11;
4989
4990 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4991 tempax = XGI_GetVGAHT2(pVBInfo);
4992 tempcx = tempax - 1;
4993 }
4994 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004995 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304996
4997 tempbx = pVBInfo->VDE;
4998
4999 if (pVBInfo->VGAVDE == 360)
5000 tempbx = 746;
5001 if (pVBInfo->VGAVDE == 375)
5002 tempbx = 746;
5003 if (pVBInfo->VGAVDE == 405)
5004 tempbx = 853;
5005
5006 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005007 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005008 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005009 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01005010 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305011 tempbx = tempbx >> 1;
5012 } else
5013 tempbx = tempbx >> 1;
5014 }
5015
5016 tempbx -= 2;
5017 temp = tempbx & 0x00FF;
5018
Peter Huewe599801f2012-02-09 21:11:45 +01005019 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01005020 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005021 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305022 if (pVBInfo->VBInfo & SetInSlaveMode) {
5023 if (ModeNo == 0x2f)
5024 temp += 1;
5025 }
5026 }
5027 } else {
5028 if (pVBInfo->VBInfo & SetInSlaveMode) {
5029 if (ModeNo == 0x2f)
5030 temp += 1;
5031 }
5032 }
5033 }
5034
Aaro Koskinen8104e322011-03-13 12:26:22 +02005035 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305036
5037 temp = (tempcx & 0xFF00) >> 8;
5038 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5039
Peter Huewe599801f2012-02-09 21:11:45 +01005040 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01005041 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005042 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043 temp |= 0x10;
5044
5045 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5046 temp |= 0x20;
5047 }
5048 } else {
5049 temp |= 0x10;
5050 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5051 temp |= 0x20;
5052 }
5053 }
5054
Aaro Koskinen8104e322011-03-13 12:26:22 +02005055 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305056
Peter Huewe6896b942012-02-09 21:11:46 +01005057 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5058 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305059 tempbx = pVBInfo->VDE;
5060 tempcx = tempbx - 2;
5061
5062 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005063 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
5064 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305065 tempbx = tempbx >> 1;
5066 }
5067
Peter Huewe6896b942012-02-09 21:11:46 +01005068 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305069 temp = 0;
5070 if (tempcx & 0x0400)
5071 temp |= 0x20;
5072
5073 if (tempbx & 0x0400)
5074 temp |= 0x40;
5075
Aaro Koskinen8104e322011-03-13 12:26:22 +02005076 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305077 }
5078
5079 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005080 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305081 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005082 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305083 }
5084
5085 tempbx = tempbx & 0x00FF;
5086
5087 if (!(modeflag & HalfDCLK)) {
5088 tempcx = pVBInfo->VGAHDE;
5089 if (tempcx >= pVBInfo->HDE) {
5090 tempbx |= 0x2000;
5091 tempax &= 0x00FF;
5092 }
5093 }
5094
5095 tempcx = 0x0101;
5096
5097 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5098 if (pVBInfo->VGAHDE >= 1024) {
5099 tempcx = 0x1920;
5100 if (pVBInfo->VGAHDE >= 1280) {
5101 tempcx = 0x1420;
5102 tempbx = tempbx & 0xDFFF;
5103 }
5104 }
5105 }
5106
5107 if (!(tempbx & 0x2000)) {
5108 if (modeflag & HalfDCLK)
5109 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5110
5111 push1 = tempbx;
5112 tempeax = pVBInfo->VGAHDE;
5113 tempebx = (tempcx & 0xFF00) >> 8;
5114 longtemp = tempeax * tempebx;
5115 tempecx = tempcx & 0x00FF;
5116 longtemp = longtemp / tempecx;
5117
5118 /* 301b */
5119 tempecx = 8 * 1024;
5120
Peter Huewe6896b942012-02-09 21:11:46 +01005121 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5122 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305123 tempecx = tempecx * 8;
5124 }
5125
5126 longtemp = longtemp * tempecx;
5127 tempecx = pVBInfo->HDE;
5128 temp2 = longtemp % tempecx;
5129 tempeax = longtemp / tempecx;
5130 if (temp2 != 0)
5131 tempeax += 1;
5132
5133 tempax = (unsigned short) tempeax;
5134
5135 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005136 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5137 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305138 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5139 }
5140 /* end 301b */
5141
5142 tempbx = push1;
5143 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5144 | (tempbx & 0x00FF));
5145 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5146 | (tempax & 0x00FF));
5147 temp = (tempax & 0xFF00) >> 8;
5148 } else {
5149 temp = (tempax & 0x00FF) >> 8;
5150 }
5151
Aaro Koskinen8104e322011-03-13 12:26:22 +02005152 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305153 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005154 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305155 temp = tempcx & 0x00FF;
5156
5157 if (tempbx & 0x2000)
5158 temp = 0;
5159
5160 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5161 temp |= 0x18;
5162
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005163 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01005164 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305165 tempbx = 0x0382;
5166 tempcx = 0x007e;
5167 } else {
5168 tempbx = 0x0369;
5169 tempcx = 0x0061;
5170 }
5171
5172 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005173 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305174 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005175 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305176
5177 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5178 temp = temp << 2;
5179 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5180
Peter Huewe599801f2012-02-09 21:11:45 +01005181 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305182 temp |= 0x10;
5183
Peter Huewe599801f2012-02-09 21:11:45 +01005184 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305185 temp |= 0x20;
5186
Peter Huewe599801f2012-02-09 21:11:45 +01005187 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305188 temp |= 0x60;
5189 }
5190
Aaro Koskinen8104e322011-03-13 12:26:22 +02005191 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005192 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005193 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305194
Peter Huewe599801f2012-02-09 21:11:45 +01005195 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305196 if (pVBInfo->TVInfo & NTSC1024x768) {
5197 TimingPoint = XGI_NTSC1024AdjTime;
5198 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005199 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305200 TimingPoint[j]);
5201 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005202 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305203 }
5204 }
5205
5206 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5207 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01005208 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005209 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305210 0x08); /* PALM Mode */
5211 }
5212
Peter Huewe599801f2012-02-09 21:11:45 +01005213 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005214 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305215 0x01);
5216 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005217 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305218
Aaro Koskinendc505562011-03-13 12:26:26 +02005219 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305220 }
5221
Peter Huewe599801f2012-02-09 21:11:45 +01005222 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305223 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005224 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305225 }
5226
5227 if (pVBInfo->VBInfo & SetCRT2ToTV)
5228 return;
5229}
5230
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005231static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305232 struct xgi_hw_device_info *HwDeviceExtension,
5233 unsigned short RefreshRateTableIndex,
5234 struct vb_device_info *pVBInfo)
5235{
5236 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5237 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5238
5239 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5240
5241 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005242 /* si+St_ResInfo */
5243 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305244 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5245 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005246 /* si+Ext_ResInfo */
5247 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305248 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005249 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5250 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 CRT1Index &= IndexMask;
5252 }
5253
5254 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5255 return;
5256
5257 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5258
5259 if (XGI_IsLCDDualLink(pVBInfo))
5260 tempbx = tempbx >> 1;
5261
5262 tempbx -= 1;
5263 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005264 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305265 temp = (tempbx & 0xFF00) >> 8;
5266 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005267 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305268 temp = 0x01;
5269
Peter Huewe255aabd2012-02-09 21:11:44 +01005270 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305271 if (pVBInfo->ModeType == ModeEGA) {
5272 if (pVBInfo->VGAHDE >= 1024) {
5273 temp = 0x02;
Peter Huewea3d675c2012-02-09 21:11:47 +01005274 if (pVBInfo->LCDInfo & XGI_LCDVESATiming)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305275 temp = 0x01;
5276 }
5277 }
5278 }
5279
Aaro Koskinen8104e322011-03-13 12:26:22 +02005280 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305281 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5282 push1 = tempbx;
5283 tempbx--;
5284 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005285 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305286 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005287 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305288
5289 tempcx = pVBInfo->VT - 1;
5290 push2 = tempcx + 1;
5291 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005292 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305293 temp = (tempcx & 0xFF00) >> 8;
5294 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005295 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005296 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5297 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5298 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5299 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305300
5301 /* Customized LCDB Des no add */
5302 tempbx = 5;
5303 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5304 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5305 tempah = pVBInfo->LCDResInfo;
5306 tempah &= PanelResInfo;
5307
Peter Huewe255aabd2012-02-09 21:11:44 +01005308 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305309 tempbx = 1024;
5310 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01005311 } else if ((tempah == Panel_1280x1024) ||
5312 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305313 tempbx = 1280;
5314 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01005315 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305316 tempbx = 1400;
5317 tempcx = 1050;
5318 } else {
5319 tempbx = 1600;
5320 tempcx = 1200;
5321 }
5322
5323 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5324 tempbx = pVBInfo->HDE;
5325 tempcx = pVBInfo->VDE;
5326 }
5327
5328 pushbx = tempbx;
5329 tempax = pVBInfo->VT;
5330 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5331 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5332 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5333 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5334 tempbx = pVBInfo->LCDVDES;
5335 tempcx += tempbx;
5336
5337 if (tempcx >= tempax)
5338 tempcx -= tempax; /* lcdvdes */
5339
5340 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005341 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305342 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005343 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305344 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5345 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5346 tempah = tempch;
5347 tempah = tempah << 3;
5348 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005349 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305350
5351 /* getlcdsync() */
5352 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5353 tempcx = tempbx;
5354 tempax = pVBInfo->VT;
5355 tempbx = pVBInfo->LCDVRS;
5356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305357 tempcx += tempbx;
5358 if (tempcx >= tempax)
5359 tempcx -= tempax;
5360
5361 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005362 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305363 temp = (tempbx & 0xFF00) >> 8;
5364 temp = temp << 4;
5365 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005366 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305367 tempcx = pushbx;
5368 tempax = pVBInfo->HT;
5369 tempbx = pVBInfo->LCDHDES;
5370 tempbx &= 0x0FFF;
5371
5372 if (XGI_IsLCDDualLink(pVBInfo)) {
5373 tempax = tempax >> 1;
5374 tempbx = tempbx >> 1;
5375 tempcx = tempcx >> 1;
5376 }
5377
Peter Huewe6896b942012-02-09 21:11:46 +01005378 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305379 tempbx += 1;
5380
5381 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5382 tempbx += 1;
5383
5384 tempcx += tempbx;
5385
5386 if (tempcx >= tempax)
5387 tempcx -= tempax;
5388
5389 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005390 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305391 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005392 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305393 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005394 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305395 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005396 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305398 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5399 tempcx = tempax;
5400 tempax = pVBInfo->HT;
5401 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305402 if (XGI_IsLCDDualLink(pVBInfo)) {
5403 tempax = tempax >> 1;
5404 tempbx = tempbx >> 1;
5405 tempcx = tempcx >> 1;
5406 }
5407
Peter Huewe6896b942012-02-09 21:11:46 +01005408 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305409 tempbx += 1;
5410
5411 tempcx += tempbx;
5412
5413 if (tempcx >= tempax)
5414 tempcx -= tempax;
5415
5416 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005417 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305418
5419 temp = (tempbx & 0xFF00) >> 8;
5420 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005421 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305422 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005423 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305424
Peter Huewea3d675c2012-02-09 21:11:47 +01005425 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305426 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01005427 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5428 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 | VB_XGI301C)) {
5430 temp = 0xC6;
5431 } else
5432 temp = 0xC4;
5433
Aaro Koskinen8104e322011-03-13 12:26:22 +02005434 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5435 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305436 }
5437
5438 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01005439 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5440 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305441 | VB_XGI301C)) {
5442 temp = 0x4F;
5443 } else
5444 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005445 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305446 }
5447 }
5448}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005449
5450/* --------------------------------------------------------------------- */
5451/* Function : XGI_GetTap4Ptr */
5452/* Input : */
5453/* Output : di -> Tap4 Reg. Setting Pointer */
5454/* Description : */
5455/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005456static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305457 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005458{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305459 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463 if (tempcx == 0) {
5464 tempax = pVBInfo->VGAHDE;
5465 tempbx = pVBInfo->HDE;
5466 } else {
5467 tempax = pVBInfo->VGAVDE;
5468 tempbx = pVBInfo->VDE;
5469 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005470
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005471 if (tempax <= tempbx)
5472 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305473 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005474 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005475
Peter Huewe599801f2012-02-09 21:11:45 +01005476 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305477 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005478
Peter Huewe599801f2012-02-09 21:11:45 +01005479 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
5480 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
5481 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005482 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01005483 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305484 Tap4TimingPtr = YPbPr750pTap4Timing;
5485 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005486
Peter Huewe599801f2012-02-09 21:11:45 +01005487 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005488 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305490 i = 0;
5491 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5492 if (Tap4TimingPtr[i].DE == tempax)
5493 break;
5494 i++;
5495 }
5496 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005497}
5498
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005499static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005500{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305501 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305503 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305505 if (!(pVBInfo->VBType & VB_XGI301C))
5506 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305508 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5509 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005510 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005511
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005512 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01005513 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005514 /* Set Vertical Scaling */
5515 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305516 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005517 xgifb_reg_set(pVBInfo->Part2Port,
5518 i,
5519 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305520 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005521
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005522 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01005523 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005524 /* Enable V.Scaling */
5525 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305526 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005527 /* Enable H.Scaling */
5528 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005529}
5530
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005531static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305532 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005533{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305534 unsigned short i;
5535 unsigned char *tempdi;
5536 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005537
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305538 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005539 /* si+St_ResInfo */
5540 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305541 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005542 /* si+Ext_ResInfo */
5543 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005544
Aaro Koskinen8104e322011-03-13 12:26:22 +02005545 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01005546 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005547 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5548 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305549 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005550 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5551 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305552 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305554 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5555 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005556
Peter Huewe599801f2012-02-09 21:11:45 +01005557 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005558 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5559 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
5560 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305561 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005562
Peter Huewe599801f2012-02-09 21:11:45 +01005563 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
5564 & SetCRT2ToYPbPr525750)) {
5565 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305566 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305568 tempdi = pVBInfo->HiTVGroup3Data;
5569 if (pVBInfo->SetFlag & TVSimuMode) {
5570 tempdi = pVBInfo->HiTVGroup3Simu;
5571 if (!(modeflag & Charx8Dot))
5572 tempdi = pVBInfo->HiTVGroup3Text;
5573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005574
Peter Huewe599801f2012-02-09 21:11:45 +01005575 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305576 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005577
Peter Huewe599801f2012-02-09 21:11:45 +01005578 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305579 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305581 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005582 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005583
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305584 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01005585 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005586 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305587 }
5588 }
5589 return;
5590} /* {end of XGI_SetGroup3} */
5591
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005592static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305593 unsigned short RefreshRateTableIndex,
5594 struct xgi_hw_device_info *HwDeviceExtension,
5595 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005596{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305597 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005598
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305599 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005602 /* si+St_ResInfo */
5603 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305604 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005605 /* si+Ext_ResInfo */
5606 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305608 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005609 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305611 tempbx = pVBInfo->RVBHCMAX;
5612 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005613 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305614 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
5615 tempcx = pVBInfo->VGAHT - 1;
5616 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005617 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005618
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305619 temp = ((tempcx & 0xFF00) >> 8) << 3;
5620 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305622 tempcx = pVBInfo->VGAVT - 1;
5623 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5624 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305626 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005627 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305628 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005629 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005630 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305631 tempcx = pVBInfo->VBInfo;
5632 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305634 if (modeflag & HalfDCLK)
5635 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305637 if (XGI_IsLCDDualLink(pVBInfo))
5638 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005639
Peter Huewe599801f2012-02-09 21:11:45 +01005640 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305641 temp = 0;
5642 if (tempbx <= 1024)
5643 temp = 0xA0;
5644 if (tempbx == 1280)
5645 temp = 0xC0;
5646 } else if (tempcx & SetCRT2ToTV) {
5647 temp = 0xA0;
5648 if (tempbx <= 800)
5649 temp = 0x80;
5650 } else {
5651 temp = 0x80;
5652 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5653 temp = 0;
5654 if (tempbx > 800)
5655 temp = 0x60;
5656 }
5657 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005658
Peter Huewe599801f2012-02-09 21:11:45 +01005659 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305660 temp = 0x00;
5661 if (pVBInfo->VGAHDE == 1280)
5662 temp = 0x40;
5663 if (pVBInfo->VGAHDE == 1024)
5664 temp = 0x20;
5665 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005666 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305668 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005669
Peter Huewe599801f2012-02-09 21:11:45 +01005670 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305671 if (!(temp & 0xE000))
5672 tempbx = tempbx >> 1;
5673 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005674
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305675 tempcx = pVBInfo->RVBHRS;
5676 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005677 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005678
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305679 tempeax = pVBInfo->VGAVDE;
5680 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305682 if (tempeax <= tempebx) {
5683 tempcx = (tempcx & (~0x4000));
5684 tempeax = pVBInfo->VGAVDE;
5685 } else {
5686 tempeax -= tempebx;
5687 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305689 templong = (tempeax * 256 * 1024) % tempebx;
5690 tempeax = (tempeax * 256 * 1024) / tempebx;
5691 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305693 if (templong != 0)
5694 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005695
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305696 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005697 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305699 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005700 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305701 tempbx = (unsigned short) (tempebx >> 16);
5702 temp = tempbx & 0x00FF;
5703 temp = temp << 4;
5704 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005705 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305707 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005708 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5709 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305710 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005711 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305712 tempax = pVBInfo->VGAHDE;
5713 if (modeflag & HalfDCLK)
5714 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305716 if (XGI_IsLCDDualLink(pVBInfo))
5717 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305719 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5720 if (tempax > 800)
5721 tempax -= 800;
5722 } else {
5723 if (pVBInfo->VGAHDE > 800) {
5724 if (pVBInfo->VGAHDE == 1024)
5725 tempax = (tempax * 25 / 32) - 1;
5726 else
5727 tempax = (tempax * 20 / 32) - 1;
5728 }
5729 }
5730 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305732 temp = (tempax & 0xFF00) >> 8;
5733 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005734 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305735 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005736 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005737
Peter Huewe599801f2012-02-09 21:11:45 +01005738 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005740 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 }
5743 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305745 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5746 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01005747 | TVSetYPbPr525p | TVSetYPbPr750p
5748 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305749 temp |= 0x0001;
5750 if ((pVBInfo->VBInfo & SetInSlaveMode)
5751 && (!(pVBInfo->TVInfo
5752 & TVSimuMode)))
5753 temp &= (~0x0001);
5754 }
5755 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005756
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005757 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305758 tempbx = pVBInfo->HT;
5759 if (XGI_IsLCDDualLink(pVBInfo))
5760 tempbx = tempbx >> 1;
5761 tempbx = (tempbx >> 1) - 2;
5762 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005763 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305764 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005765 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305766 }
5767 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005768
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305769 if (pVBInfo->ISXPDOS == 0)
5770 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5771 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005772}
5773
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005774static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5775{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005776 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005777}
5778
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005779static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305780 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005781{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305782 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305784 Pindex = pVBInfo->Part5Port;
5785 Pdata = pVBInfo->Part5Port + 1;
5786 if (pVBInfo->ModeType == ModeVGA) {
5787 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005788 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305790 }
5791 }
5792 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005793}
5794
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005795static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305796 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005797{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005798 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005799}
5800
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005801static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305802 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005803{
5804
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005805 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005806}
5807
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005808static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5809 unsigned short ModeNo, unsigned short ModeIdIndex,
5810 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005811{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005812 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005813
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305814 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
5815 if (ModeNo <= 0x13) {
5816 xres = pVBInfo->StResInfo[resindex].HTotal;
5817 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005818 /* si+St_ResInfo */
5819 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305820 } else {
5821 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5822 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005823 /* si+St_ModeFlag */
5824 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305825 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005826
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305827 if (!(modeflag & Charx8Dot)) {
5828 xres /= 9;
5829 xres *= 8;
5830 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305832 if (ModeNo > 0x13) {
5833 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5834 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005835
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305836 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5837 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305839 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005840
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005841 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305842 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005843
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005844 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305845 return 0;
5846
5847 if (ModeNo > 0x13) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005848 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5849 yres != xgifb_info->lvds_data.LVDSVDE) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005850 colordepth = XGI_GetColorDepth(ModeNo,
5851 ModeIdIndex,
5852 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305853 if (colordepth > 2)
5854 return 0;
5855
5856 }
5857 }
5858 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005859}
5860
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005861static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5862 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005863 unsigned short ModeNo,
5864 unsigned short ModeIdIndex,
5865 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305867 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005868 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305869 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5870 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5871 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005872
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005873 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005874 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305875 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005876 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005877
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005878 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005879
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005880 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005881 /* SR35[7] FP VSync polarity */
5882 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5883 /* SR30[5] FP HSync polarity */
5884 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005885
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005886 if (chip_id == XG27)
5887 XGI_SetXG27FPBits(pVBInfo);
5888 else
5889 XGI_SetXG21FPBits(pVBInfo);
5890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305891 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
5892 if (ModeNo <= 0x13) {
5893 xres = pVBInfo->StResInfo[resindex].HTotal;
5894 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005895 /* si+St_ResInfo */
5896 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305897 } else {
5898 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5899 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005900 /* si+St_ModeFlag */
5901 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305902 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305904 if (!(modeflag & Charx8Dot))
5905 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005906
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005907 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005908
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005909 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305910 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
5911 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305913 if (LVDSHBS > LVDSHT)
5914 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005915
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005916 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305917 if (LVDSHRS > LVDSHT)
5918 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005919
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005920 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305921 if (LVDSHRE > LVDSHT)
5922 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005923
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005924 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005925
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005926 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005927
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005928 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305929 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5930 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305932 if (LVDSVBS > LVDSVT)
5933 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005934
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005935 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305936 if (LVDSVRS > LVDSVT)
5937 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005938
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005939 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305940 if (LVDSVRE > LVDSVT)
5941 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005942
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005943 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005944
Aaro Koskinen58839b02011-03-13 12:26:23 +02005945 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005946 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005947
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305948 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005949 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305951 /* HT SR0B[1:0] CR00 */
5952 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005953 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005954 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005955
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305956 /* HBS SR0B[5:4] CR02 */
5957 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005958 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005959 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305961 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5962 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005963 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5964 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5965 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005966
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305967 /* HRS SR0B[7:6] CR04 */
5968 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005969 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005970 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305972 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5973 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005974 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005975 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305977 /* HRE SR0C[2] CR05[4:0] */
5978 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005979 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5980 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005981
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305982 /* Panel HRE SR2F[7:2] */
5983 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005984 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305986 /* VT SR0A[0] CR07[5][0] CR06 */
5987 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005988 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5989 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5990 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005991 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305993 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5994 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005995 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5996 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5997 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005998 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306000 /* VBE SR0A[4] CR16 */
6001 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006002 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006003 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306005 /* VRS SR0A[3] CR7[7][2] CR10 */
6006 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006007 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6008 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6009 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006010 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006011
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006012 if (chip_id == XG27) {
6013 /* Panel VRS SR35[2:0] SR34[7:0] */
6014 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
6015 (value & 0x700) >> 8);
6016 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
6017 } else {
6018 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6019 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
6020 (value & 0x600) >> 9);
6021 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
6022 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
6023 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006024
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306025 /* VRE SR0A[5] CR11[3:0] */
6026 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006027 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6028 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006029
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306030 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006031 if (chip_id == XG27)
6032 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6033 (value << 2) & 0xFC);
6034 else
6035 /* SR3F[7] has to be 0, h/w bug */
6036 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6037 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006038
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306039 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006040
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006041 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006042 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006043 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006044 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006045 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306046 value += 0x10;
6047 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006048
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306049 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006050 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006051 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006052 /* set data, panning = 0, shift left 1 dot*/
6053 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006054
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006055 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006056 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306057
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006058 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306059 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006060
6061}
6062
6063/* --------------------------------------------------------------------- */
6064/* Function : XGI_IsLCDON */
6065/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006066/* Output : 0 : Skip PSC Control */
6067/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006068/* Description : */
6069/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006070static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006071{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306072 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306074 tempax = pVBInfo->VBInfo;
6075 if (tempax & SetCRT2ToDualEdge)
6076 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01006077 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306078 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306080 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006081}
6082
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006083/* --------------------------------------------------------------------- */
6084/* Function : XGI_DisableChISLCD */
6085/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006086/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006087/* Description : */
6088/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006089static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006090{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306091 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306093 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006094 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306096 if (tempbx & (EnableChA | DisableChA)) {
6097 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6098 return 0;
6099 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306101 if (!(tempbx & (EnableChB | DisableChB)))
6102 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306104 if (tempah & 0x01) /* Chk LCDB Mode */
6105 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306107 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006108}
6109
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006110/* --------------------------------------------------------------------- */
6111/* Function : XGI_EnableChISLCD */
6112/* Input : */
6113/* Output : 0 -> Not LCD mode */
6114/* Description : */
6115/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006116static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006117{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306118 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006119
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306120 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006121 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306123 if (tempbx & (EnableChA | DisableChA)) {
6124 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6125 return 0;
6126 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306128 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006129 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306131 if (tempah & 0x01) /* Chk LCDB Mode */
6132 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306134 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006135}
6136
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006137static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
6138 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306139 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006140{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006141 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006142
Peter Huewe6896b942012-02-09 21:11:46 +01006143 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6144 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306145 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006146 if (!(pVBInfo->VBInfo &
6147 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006148 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306149 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6150 tempah = 0x7F; /* Disable Channel A */
Peter Huewea3d675c2012-02-09 21:11:47 +01006151 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006152 /* Disable Channel B */
6153 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006154
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306155 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006156 /* force to disable Cahnnel */
6157 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306159 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006160 /* Force to disable Channel B */
6161 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306162 }
6163 }
6164 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006165
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006166 /* disable part4_1f */
6167 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006168
Peter Huewe6896b942012-02-09 21:11:46 +01006169 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006170 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306171 || (XGI_DisableChISLCD(pVBInfo))
6172 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006173 /* LVDS Driver power down */
6174 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306175 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006176
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306177 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01006178 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306179 | SetSimuScanMode))) {
6180 if (pVBInfo->SetFlag & GatingCRT)
6181 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006182 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306183 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006184
Peter Huewea3d675c2012-02-09 21:11:47 +01006185 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306186 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01006187 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006188 /* Power down */
6189 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306190 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006191
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006192 /* disable TV as primary VGA swap */
6193 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006194
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306195 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02006196 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006197
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006198 if ((pVBInfo->SetFlag & DisableChB) ||
6199 (pVBInfo->VBInfo &
6200 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01006201 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006202 (pVBInfo->VBInfo &
6203 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006204 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006205
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006206 if ((pVBInfo->SetFlag & DisableChB) ||
6207 (pVBInfo->VBInfo &
6208 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01006209 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006210 (pVBInfo->VBInfo &
6211 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
6212 /* save Part1 index 0 */
6213 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
6214 /* BTDAC = 1, avoid VB reset */
6215 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
6216 /* disable CRT2 */
6217 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6218 /* restore Part1 index 0 */
6219 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306220 }
6221 } else { /* {301} */
6222 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006223 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
6224 /* Disable CRT2 */
6225 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6226 /* Disable TV asPrimary VGA swap */
6227 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306228 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006229
Peter Huewea3d675c2012-02-09 21:11:47 +01006230 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306231 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006232 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306233 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006234}
6235
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006236/* --------------------------------------------------------------------- */
6237/* Function : XGI_GetTVPtrIndex */
6238/* Input : */
6239/* Output : */
6240/* Description : bx 0 : ExtNTSC */
6241/* 1 : StNTSC */
6242/* 2 : ExtPAL */
6243/* 3 : StPAL */
6244/* 4 : ExtHiTV */
6245/* 5 : StHiTV */
6246/* 6 : Ext525i */
6247/* 7 : St525i */
6248/* 8 : Ext525p */
6249/* 9 : St525p */
6250/* A : Ext750p */
6251/* B : St750p */
6252/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006253static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006254{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306255 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006256
Peter Huewe599801f2012-02-09 21:11:45 +01006257 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306258 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01006259 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306260 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01006261 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306262 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01006263 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306264 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01006265 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306266 tempbx = 10;
6267 if (pVBInfo->TVInfo & TVSimuMode)
6268 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306270 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006271}
6272
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006273/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006274/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006275/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006276/* Output : bx 0 : NTSC */
6277/* 1 : PAL */
6278/* 2 : PALM */
6279/* 3 : PALN */
6280/* 4 : NTSC1024x768 */
6281/* 5 : PAL-M 1024x768 */
6282/* 6-7: reserved */
6283/* cl 0 : YFilter1 */
6284/* 1 : YFilter2 */
6285/* ch 0 : 301A */
6286/* 1 : 301B/302B/301LV/302LV */
6287/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006288/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006289static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
6290 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006291{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006292 *tempbx = 0;
6293 *tempcl = 0;
6294 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006295
Peter Huewe599801f2012-02-09 21:11:45 +01006296 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006297 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006298
Peter Huewe599801f2012-02-09 21:11:45 +01006299 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006300 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006301
Peter Huewe599801f2012-02-09 21:11:45 +01006302 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006303 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006304
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006305 if (pVBInfo->TVInfo & NTSC1024x768) {
6306 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01006307 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006308 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306309 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006310
Peter Huewe6896b942012-02-09 21:11:46 +01006311 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6312 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006313 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
6314 & TVSimuMode)) {
6315 *tempbx += 8;
6316 *tempcl += 1;
6317 }
6318 }
6319
Peter Huewe6896b942012-02-09 21:11:46 +01006320 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6321 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006322 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006323}
6324
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006325static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006326{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306327 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306329 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006330
Peter Huewe6896b942012-02-09 21:11:46 +01006331 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6332 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006333 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306334 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
6335 tempbl = 0;
6336 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306338 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
6339 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006340
Peter Huewe6896b942012-02-09 21:11:46 +01006341 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6342 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306343 | VB_XGI301C))
6344 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006345
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306346 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6347 tempbl = tempbl >> 4;
Peter Huewea3d675c2012-02-09 21:11:47 +01006348 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006349 /* Get LCD Delay */
6350 index = XGI_GetLCDCapPtr(pVBInfo);
6351 tempbh = pVBInfo->LCDCapList[index].
6352 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006353
Peter Huewea3d675c2012-02-09 21:11:47 +01006354 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306355 tempbl = tempbh;
6356 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006357
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306358 tempbl &= 0x0F;
6359 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02006360 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306362 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
6363 | SetCRT2ToTV)) { /* Channel B */
6364 tempah &= 0xF0;
6365 tempah |= tempbl;
6366 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006367
Peter Huewea3d675c2012-02-09 21:11:47 +01006368 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) { /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306369 tempah &= 0x0F;
6370 tempah |= tempbh;
6371 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006372 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306373 }
6374 } else if (pVBInfo->IF_DEF_LVDS == 1) {
6375 tempbl = 0;
6376 tempbh = 0;
6377 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006378 /* / Get LCD Delay */
6379 tempah = pVBInfo->LCDCapList[
6380 XGI_GetLCDCapPtr(pVBInfo)].
6381 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306382 tempah &= 0x0f;
6383 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006384 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306385 tempah);
6386 }
6387 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006388}
6389
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006390static void XGI_SetLCDCap_A(unsigned short tempcx,
6391 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006392{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306393 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006394
Aaro Koskinen58839b02011-03-13 12:26:23 +02006395 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306397 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006398 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006399 /* Enable Dither */
6400 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006401 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306402 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006403 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306404 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006405 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306406 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006407}
6408
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006409/* --------------------------------------------------------------------- */
6410/* Function : XGI_SetLCDCap_B */
6411/* Input : cx -> LCD Capability */
6412/* Output : */
6413/* Description : */
6414/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006415static void XGI_SetLCDCap_B(unsigned short tempcx,
6416 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006417{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306418 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006419 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306420 (unsigned short) (((tempcx & 0x00ff) >> 6)
6421 | 0x0c));
6422 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006423 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306424 (unsigned short) (((tempcx & 0x00ff) >> 6)
6425 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006426}
6427
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02006428static void XGI_LongWait(struct vb_device_info *pVBInfo)
6429{
6430 unsigned short i;
6431
6432 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
6433
6434 if (!(i & 0xC0)) {
6435 for (i = 0; i < 0xFFFF; i++) {
6436 if (!(inb(pVBInfo->P3da) & 0x08))
6437 break;
6438 }
6439
6440 for (i = 0; i < 0xFFFF; i++) {
6441 if ((inb(pVBInfo->P3da) & 0x08))
6442 break;
6443 }
6444 }
6445}
6446
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006447static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006448{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306449 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306451 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006452
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006453 /* disable down spectrum D[4] */
6454 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306455 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006456 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306457 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006458
Aaro Koskinen8104e322011-03-13 12:26:22 +02006459 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306460 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006461 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306462 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006463 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306464 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006465 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306466 pVBInfo->LCDCapList[index].Spectrum_34);
6467 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006468 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006469}
6470
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006471static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
6472{
6473 unsigned short tempcx;
6474
6475 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
6476
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006477 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01006478 (VB_SIS301B |
6479 VB_SIS302B |
6480 VB_SIS301LV |
6481 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006482 VB_XGI301C)) { /* 301LV/302LV only */
6483 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01006484 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006485 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006486 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006487 (unsigned char) (tempcx & 0x1F));
6488 }
6489 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006490 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006491 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
6492 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
6493 | EnablePLLSPLOW)) >> 8));
6494 }
6495
Peter Huewe6896b942012-02-09 21:11:46 +01006496 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6497 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006498 if (pVBInfo->VBInfo & SetCRT2ToLCD)
6499 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006500 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006501 XGI_SetLCDCap_A(tempcx, pVBInfo);
6502
Peter Huewe6896b942012-02-09 21:11:46 +01006503 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006504 if (tempcx & EnableSpectrum)
6505 SetSpectrum(pVBInfo);
6506 }
6507 } else {
6508 /* LVDS,CH7017 */
6509 XGI_SetLCDCap_A(tempcx, pVBInfo);
6510 }
6511}
6512
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006513/* --------------------------------------------------------------------- */
6514/* Function : XGI_SetAntiFlicker */
6515/* Input : */
6516/* Output : */
6517/* Description : Set TV Customized Param. */
6518/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006519static void XGI_SetAntiFlicker(unsigned short ModeNo,
6520 unsigned short ModeIdIndex,
6521 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006522{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306523 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006524
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306525 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006526
Peter Huewe599801f2012-02-09 21:11:45 +01006527 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306528 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006529
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306530 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6531 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006532
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306533 if (ModeNo <= 0x13)
6534 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
6535 else
6536 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006537
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306538 tempbx += index;
6539 tempah = TVAntiFlickList[tempbx];
6540 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006541
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006542 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006543}
6544
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006545static void XGI_SetEdgeEnhance(unsigned short ModeNo,
6546 unsigned short ModeIdIndex,
6547 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006548{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306549 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306551 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306553 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6554 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306556 if (ModeNo <= 0x13)
6557 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
6558 else
6559 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306561 tempbx += index;
6562 tempah = TVEdgeList[tempbx];
6563 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006564
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006565 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006566}
6567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006568static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006569{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306570 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006571
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306572 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006573
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306574 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006575
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306576 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
6577 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006578
Aaro Koskinen8104e322011-03-13 12:26:22 +02006579 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306580 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006581 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306582 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006583 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306584 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006585 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306586 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006587}
6588
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006589static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306590 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006591{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306592 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306594 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306596 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306598 switch (tempbx) {
6599 case 0x00:
6600 case 0x04:
6601 filterPtr = NTSCYFilter1;
6602 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306604 case 0x01:
6605 filterPtr = PALYFilter1;
6606 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306608 case 0x02:
6609 case 0x05:
6610 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306611 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03006612 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306613 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306615 case 0x08:
6616 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306617 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306618 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306619 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03006620 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306621 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306623 default:
6624 return;
6625 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306627 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006628 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
6629 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306630 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006631 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
6632 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306634 if (tempcl == 0)
6635 index = tempal * 4;
6636 else
6637 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306639 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006640 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
6641 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
6642 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
6643 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306644 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006645 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
6646 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
6647 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
6648 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306649 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006650
Peter Huewe6896b942012-02-09 21:11:46 +01006651 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6652 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006653 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
6654 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
6655 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306656 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006657}
6658
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006659/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006660/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006661/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006662/* Output : */
6663/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006664/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006665static void XGI_OEM310Setting(unsigned short ModeNo,
6666 unsigned short ModeIdIndex,
6667 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006668{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006669 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006670
Peter Huewea3d675c2012-02-09 21:11:47 +01006671 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006672 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006673
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006674 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006675 XGI_SetPhaseIncr(pVBInfo);
6676 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
6677 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006678
Peter Huewe6896b942012-02-09 21:11:46 +01006679 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006680 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306681 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006682}
6683
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006684/* --------------------------------------------------------------------- */
6685/* Function : XGI_SetCRT2ModeRegs */
6686/* Input : */
6687/* Output : */
6688/* Description : Origin code for crt2group */
6689/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006690static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306691 struct xgi_hw_device_info *HwDeviceExtension,
6692 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006693{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306694 unsigned short tempbl;
6695 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006696
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306697 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306699 tempah = 0;
6700 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006701 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306702 tempah &= ~0x10; /* BTRAMDAC */
6703 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306705 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
6706 | SetCRT2ToLCD)) {
6707 tempah = 0x40; /* BTDRAM */
6708 if (ModeNo > 0x13) {
6709 tempcl = pVBInfo->ModeType;
6710 tempcl -= ModeVGA;
6711 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006712 /* BT Color */
6713 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306714 if (tempah == 0)
6715 tempah = 1;
6716 tempah |= 0x040;
6717 }
6718 }
6719 if (pVBInfo->VBInfo & SetInSlaveMode)
6720 tempah ^= 0x50; /* BTDAC */
6721 }
6722 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006723
Aaro Koskinen8104e322011-03-13 12:26:22 +02006724 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306725 tempah = 0x08;
6726 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306728 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006729 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306730 } else {
6731 tempah = 0x00;
6732 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306734 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
Peter Huewea3d675c2012-02-09 21:11:47 +01006735 | SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
6736 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006737 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306738 tempbl &= 0xf7;
6739 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006740 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306741 tempbl, tempah);
6742 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01006743 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306744 tempbl &= 0xf7;
6745 tempah |= 0x01;
6746 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006747
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006748 if (pVBInfo->VBInfo &
6749 (SetCRT2ToRAMDAC |
6750 SetCRT2ToTV |
6751 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306752 tempbl &= 0xf8;
6753 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306755 if (!(pVBInfo->VBInfo & SetInSlaveMode))
6756 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006757
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006758 if (!(pVBInfo->VBInfo &
6759 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306760 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006761 if (!(pVBInfo->VBInfo &
6762 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306763 tempah = tempah ^ 0x01;
6764 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006765
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006766 if (!(pVBInfo->VBInfo &
6767 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306768 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006769 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306770 0x2e, tempbl, tempah);
6771 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006772 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306773 0x2e, tempbl, tempah);
6774 }
6775 }
6776 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006777 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306778 tempah);
6779 }
6780 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306782 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006783 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306784 tempah &= (~0x08);
6785 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
6786 & SetInSlaveMode))) {
6787 tempah |= 0x010;
6788 }
6789 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306791 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306792 tempah |= 0x020;
6793 if (ModeNo > 0x13) {
6794 if (pVBInfo->VBInfo & DriverMode)
6795 tempah = tempah ^ 0x20;
6796 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306797 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006798
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006799 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306800 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306802 if (pVBInfo->LCDInfo & SetLCDDualLink)
6803 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306805 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306806 if (pVBInfo->TVInfo & RPLLDIV2XO)
6807 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306808 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006809
Peter Huewe255aabd2012-02-09 21:11:44 +01006810 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
6811 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306812 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006813
Peter Huewe255aabd2012-02-09 21:11:44 +01006814 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306815 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006816
Aaro Koskinen8104e322011-03-13 12:26:22 +02006817 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306818 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006819
Peter Huewe6896b942012-02-09 21:11:46 +01006820 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6821 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306822 tempah = 0;
6823 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006824
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306825 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6826 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01006827 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306828 tempah |= 0x04; /* shampoo 0129 */
6829 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006830
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006831 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306832 tempah = 0x00;
6833 tempbl = 0xcf;
6834 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6835 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6836 tempah |= 0x30;
6837 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006838
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006839 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306840 tempah = 0;
6841 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306843 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6844 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6845 tempah |= 0xc0;
6846 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006847 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306848 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306850 tempah = 0;
6851 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01006852 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306853 tempbl = 0xff;
6854 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6855 tempah |= 0x80;
6856 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006857
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006858 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006859
Peter Huewe6896b942012-02-09 21:11:46 +01006860 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306861 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006862 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6863 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306864 }
6865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006866}
6867
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006868static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306869 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006870{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306871 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006872
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306873 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006874
Peter Huewea3d675c2012-02-09 21:11:47 +01006875 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306876 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006877
6878}
6879
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306880void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6881 struct vb_device_info *pVBInfo)
6882{
6883
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006884 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006885
6886}
6887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306888void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6889 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006890{
6891
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006892 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006893
6894}
6895
Bill Pemberton80adad82010-06-17 13:10:51 -04006896unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006897{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306898 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006899
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306900 if (pVBInfo->IF_DEF_LVDS == 1) {
6901 return 1;
6902 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006903 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306904 if ((flag == 1) || (flag == 2))
6905 return 1; /* 301b */
6906 else
6907 return 0;
6908 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006909}
6910
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006911unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6912 unsigned short ModeNo, unsigned short ModeIdIndex,
6913 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006914{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006915 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6916 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6917 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006918
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006919 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006920
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006921 if (ModeNo <= 0x13)
6922 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6923 else
6924 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6925
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006926 if (ModeNo < 0x14)
6927 return 0xFFFF;
6928
Aaro Koskinen58839b02011-03-13 12:26:23 +02006929 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006930 index = index >> pVBInfo->SelectCRT2Rate;
6931 index &= 0x0F;
6932
6933 if (pVBInfo->LCDInfo & LCDNonExpanding)
6934 index = 0;
6935
6936 if (index > 0)
6937 index--;
6938
6939 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006940 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006941 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006942 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6943 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006944 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006945 /* 301b */
6946 temp = LCDARefreshIndex[
6947 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006948 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006949 temp = LCDRefreshIndex[
6950 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006951
6952 if (index > temp)
6953 index = temp;
6954 } else {
6955 index = 0;
6956 }
6957 }
6958 }
6959
6960 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6961 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6962 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006963 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6964 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006965 index++;
6966 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006967 /* Alan 10/19/2007;
6968 * do the similar adjustment like XGISearchCRT1Rate() */
6969 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6970 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006971 index++;
6972 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006973 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6974 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006975 index++;
6976 }
6977 }
6978
6979 i = 0;
6980 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006981 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6982 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006983 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006984 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6985 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006986 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006987 if (temp < pVBInfo->ModeType)
6988 break;
6989 i++;
6990 index--;
6991
6992 } while (index != 0xFFFF);
6993 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6994 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006995 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6996 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006997 if (temp & InterlaceMode)
6998 i++;
6999 }
7000 }
7001 i--;
7002 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7003 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7004 RefreshRateTableIndex, &i, pVBInfo);
7005 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02007006 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007007}
7008
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007009static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307010 struct xgi_hw_device_info *HwDeviceExtension,
7011 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007012{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007013 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007014
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007015 pVBInfo->SetFlag |= ProgrammingCRT2;
7016 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7017 ModeIdIndex, pVBInfo);
7018 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7019 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7020 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7021 HwDeviceExtension, pVBInfo);
7022 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7023 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007024}
7025
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02007026static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007027 struct xgi_hw_device_info *HwDeviceExtension,
7028 struct vb_device_info *pVBInfo)
7029{
7030 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7031
7032 tempbx = pVBInfo->VBInfo;
7033 pVBInfo->SetFlag |= ProgrammingCRT2;
7034 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7035 pVBInfo->SelectCRT2Rate = 4;
7036 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7037 ModeIdIndex, pVBInfo);
7038 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7039 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7040 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7041 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7042 RefreshRateTableIndex, pVBInfo);
7043 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7044 RefreshRateTableIndex, pVBInfo);
7045 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7046 RefreshRateTableIndex, pVBInfo);
7047 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7048 HwDeviceExtension, pVBInfo);
7049 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7050 RefreshRateTableIndex, pVBInfo);
7051 XGI_SetTap4Regs(pVBInfo);
7052 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7053 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7054 HwDeviceExtension, pVBInfo);
7055 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7056 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7057 XGI_AutoThreshold(pVBInfo);
7058 return 1;
7059}
7060
7061void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7062{
7063 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7064 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7065 0x05, 0x00 };
7066
7067 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7068
7069 unsigned char CR17, CR63, SR31;
7070 unsigned short temp;
7071 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7072
7073 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007074 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007075
7076 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007077 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007078 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007079 pVBInfo->P3d4, 0x53) | 0x02));
7080
Aaro Koskinen58839b02011-03-13 12:26:23 +02007081 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
7082 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
7083 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007084
Aaro Koskinen8104e322011-03-13 12:26:22 +02007085 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7086 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007087
Aaro Koskinen58839b02011-03-13 12:26:23 +02007088 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007089 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007090
Aaro Koskinen58839b02011-03-13 12:26:23 +02007091 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007092 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007093
Aaro Koskinen58839b02011-03-13 12:26:23 +02007094 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007095 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02007096 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007097 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007098
Aaro Koskinen8104e322011-03-13 12:26:22 +02007099 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007100
7101 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007102 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007103
7104 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007105 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007106 CRTCData[i]);
7107
7108 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007109 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007110 CRTCData[i]);
7111
7112 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007113 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007114 CRTCData[i]);
7115
Aaro Koskinen8104e322011-03-13 12:26:22 +02007116 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007117 & 0xE0));
7118
Aaro Koskinen8104e322011-03-13 12:26:22 +02007119 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7120 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7121 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007122
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007123 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007124
7125 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007126 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
7127 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
7128 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007129 }
7130
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007131 mdelay(1);
7132
7133 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007134 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007135
7136 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007137 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007138 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007139 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007140
7141 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007142 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007143
7144 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007145 outb(0, (pVBInfo->P3c8 + 1));
7146 outb(0, (pVBInfo->P3c8 + 1));
7147 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007148 }
7149
Aaro Koskinen8104e322011-03-13 12:26:22 +02007150 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
7151 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
7152 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007153
7154 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02007155 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007156 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007157 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007158}
7159
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007160static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
7161 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007162 struct vb_device_info *pVBInfo)
7163{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02007164 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007165
Peter Huewe6896b942012-02-09 21:11:46 +01007166 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
7167 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007168 if (!(pVBInfo->SetFlag & DisableChA)) {
7169 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007170 /* Power on */
7171 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007172 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007173 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7174 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007175 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007176 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007177 }
7178 }
7179 }
7180
7181 if (!(pVBInfo->SetFlag & DisableChB)) {
7182 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
7183 & (SetCRT2ToLCD | SetCRT2ToTV
7184 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007185 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007186 pVBInfo->P3c4, 0x32);
7187 tempah &= 0xDF;
7188 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007189 if (!(pVBInfo->VBInfo &
7190 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007191 tempah |= 0x20;
7192 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007193 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007194 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007195
Aaro Koskinen58839b02011-03-13 12:26:23 +02007196 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007197 pVBInfo->Part1Port, 0x2E);
7198
7199 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007200 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007201 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007202 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007203 }
7204 }
7205
7206 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
7207 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007208 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007209 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01007210 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007211 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007212 if (XGI_EnableChISLCD(pVBInfo) ||
7213 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01007214 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007215 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02007216 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007217 pVBInfo->Part4Port,
7218 0x2A,
7219 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007220 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007221 /* LVDS Driver power on */
7222 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007223 }
7224 }
7225
7226 tempah = 0x00;
7227
7228 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7229 tempah = 0xc0;
7230
7231 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01007232 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007233 if (pVBInfo->VBInfo &
7234 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007235 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007236 if (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01007237 XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007238 tempah = tempah ^ 0xC0;
7239
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007240 if (pVBInfo->SetFlag &
7241 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007242 tempah &= 0xBF;
7243
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007244 if (pVBInfo->SetFlag &
7245 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007246 tempah &= 0x7F;
7247
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007248 if (pVBInfo->SetFlag &
7249 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007250 tempah |= 0x40;
7251
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007252 if (pVBInfo->SetFlag &
7253 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007254 tempah |= 0x80;
7255 }
7256 }
7257 }
7258 }
7259
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007260 /* EnablePart4_1F */
7261 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007262
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007263 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007264 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007265 XGI_DisableGatingCRT(HwDeviceExtension,
7266 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007267 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
7268 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007269 }
7270 }
7271 } /* 301 */
7272 else { /* LVDS */
7273 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01007274 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007275 /* enable CRT2 */
7276 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007277
Aaro Koskinen58839b02011-03-13 12:26:23 +02007278 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007279 0x2E);
7280 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007281 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007282
Aaro Koskinendc505562011-03-13 12:26:26 +02007283 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007284 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007285 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007286}
7287
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007288static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
7289 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007290 unsigned short ModeNo, unsigned short ModeIdIndex,
7291 struct vb_device_info *pVBInfo)
7292{
7293 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
7294
7295 unsigned short XGINew_P3cc = pVBInfo->P3cc;
7296
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007297 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007298 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
Aaro Koskineneb9aef12011-11-27 23:03:15 +02007299 outb(pVBInfo->StandTable[StandTableIndex].MISC, pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007300 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
7301 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7302 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
7303 XGI_ClearExt1Regs(pVBInfo);
7304
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007305 if (HwDeviceExtension->jChipType == XG27) {
7306 if (pVBInfo->IF_DEF_LVDS == 0)
7307 XGI_SetDefaultVCLK(pVBInfo);
7308 }
7309
7310 temp = ~ProgrammingCRT2;
7311 pVBInfo->SetFlag &= temp;
7312 pVBInfo->SelectCRT2Rate = 0;
7313
Peter Huewe6896b942012-02-09 21:11:46 +01007314 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
7315 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01007316 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007317 | SetInSlaveMode)) {
7318 pVBInfo->SetFlag |= ProgrammingCRT2;
7319 }
7320 }
7321
7322 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7323 ModeIdIndex, pVBInfo);
7324 if (RefreshRateTableIndex != 0xFFFF) {
7325 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
7326 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7327 pVBInfo, HwDeviceExtension);
7328 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
7329 RefreshRateTableIndex, pVBInfo);
7330 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7331 HwDeviceExtension, pVBInfo);
7332 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
7333 RefreshRateTableIndex, pVBInfo);
7334 }
7335
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007336 if ((HwDeviceExtension->jChipType >= XG20) &&
7337 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007338 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007339 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
7340 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007341 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007342 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007343 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
7344 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007345 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7346 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007347 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007348 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007349 }
7350 }
7351
7352 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007353 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007354 if (temp & 0xA0) {
7355
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007356 if (HwDeviceExtension->jChipType == XG27)
7357 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
7358 RefreshRateTableIndex, pVBInfo);
7359 else
7360 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
7361 RefreshRateTableIndex, pVBInfo);
7362
7363 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
7364 RefreshRateTableIndex);
7365
Aaro Koskinen105d8d02011-08-31 21:46:00 +03007366 xgifb_set_lcd(HwDeviceExtension->jChipType,
7367 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007368
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007369 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007370 xgifb_set_lvds(xgifb_info,
7371 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007372 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007373 }
7374 }
7375
7376 pVBInfo->SetFlag &= (~ProgrammingCRT2);
7377 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
7378 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
7379 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007380 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007381}
7382
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007383unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
7384 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007385 unsigned short ModeNo)
7386{
7387 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007388 struct vb_device_info VBINF;
7389 struct vb_device_info *pVBInfo = &VBINF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007390 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
7391 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007392 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007393
7394 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
7395 pVBInfo->IF_DEF_YPbPr = 0;
7396 pVBInfo->IF_DEF_HiVision = 0;
7397 pVBInfo->IF_DEF_CRT2Monitor = 0;
7398 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007399 } else {
7400 pVBInfo->IF_DEF_YPbPr = 1;
7401 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02007402 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007403 }
7404
7405 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
7406 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
7407 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
7408 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
7409 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
7410 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
7411 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
7412 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
7413 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
7414 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
7415 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
7416 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
7417 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01007418 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
7419 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
7420 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
7421 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
7422 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007423
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007424 /* for x86 Linux, XG21 LVDS */
7425 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007426 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007427 pVBInfo->IF_DEF_LVDS = 1;
7428 }
7429 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007430 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
7431 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007432 pVBInfo->IF_DEF_LVDS = 1;
7433 }
7434 }
7435
7436 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
7437 XGI_GetVBType(pVBInfo);
7438
7439 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02007440 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007441 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007442 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007443
7444 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
7445 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
7446
7447 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7448
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007449 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7450 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
7451 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
7452 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007453 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007454
Peter Huewea3d675c2012-02-09 21:11:47 +01007455 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007456 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007457 ModeIdIndex, pVBInfo);
7458
Peter Huewea3d675c2012-02-09 21:11:47 +01007459 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007460 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7461 HwDeviceExtension, pVBInfo);
7462 }
7463 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01007464 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007465 XGI_SetCRT1Group(xgifb_info,
7466 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007467 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01007468 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007469 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7470 HwDeviceExtension,
7471 pVBInfo);
7472 }
7473 }
7474 }
7475
Peter Huewe6896b942012-02-09 21:11:46 +01007476 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007477 switch (HwDeviceExtension->ujVBChipID) {
7478 case VB_CHIP_301:
7479 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7480 pVBInfo); /*add for CRT2 */
7481 break;
7482
7483 case VB_CHIP_302:
7484 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7485 pVBInfo); /*add for CRT2 */
7486 break;
7487
7488 default:
7489 break;
7490 }
7491 }
7492
7493 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
7494 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
7495 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007496 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007497 } /* !XG20 */
7498 else {
7499 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007500 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007501 ModeIdIndex,
7502 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007503 return 0;
7504
7505 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007506 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01007507 St_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007508 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007509 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01007510 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007511 }
7512
7513 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03007514 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007515
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007516 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007517
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007518 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
7519 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007520
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007521 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007522 }
7523
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007524 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
7525
7526 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7527 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
7528 }
7529
7530 return 1;
7531}