blob: 60d4adf99923a1dcf79fd2870dff084f9f9ef7b1 [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) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +0400155 unsigned char temp;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530156 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +0100157 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 pVBInfo->CR40 = XGI27_cr41;
159 pVBInfo->pXGINew_CR97 = &XG27_CR97;
160 pVBInfo->pSR36 = &XG27_SR36;
161 pVBInfo->pCR8F = &XG27_CR8F;
162 pVBInfo->pCRD0 = XG27_CRD0;
163 pVBInfo->pCRDE = XG27_CRDE;
164 pVBInfo->pSR40 = &XG27_SR40;
165 pVBInfo->pSR41 = &XG27_SR41;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +0400166 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200167
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +0400168 /*Z11m DDR*/
169 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
170 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
171 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
172 pVBInfo->pXGINew_CR97 = &Z11m_CR97;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530175 if (ChipType >= XG20) {
176 pVBInfo->pDVOSetting = &XG21_DVOSetting;
177 pVBInfo->pCR2E = &XG21_CR2E;
178 pVBInfo->pCR2F = &XG21_CR2F;
179 pVBInfo->pCR46 = &XG21_CR46;
180 pVBInfo->pCR47 = &XG21_CR47;
181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200182
183}
184
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800185static unsigned char XGI_GetModePtr(unsigned short ModeNo,
186 unsigned short ModeIdIndex,
187 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200188{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530189 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200190
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530191 if (ModeNo <= 0x13)
192 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
193 else {
194 if (pVBInfo->ModeType <= 0x02)
195 index = 0x1B; /* 02 -> ModeEGA */
196 else
197 index = 0x0F;
198 }
199 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200200}
201
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800202static void XGI_SetSeqRegs(unsigned short ModeNo,
203 unsigned short StandTableIndex,
204 unsigned short ModeIdIndex,
205 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530207 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530210 if (ModeNo <= 0x13)
211 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
212 else
213 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200214
Aaro Koskinen8104e322011-03-13 12:26:22 +0200215 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530216 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200217
Peter Huewea3d675c2012-02-09 21:11:47 +0100218 i = XGI_SetCRT2ToLCDA;
219 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530220 tempah |= 0x01;
221 } else {
222 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
223 if (pVBInfo->VBInfo & SetInSlaveMode)
224 tempah |= 0x01;
225 }
226 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530228 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200229 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530231 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800232 /* Get SR2,3,4 from file */
233 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200234 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530235 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200236}
237
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200238static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800239 unsigned short StandTableIndex,
240 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200241{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530242 unsigned char CRTCdata;
243 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
Aaro Koskinen58839b02011-03-13 12:26:23 +0200245 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530246 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200247 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530249 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800250 /* Get CRTC from file */
251 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200252 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530253 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200254}
255
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800256static void XGI_SetATTRegs(unsigned short ModeNo,
257 unsigned short StandTableIndex,
258 unsigned short ModeIdIndex,
259 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200260{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530261 unsigned char ARdata;
262 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200263
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530264 if (ModeNo <= 0x13)
265 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
266 else
267 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530269 for (i = 0; i <= 0x13; i++) {
270 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
271 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
272 if (i == 0x13) {
Peter Huewea3d675c2012-02-09 21:11:47 +0100273 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530274 ARdata = 0;
275 } else {
276 if (pVBInfo->VBInfo & (SetCRT2ToTV
277 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800278 if (pVBInfo->VBInfo &
279 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530280 ARdata = 0;
281 }
282 }
283 }
284 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200285
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200286 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200287 outb(i, pVBInfo->P3c0); /* set index */
288 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200290
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200291 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200292 outb(0x14, pVBInfo->P3c0); /* set index */
293 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200294 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200295 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200296}
297
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200298static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800299 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200300{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 unsigned char GRdata;
302 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530304 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800305 /* Get GR from file */
306 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200307 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530308 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200309
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530310 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200311 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530312 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200313 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200315}
316
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200317static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200318{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530319 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200320
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200322 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323}
324
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200325static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200326{
327
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200328 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200329 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
330 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200331
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200332 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200333 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
334 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200335
Aaro Koskinendc505562011-03-13 12:26:26 +0200336 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200338}
339
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200340static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530341 unsigned short ModeIdIndex,
342 unsigned short RefreshRateTableIndex, unsigned short *i,
343 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200344{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200346
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530347 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800348 /* si+St_ModeFlag */
349 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530350 else
351 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
354 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
355 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530357 if (pVBInfo->IF_DEF_LVDS == 0) {
358 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
359 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200360
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530361 if (pVBInfo->VBType & VB_XGI301C)
362 tempax |= SupportCRT2in301C;
363 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200364
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800365 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100366 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530367 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Peter Huewe255aabd2012-02-09 21:11:44 +0100369 if (pVBInfo->LCDResInfo != Panel_1280x1024) {
370 if (pVBInfo->LCDResInfo != Panel_1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800371 if (pVBInfo->LCDInfo &
372 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530373 if (resinfo >= 9) {
374 tempax = 0;
375 return 0;
376 }
377 }
378 }
379 }
380 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200381
Peter Huewe599801f2012-02-09 21:11:45 +0100382 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Peter Huewe6896b942012-02-09 21:11:46 +0100383 if ((pVBInfo->VBType & VB_SIS301LV) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800384 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +0100385 tempax |= SupportYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 if (pVBInfo->VBInfo & SetInSlaveMode) {
387 if (resinfo == 4)
388 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 if (resinfo == 3)
391 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530393 if (resinfo > 7)
394 return 0;
395 }
396 } else {
Peter Huewe6896b942012-02-09 21:11:46 +0100397 tempax |= SupportHiVision;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530398 if (pVBInfo->VBInfo & SetInSlaveMode) {
399 if (resinfo == 4)
400 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200401
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530402 if (resinfo == 3) {
403 if (pVBInfo->SetFlag
404 & TVSimuMode)
405 return 0;
406 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200407
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530408 if (resinfo > 7)
409 return 0;
410 }
411 }
412 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800413 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
414 SetCRT2ToSVIDEO |
415 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100416 SetCRT2ToYPbPr525750 |
417 SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530418 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200419
Peter Huewe6896b942012-02-09 21:11:46 +0100420 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
421 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 | VB_XGI301C)) {
423 tempax |= SupportTV1024;
424 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200425
Peter Huewe599801f2012-02-09 21:11:45 +0100426 if (!(pVBInfo->VBInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530427 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800428 if (pVBInfo->VBInfo &
429 SetInSlaveMode) {
430 if (!(pVBInfo->VBInfo &
431 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530432 return 0;
433 }
434 }
435 }
436 }
437 }
438 }
439 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530440 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
441 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530443 if (resinfo > 0x08)
444 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200445
Peter Huewe255aabd2012-02-09 21:11:44 +0100446 if (pVBInfo->LCDResInfo < Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530447 if (resinfo > 0x07)
448 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530450 if (resinfo == 0x04)
451 return 0; /* 512x384 */
452 }
453 }
454 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200455
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800456 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
457 tempbx; (*i)--) {
458 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
459 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530460 if (infoflag & tempax)
461 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530463 if ((*i) == 0)
464 break;
465 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530467 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800468 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
469 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530470 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
471 != tempbx) {
472 return 0;
473 }
474
475 if (infoflag & tempax)
476 return 1;
477 }
478 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200479}
480
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200481static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530482 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200483{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530484 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200485
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800486 /* di+0x00 */
487 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530488 sync &= 0xC0;
489 temp = 0x2F;
490 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200491 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200492}
493
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200494static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530495 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200496{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530497 unsigned char data, data1, pushax;
498 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200499
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800500 /* unlock cr0-7 */
501 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530502 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200503 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530505 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200506 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530508 for (i = 0x01; i <= 0x04; i++) {
509 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200510 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530511 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530513 for (i = 0x05; i <= 0x06; i++) {
514 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200515 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530516 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Aaro Koskinen58839b02011-03-13 12:26:23 +0200518 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530519 j &= 0x1F;
520 data = pVBInfo->TimingH[0].data[7];
521 data &= 0xE0;
522 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200523 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530525 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200526 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530527 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200528 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200529 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530530 data1 = data;
531 data1 &= 0xE0;
532 data &= 0x1F;
533 if (data == 0) {
534 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200535 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530536 0x0c);
537 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200538 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530539 data = pushax;
540 }
541 data = data - 1;
542 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200543 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200544 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530545 data = data >> 5;
546 data = data + 3;
547 if (data > 7)
548 data = data - 7;
549 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200550 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530551 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200552}
553
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800554static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
555 unsigned short ModeNo,
556 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200557{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530558 unsigned char data;
559 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530561 for (i = 0x00; i <= 0x01; i++) {
562 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200563 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530564 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200565
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530566 for (i = 0x02; i <= 0x03; i++) {
567 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200568 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530569 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530571 for (i = 0x04; i <= 0x05; i++) {
572 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200573 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530574 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200575
Aaro Koskinen58839b02011-03-13 12:26:23 +0200576 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530577 j &= 0xC0;
578 data = pVBInfo->TimingV[0].data[6];
579 data &= 0x3F;
580 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200581 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200582
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530583 data = pVBInfo->TimingV[0].data[6];
584 data &= 0x80;
585 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530587 if (ModeNo <= 0x13)
588 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
589 else
590 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200591
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530592 i &= DoubleScanMode;
593 if (i)
594 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200595
Aaro Koskinen58839b02011-03-13 12:26:23 +0200596 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530597 j &= 0x5F;
598 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200599 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200600}
601
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200602static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
603 unsigned short RefreshRateTableIndex,
604 struct vb_device_info *pVBInfo,
605 struct xgi_hw_device_info *HwDeviceExtension)
606{
607 unsigned char index, data;
608 unsigned short i;
609
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800610 /* Get index */
611 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200612 index = index & IndexMask;
613
Aaro Koskinen58839b02011-03-13 12:26:23 +0200614 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200615 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200616 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200617
618 for (i = 0; i < 8; i++)
619 pVBInfo->TimingH[0].data[i]
620 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
621
622 for (i = 0; i < 7; i++)
623 pVBInfo->TimingV[0].data[i]
624 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
625
626 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
627
628 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
629
630 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200631 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200632}
633
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200634/* --------------------------------------------------------------------- */
635/* Function : XGI_SetXG21CRTC */
636/* Input : Stand or enhance CRTC table */
637/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
638/* Description : Set LCD timing */
639/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200640static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530641 unsigned short RefreshRateTableIndex,
642 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200643{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530644 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
645 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200646
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530647 if (ModeNo <= 0x13) {
648 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800649 /* CR04 HRS */
650 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
651 /* SR2E [7:0]->HRS */
652 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
653 /* Tempbx: CR05 HRE */
654 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530655 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
656 Tempcx = Tempax;
657 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
658 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
659 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
660 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
661 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800662 /* SR2F [7:2]->HRE */
663 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200664 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200665
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800666 /* Tempax: CR16 VRS */
667 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530668 Tempbx = Tempax; /* Tempbx=Tempax */
669 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200670 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800671
672 /* Tempax: CR7 VRS */
673 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530674 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
675 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
676 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
677 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800678 /* SR34[7:0]: VRS[8:1] */
679 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200680
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800681 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
682 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530683 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
684 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
685 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
686 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200687
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800688 /* CR16 VRE */
689 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530690 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
691 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
692 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
693 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
694 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
695 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
696 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
697 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
698 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
699 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
700 Temp1 >>= 9; /* [10:9]->[1:0] */
701 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
702 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
703 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800704 /* SR3F D[7:2]->VRE D[1:0]->VRS */
705 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530706 } else {
707 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800708 /* Tempax: CR4 HRS */
709 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530710 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800711 /* SR2E[7:0]->HRS */
712 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200713
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530714 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
715 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
716 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
717 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
718 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530720 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
721 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530723 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
724 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
725 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
726 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530728 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
729 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200730
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530731 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
732 if (Tempax < Tempcx) /* HRE < HRS */
733 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530735 Temp2 &= 0xFF;
736 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
737 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
738 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
739 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800740 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
741 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200742 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200743
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800744 /* CR10 VRS */
745 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530746 Tempbx = Tempax; /* Tempbx: VRS */
747 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200748 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800749 /* CR7[2][7] VRE */
750 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530751 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
752 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
753 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
754 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200755 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530757 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
758 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
759 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
760 Tempax &= 0x80;
761 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
762 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800763 /* Tempax: SRA */
764 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530765 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
766 Temp2 = Tempax;
767 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
768 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200769
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800770 /* Tempax: CR11 VRE */
771 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800773 /* Tempbx: SRA */
774 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530775 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
776 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
777 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
778 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
779 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530781 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
782 if (Tempax < Temp3) /* VRE < VRS */
783 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200784
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530785 Temp2 &= 0xFF;
786 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
787 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
788 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
789 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
790 Tempbx = (unsigned char) Temp1;
791 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
792 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800793 /* SR3F D[7:2]->VRE D[1:0]->VRS */
794 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530795 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796}
797
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800798static void XGI_SetXG27CRTC(unsigned short ModeNo,
799 unsigned short ModeIdIndex,
800 unsigned short RefreshRateTableIndex,
801 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200802{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400803 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530805 if (ModeNo <= 0x13) {
806 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800807 /* CR04 HRS */
808 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
809 /* SR2E [7:0]->HRS */
810 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
811 /* Tempbx: CR05 HRE */
812 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530813 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
814 Tempcx = Tempax;
815 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
816 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
817 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
818 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
819 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800820 /* SR2F [7:2]->HRE */
821 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200822 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200823
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800824 /* Tempax: CR10 VRS */
825 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200826 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530827 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800828 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
829 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530830 Tempbx = Tempax; /* Tempbx=CR07 */
831 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
832 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800833 /* SR35 D[0]->VRS D[8] */
834 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530835 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
836 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200837
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800838 /* CR11 VRE */
839 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530840 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
841 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
842 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
843 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
844 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
845 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800846 /* Tempax[7:0]: VRE[7:0] */
847 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530848 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
849 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800850 /* SR3F D[7:2]->VRE D[5:0] */
851 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
852 /* SR35 D[2:1]->VRS[10:9] */
853 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 } else {
855 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800856 /* Tempax: CR4 HRS */
857 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530858 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800859 /* SR2E[7:0]->HRS */
860 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200861
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800862 /* SR0B */
863 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530864 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
865 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530867 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
868 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
869 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530871 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
872 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
873 Tempax <<= 3; /* Tempax[5]: HRE[5] */
874 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530876 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
877 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200878
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800879 /* Tempax: CR4 HRS */
880 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530881 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
882 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
883 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530885 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
886 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
887 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
888 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800889 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
890 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200891 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200892
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800893 /* CR10 VRS */
894 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
895 /* SR34[7:0]->VRS[7:0] */
896 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530898 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800899 /* CR7[7][2] VRS[9][8] */
900 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
902 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
903 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800904 /* SR35[0]: VRS[8] */
905 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530906 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
907 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800908 /* Tempax: SR0A */
909 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530910 Tempax &= 0x08; /* SR0A[3] VRS[10] */
911 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200912
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800913 /* Tempax: CR11 VRE */
914 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530915 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800916 /* Tempbx: SR0A */
917 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530918 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
919 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
920 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
921 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
922 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
923 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530925 if (Tempbx <= Tempcx) /* VRE <= VRS */
926 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200927
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800928 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
929 Tempax = (Tempbx << 2) & 0xFF;
930 /* SR3F[7:2]:VRE[5:0] */
931 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530932 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800933 /* SR35[2:0]:VRS[10:8] */
934 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530935 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200936}
937
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200938static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
939{
940 unsigned char temp;
941
942 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
943 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
944 temp = (temp & 3) << 6;
945 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
946 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
947 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
948 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
949
950}
951
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300952static void xgifb_set_lcd(int chip_id,
953 struct vb_device_info *pVBInfo,
954 unsigned short RefreshRateTableIndex,
955 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200956{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400957 unsigned short Data, Temp, b3CC;
958 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530960 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200961
Aaro Koskinen8104e322011-03-13 12:26:22 +0200962 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
963 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
964 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
965 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300966
967 if (chip_id == XG27) {
968 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
969 if ((Temp & 0x03) == 0) { /* dual 12 */
970 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
971 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
972 }
973 }
974
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530975 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200976 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
977 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
978 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
979 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530980 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200981
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300982 if (chip_id == XG27) {
983 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530984 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300985 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
986 if (Temp & 0x01) {
987 /* 18 bits FP */
988 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
989 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
990 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530991 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200992
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200993 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200994
Aaro Koskinendc505562011-03-13 12:26:26 +0200995 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
996 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200997
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200999 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301000 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001001 /* Hsync polarity */
1002 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301003 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001004 /* Vsync polarity */
1005 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301006 } else {
1007 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1008 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001009 /* Hsync polarity */
1010 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301011 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001012 /* Vsync polarity */
1013 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301014 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001015}
1016
1017/* --------------------------------------------------------------------- */
1018/* Function : XGI_UpdateXG21CRTC */
1019/* Input : */
1020/* Output : CRT1 CRTC */
1021/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1022/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001023static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1024 struct vb_device_info *pVBInfo,
1025 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001026{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301027 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001028
Aaro Koskinendc505562011-03-13 12:26:26 +02001029 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301030 if (ModeNo <= 0x13) {
1031 for (i = 0; i < 12; i++) {
1032 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1033 index = i;
1034 }
1035 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001036 if (ModeNo == 0x2E &&
1037 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1038 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001040 else if (ModeNo == 0x2E &&
1041 (pVBInfo->RefIndex[RefreshRateTableIndex].
1042 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301043 index = 13;
1044 else if (ModeNo == 0x2F)
1045 index = 14;
1046 else if (ModeNo == 0x50)
1047 index = 15;
1048 else if (ModeNo == 0x59)
1049 index = 16;
1050 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001051
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301052 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001053 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301054 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001055 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301056 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001057 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301058 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001059 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301060 pVBInfo->UpdateCRT1[index].CR16);
1061 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001062}
1063
Aaro Koskinen06465962011-11-27 23:03:06 +02001064static unsigned short XGI_GetResInfo(unsigned short ModeNo,
1065 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
1066{
1067 unsigned short resindex;
1068
1069 if (ModeNo <= 0x13)
1070 /* si+St_ResInfo */
1071 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1072 else
1073 /* si+Ext_ResInfo */
1074 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1075 return resindex;
1076}
1077
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001078static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301079 unsigned short ModeNo, unsigned short ModeIdIndex,
1080 unsigned short RefreshRateTableIndex,
1081 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001082{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001083 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301085 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301087 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301089 if (ModeNo <= 0x13) {
1090 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1091 tempax = pVBInfo->StResInfo[resindex].HTotal;
1092 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1093 } else {
1094 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1095 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1096 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1097 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 if (modeflag & HalfDCLK)
1100 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301102 if (ModeNo > 0x13) {
1103 if (modeflag & HalfDCLK)
1104 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301106 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301108 if (temp & InterlaceMode)
1109 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301111 if (modeflag & DoubleScanMode)
1112 tempbx = tempbx << 1;
1113 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301115 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301117 tempax /= tempcx;
1118 tempax -= 1;
1119 tempbx -= 1;
1120 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001121 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1122 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301123 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001124 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1125 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001126 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301127 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001128 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301129 tempax = 0;
1130 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001131
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301132 if (tempbx & 0x01)
1133 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001134
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301135 if (tempbx & 0x02)
1136 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001137
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001138 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001139 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301140 data &= 0xFF;
1141 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301143 if (tempbx & 0x04)
1144 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001145
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001146 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001147 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001148}
1149
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001150static void XGI_SetCRT1Offset(unsigned short ModeNo,
1151 unsigned short ModeIdIndex,
1152 unsigned short RefreshRateTableIndex,
1153 struct xgi_hw_device_info *HwDeviceExtension,
1154 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001155{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301158 /* GetOffset */
1159 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1160 temp = temp >> 8;
1161 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001162
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301163 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1164 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301166 if (temp2)
1167 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301169 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 switch (temp2) {
1172 case 0:
1173 temp2 = 1;
1174 break;
1175 case 1:
1176 temp2 = 2;
1177 break;
1178 case 2:
1179 temp2 = 4;
1180 break;
1181 case 3:
1182 temp2 = 4;
1183 break;
1184 case 4:
1185 temp2 = 6;
1186 break;
1187 case 5:
1188 temp2 = 8;
1189 break;
1190 default:
1191 break;
1192 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001193
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301194 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1195 temp = temp * temp2 + temp2 / 2;
1196 else
1197 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301199 /* SetOffset */
1200 DisplayUnit = temp;
1201 temp2 = temp;
1202 temp = temp >> 8; /* ah */
1203 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001204 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301205 i &= 0xF0;
1206 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001207 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301209 temp = (unsigned char) temp2;
1210 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001211 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001212
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301213 /* SetDisplayUnit */
1214 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1215 temp2 &= InterlaceMode;
1216 if (temp2)
1217 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301219 DisplayUnit = DisplayUnit << 5;
1220 ah = (DisplayUnit & 0xff00) >> 8;
1221 al = DisplayUnit & 0x00ff;
1222 if (al == 0)
1223 ah += 1;
1224 else
1225 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301227 if (HwDeviceExtension->jChipType >= XG20)
1228 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1229 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001230
Aaro Koskinen8104e322011-03-13 12:26:22 +02001231 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001232}
1233
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001234static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1235 unsigned short ModeIdIndex,
1236 unsigned short RefreshRateTableIndex,
1237 struct xgi_hw_device_info *HwDeviceExtension,
1238 struct vb_device_info *pVBInfo)
1239{
Peter Huewe6896b942012-02-09 21:11:46 +01001240 unsigned short LCDXlat1VCLK[4] = { VCLK65_315 + 2,
1241 VCLK65_315 + 2,
1242 VCLK65_315 + 2,
1243 VCLK65_315 + 2 };
1244 unsigned short LCDXlat2VCLK[4] = { VCLK108_2_315 + 5,
1245 VCLK108_2_315 + 5,
1246 VCLK108_2_315 + 5,
1247 VCLK108_2_315 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001248 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Peter Huewe6896b942012-02-09 21:11:46 +01001249 unsigned short LVDSXlat2VCLK[4] = { VCLK65_315 + 2,
1250 VCLK65_315 + 2,
1251 VCLK65_315 + 2,
1252 VCLK65_315 + 2 };
1253 unsigned short LVDSXlat3VCLK[4] = { VCLK65_315 + 2,
1254 VCLK65_315 + 2,
1255 VCLK65_315 + 2,
1256 VCLK65_315 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001257
1258 unsigned short CRT2Index, VCLKIndex;
1259 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001260
1261 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001262 /* si+St_ResInfo */
1263 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001264 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1265 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1266 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001267 /* si+Ext_ResInfo */
1268 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001269 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001270 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1271 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001272 }
1273
1274 if (pVBInfo->IF_DEF_LVDS == 0) {
1275 CRT2Index = CRT2Index >> 6; /* for LCD */
Peter Huewea3d675c2012-02-09 21:11:47 +01001276 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +01001277 if (pVBInfo->LCDResInfo != Panel_1024x768)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001278 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1279 else
1280 VCLKIndex = LCDXlat1VCLK[CRT2Index];
Peter Huewe599801f2012-02-09 21:11:45 +01001281 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001282 if (pVBInfo->SetFlag & RPLLDIV2XO) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001283 VCLKIndex = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001284 VCLKIndex += 25;
1285 } else {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001286 VCLKIndex = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001287 VCLKIndex += 25;
1288 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001289
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001290 if (pVBInfo->SetFlag & TVSimuMode) {
1291 if (modeflag & Charx8Dot) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001292 VCLKIndex = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001293 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001294 } else {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001295 VCLKIndex = TVCLKBASE_315 + HiTVTextVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001296 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001297 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001298 }
1299
1300 /* 301lv */
Peter Huewe6896b942012-02-09 21:11:46 +01001301 if ((pVBInfo->VBType & VB_SIS301LV) &&
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001302 !(pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Peter Huewe6896b942012-02-09 21:11:46 +01001303 if (pVBInfo->VBExtInfo == YPbPr750p)
Peter Huewea3d675c2012-02-09 21:11:47 +01001304 VCLKIndex = XGI_YPbPr750pVCLK;
Peter Huewe6896b942012-02-09 21:11:46 +01001305 else if (pVBInfo->VBExtInfo == YPbPr525p)
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001306 VCLKIndex = YPbPr525pVCLK;
1307 else if (pVBInfo->SetFlag & RPLLDIV2XO)
1308 VCLKIndex = YPbPr525iVCLK_2;
1309 else
1310 VCLKIndex = YPbPr525iVCLK;
1311 }
1312 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
1313 if (pVBInfo->SetFlag & RPLLDIV2XO) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001314 VCLKIndex = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001315 VCLKIndex += 25;
1316 } else {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001317 VCLKIndex = TVCLKBASE_315 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001318 VCLKIndex += 25;
1319 }
1320 } else { /* for CRT2 */
1321 /* Port 3cch */
1322 VCLKIndex = (unsigned char) inb((pVBInfo->P3ca + 0x02));
1323 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1324 if (ModeNo > 0x13) {
1325 /* di+Ext_CRTVCLK */
1326 VCLKIndex = pVBInfo->RefIndex[
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001327 RefreshRateTableIndex].
1328 Ext_CRTVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +02001329 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001330 }
1331 }
1332 } else { /* LVDS */
1333 if (ModeNo <= 0x13)
1334 VCLKIndex = CRT2Index;
1335 else
1336 VCLKIndex = CRT2Index;
1337
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001338 VCLKIndex = VCLKIndex >> 6;
Peter Huewe255aabd2012-02-09 21:11:44 +01001339 if ((pVBInfo->LCDResInfo == Panel_800x600) ||
1340 (pVBInfo->LCDResInfo == Panel_320x480))
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001341 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
Peter Huewe255aabd2012-02-09 21:11:44 +01001342 else if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1343 (pVBInfo->LCDResInfo == Panel_1024x768x75))
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001344 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1345 else
1346 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001347 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001348
1349 return VCLKIndex;
1350}
1351
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001352static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1353 unsigned short ModeIdIndex,
1354 struct xgi_hw_device_info *HwDeviceExtension,
1355 unsigned short RefreshRateTableIndex,
1356 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001357{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001358 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301359 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001360
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301361 if (pVBInfo->IF_DEF_LVDS == 1) {
1362 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001363 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001364 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1365 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301366 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001367 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301368 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001369 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +01001370 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1371 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01001372 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301373 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1374 RefreshRateTableIndex, HwDeviceExtension,
1375 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001376 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001377 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301378 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001379 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301380 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001381 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1382 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301383 } else {
1384 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001385 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001386 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1387 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301388 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001389 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301390 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001391 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301392 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301394 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001395 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1396 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001397 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001398 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001399 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301400 index = data;
1401 index &= 0xE0;
1402 data &= 0x1F;
1403 data = data << 1;
1404 data += 1;
1405 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001406 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301407 }
1408 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001409}
1410
Aaro Koskinene85f2032011-11-27 23:03:07 +02001411static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1412{
1413 unsigned char temp;
1414
1415 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1416 temp = (temp & 1) << 6;
1417 /* SR06[6] 18bit Dither */
1418 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1419 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1420 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1421
1422}
1423
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001424static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301425 struct xgi_hw_device_info *HwDeviceExtension,
1426 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001427{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301428 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001429
Aaro Koskinen58839b02011-03-13 12:26:23 +02001430 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301431 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001432 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301434 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001435 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001436 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301437 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001438 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001439 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301440 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001441 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301442 } else {
1443 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001444 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001445 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301446 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001447 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301448 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001449 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001450 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301451 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001452 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301453 }
1454 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301456 if (HwDeviceExtension->jChipType == XG21)
1457 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001458}
1459
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001460static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1461 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1462 struct vb_device_info *pVBInfo)
1463{
1464 unsigned short data, data2 = 0;
1465 short VCLK;
1466
1467 unsigned char index;
1468
1469 if (ModeNo <= 0x13)
1470 VCLK = 0;
1471 else {
1472 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1473 index &= IndexMask;
1474 VCLK = pVBInfo->VCLKData[index].CLOCK;
1475 }
1476
Aaro Koskinen58839b02011-03-13 12:26:23 +02001477 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001478 data &= 0xf3;
1479 if (VCLK >= 200)
1480 data |= 0x0c; /* VCLK > 200 */
1481
1482 if (HwDeviceExtension->jChipType >= XG20)
1483 data &= ~0x04; /* 2 pixel mode */
1484
Aaro Koskinen8104e322011-03-13 12:26:22 +02001485 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001486
1487 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001488 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001489 data &= 0xE7;
1490 if (VCLK < 200)
1491 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001492 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001493 }
1494
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001495 data2 = 0x00;
1496
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001497 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001498 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001499 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001500
1501}
1502
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001503static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301504 unsigned short ModeNo, unsigned short ModeIdIndex,
1505 unsigned short RefreshRateTableIndex,
1506 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001507{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301508 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1509 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001510
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301511 if (ModeNo > 0x13) {
1512 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001513 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1514 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301515 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001516 /* si+St_ModeFlag */
1517 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001518
Aaro Koskinen58839b02011-03-13 12:26:23 +02001519 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001520 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301522 if (ModeNo > 0x13)
1523 data = infoflag;
1524 else
1525 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301527 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001528
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301529 if (ModeNo > 0x13) {
1530 if (pVBInfo->ModeType > 0x02) {
1531 data2 |= 0x02;
1532 data3 = pVBInfo->ModeType - ModeVGA;
1533 data3 = data3 << 2;
1534 data2 |= data3;
1535 }
1536 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001537
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301538 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301540 if (data)
1541 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001542
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001543 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301544 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1545 if (ModeNo <= 0x13)
1546 xres = pVBInfo->StResInfo[resindex].HTotal;
1547 else
1548 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001549
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301550 data = 0x0000;
1551 if (infoflag & InterlaceMode) {
1552 if (xres == 1024)
1553 data = 0x0035;
1554 else if (xres == 1280)
1555 data = 0x0048;
1556 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001557
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301558 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001559 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301560 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001561 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001562
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301563 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001564 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001565
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301566 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301568 if (modeflag & LineCompareOff)
1569 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301571 if (ModeNo > 0x13) {
1572 if (pVBInfo->ModeType == ModeEGA)
1573 data2 |= 0x40;
1574 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001575
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001576 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301577 data = 0x60;
1578 if (pVBInfo->ModeType != ModeText) {
1579 data = data ^ 0x60;
1580 if (pVBInfo->ModeType != ModeEGA)
1581 data = data ^ 0xA0;
1582 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001583 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301585 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1586 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001587
Aaro Koskinen58839b02011-03-13 12:26:23 +02001588 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001589
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301590 if (HwDeviceExtension->jChipType == XG27) {
1591 if (data & 0x40)
1592 data = 0x2c;
1593 else
1594 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001595 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001596 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301597 } else if (HwDeviceExtension->jChipType >= XG20) {
1598 if (data & 0x40)
1599 data = 0x33;
1600 else
1601 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001602 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1603 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301604 } else {
1605 if (data & 0x40)
1606 data = 0x2c;
1607 else
1608 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001609 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301610 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001611
1612}
1613
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001614static void XGI_WriteDAC(unsigned short dl,
1615 unsigned short ah,
1616 unsigned short al,
1617 unsigned short dh,
1618 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001619{
1620 unsigned short temp, bh, bl;
1621
1622 bh = ah;
1623 bl = al;
1624
1625 if (dl != 0) {
1626 temp = bh;
1627 bh = dh;
1628 dh = temp;
1629 if (dl == 1) {
1630 temp = bl;
1631 bl = dh;
1632 dh = temp;
1633 } else {
1634 temp = bl;
1635 bl = bh;
1636 bh = temp;
1637 }
1638 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001639 outb((unsigned short) dh, pVBInfo->P3c9);
1640 outb((unsigned short) bh, pVBInfo->P3c9);
1641 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001642}
1643
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001644static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301645 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001646{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301647 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
Aaro Koskinen624554d2011-10-11 21:47:35 +03001648 ah, dh;
1649 const unsigned short *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301651 if (ModeNo <= 0x13)
1652 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1653 else
1654 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001655
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301656 data &= DACInfoFlag;
1657 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001658
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301659 if (data == 0x00)
1660 table = XGINew_MDA_DAC;
1661 else if (data == 0x08)
1662 table = XGINew_CGA_DAC;
1663 else if (data == 0x10)
1664 table = XGINew_EGA_DAC;
1665 else if (data == 0x18) {
1666 time = 256;
1667 table = XGINew_VGA_DAC;
1668 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001669
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301670 if (time == 256)
1671 j = 16;
1672 else
1673 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001674
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001675 outb(0xFF, pVBInfo->P3c6);
1676 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001677
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301678 for (i = 0; i < j; i++) {
1679 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301681 for (k = 0; k < 3; k++) {
1682 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301684 if (data & 0x01)
1685 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301687 if (data & 0x02)
1688 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001689
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001690 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301691 data = data >> 2;
1692 }
1693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301695 if (time == 256) {
1696 for (i = 16; i < 32; i++) {
1697 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301699 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001700 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301701 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301703 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301705 for (m = 0; m < 9; m++) {
1706 di = si;
1707 bx = si + 0x04;
1708 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001709
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301710 for (n = 0; n < 3; n++) {
1711 for (o = 0; o < 5; o++) {
1712 dh = table[si];
1713 ah = table[di];
1714 al = table[bx];
1715 si++;
1716 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1717 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301719 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301721 for (o = 0; o < 3; o++) {
1722 dh = table[bx];
1723 ah = table[di];
1724 al = table[si];
1725 si--;
1726 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1727 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001728
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301729 dl++;
1730 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301732 si += 5;
1733 }
1734 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001735}
1736
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001737static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1738 unsigned short ModeIdIndex,
1739 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001740{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301741 unsigned short resindex, xres, yres, modeflag;
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 modeflag = 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 modeflag = 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)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001751 /* si+St_ResInfo */
1752 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301753 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001754 /* si+Ext_ResInfo */
1755 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301757 if (ModeNo <= 0x13) {
1758 xres = pVBInfo->StResInfo[resindex].HTotal;
1759 yres = pVBInfo->StResInfo[resindex].VTotal;
1760 } else {
1761 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1762 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1763 }
1764 if (ModeNo > 0x13) {
1765 if (modeflag & HalfDCLK)
1766 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001767
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301768 if (modeflag & DoubleScanMode)
1769 yres = yres << 1;
1770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301772 if (xres == 720)
1773 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301775 pVBInfo->VGAHDE = xres;
1776 pVBInfo->HDE = xres;
1777 pVBInfo->VGAVDE = yres;
1778 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001779}
1780
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001781static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1782 unsigned short ModeIdIndex,
1783 unsigned short RefreshRateTableIndex,
1784 struct vb_device_info *pVBInfo)
1785{
1786 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1787
1788 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1789
1790 tempbx = BX;
1791
1792 if (ModeNo <= 0x13) {
1793 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1794 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1795 } else {
1796 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1797 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1798 }
1799
1800 tempal = tempal & 0x0f;
1801
1802 if (tempbx <= 1) { /* ExpLink */
1803 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001804 /* find no Ext_CRT2CRTC2 */
1805 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001806 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001807 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1808 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001809 }
1810
Peter Huewea3d675c2012-02-09 21:11:47 +01001811 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001812 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001813 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1814 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001815 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001816 tempal = pVBInfo->RefIndex[
1817 RefreshRateTableIndex].
1818 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001819 }
1820
1821 if (tempbx & 0x01)
1822 tempal = (tempal >> 4);
1823
1824 tempal = (tempal & 0x0f);
1825 }
1826
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02001827 tempcx = LCDLenList[tempbx];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001828
1829 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1830 if ((tempbx == 5) || (tempbx) == 7)
1831 tempcx = LCDDesDataLen2;
1832 else if ((tempbx == 3) || (tempbx == 8))
1833 tempcx = LVDSDesDataLen2;
1834 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001835
1836 switch (tempbx) {
1837 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001838 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001839 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001840 break;
1841 case 2:
1842 tempdi = XGI_EPLLCDDataPtr;
1843 break;
1844 case 3:
1845 tempdi = XGI_EPLLCDDesDataPtr;
1846 break;
1847 case 4:
1848 tempdi = XGI_LCDDataTable;
1849 break;
1850 case 5:
1851 tempdi = XGI_LCDDesDataTable;
1852 break;
1853 case 6:
1854 tempdi = XGI_EPLCHLCDRegPtr;
1855 break;
1856 case 7:
1857 case 8:
1858 case 9:
1859 tempdi = NULL;
1860 break;
1861 default:
1862 break;
1863 }
1864
1865 if (tempdi == NULL) /* OEMUtil */
1866 return NULL;
1867
1868 table = tempbx;
1869 i = 0;
1870
1871 while (tempdi[i].PANELID != 0xff) {
1872 tempdx = pVBInfo->LCDResInfo;
1873 if (tempbx & 0x0080) { /* OEMUtil */
1874 tempbx &= (~0x0080);
1875 tempdx = pVBInfo->LCDTypeInfo;
1876 }
1877
1878 if (pVBInfo->LCDInfo & EnableScalingLCD)
1879 tempdx &= (~PanelResInfo);
1880
1881 if (tempdi[i].PANELID == tempdx) {
1882 tempbx = tempdi[i].MASK;
1883 tempdx = pVBInfo->LCDInfo;
1884
1885 if (ModeNo <= 0x13) /* alan 09/10/2003 */
1886 tempdx |= SetLCDStdMode;
1887
1888 if (modeflag & HalfDCLK)
1889 tempdx |= SetLCDLowResolution;
1890
1891 tempbx &= tempdx;
1892 if (tempbx == tempdi[i].CAP)
1893 break;
1894 }
1895 i++;
1896 }
1897
1898 if (table == 0) {
1899 switch (tempdi[i].DATAPTR) {
1900 case 0:
1901 return &XGI_LVDSCRT11024x768_1_H[tempal];
1902 break;
1903 case 1:
1904 return &XGI_LVDSCRT11024x768_2_H[tempal];
1905 break;
1906 case 2:
1907 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1908 break;
1909 case 3:
1910 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1911 break;
1912 case 4:
1913 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1914 break;
1915 case 5:
1916 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1917 break;
1918 case 6:
1919 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1920 break;
1921 case 7:
1922 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1923 break;
1924 case 8:
1925 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1926 break;
1927 case 9:
1928 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1929 break;
1930 case 10:
1931 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1932 break;
1933 default:
1934 break;
1935 }
1936 } else if (table == 1) {
1937 switch (tempdi[i].DATAPTR) {
1938 case 0:
1939 return &XGI_LVDSCRT11024x768_1_V[tempal];
1940 break;
1941 case 1:
1942 return &XGI_LVDSCRT11024x768_2_V[tempal];
1943 break;
1944 case 2:
1945 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1946 break;
1947 case 3:
1948 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1949 break;
1950 case 4:
1951 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1952 break;
1953 case 5:
1954 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1955 break;
1956 case 6:
1957 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1958 break;
1959 case 7:
1960 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1961 break;
1962 case 8:
1963 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1964 break;
1965 case 9:
1966 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1967 break;
1968 case 10:
1969 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1970 break;
1971 default:
1972 break;
1973 }
1974 } else if (table == 2) {
1975 switch (tempdi[i].DATAPTR) {
1976 case 0:
1977 return &XGI_LVDS1024x768Data_1[tempal];
1978 break;
1979 case 1:
1980 return &XGI_LVDS1024x768Data_2[tempal];
1981 break;
1982 case 2:
1983 return &XGI_LVDS1280x1024Data_1[tempal];
1984 break;
1985 case 3:
1986 return &XGI_LVDS1280x1024Data_2[tempal];
1987 break;
1988 case 4:
1989 return &XGI_LVDS1400x1050Data_1[tempal];
1990 break;
1991 case 5:
1992 return &XGI_LVDS1400x1050Data_2[tempal];
1993 break;
1994 case 6:
1995 return &XGI_LVDS1600x1200Data_1[tempal];
1996 break;
1997 case 7:
1998 return &XGI_LVDSNoScalingData[tempal];
1999 break;
2000 case 8:
2001 return &XGI_LVDS1024x768Data_1x75[tempal];
2002 break;
2003 case 9:
2004 return &XGI_LVDS1024x768Data_2x75[tempal];
2005 break;
2006 case 10:
2007 return &XGI_LVDS1280x1024Data_1x75[tempal];
2008 break;
2009 case 11:
2010 return &XGI_LVDS1280x1024Data_2x75[tempal];
2011 break;
2012 case 12:
2013 return &XGI_LVDSNoScalingDatax75[tempal];
2014 break;
2015 default:
2016 break;
2017 }
2018 } else if (table == 3) {
2019 switch (tempdi[i].DATAPTR) {
2020 case 0:
2021 return &XGI_LVDS1024x768Des_1[tempal];
2022 break;
2023 case 1:
2024 return &XGI_LVDS1024x768Des_3[tempal];
2025 break;
2026 case 2:
2027 return &XGI_LVDS1024x768Des_2[tempal];
2028 break;
2029 case 3:
2030 return &XGI_LVDS1280x1024Des_1[tempal];
2031 break;
2032 case 4:
2033 return &XGI_LVDS1280x1024Des_2[tempal];
2034 break;
2035 case 5:
2036 return &XGI_LVDS1400x1050Des_1[tempal];
2037 break;
2038 case 6:
2039 return &XGI_LVDS1400x1050Des_2[tempal];
2040 break;
2041 case 7:
2042 return &XGI_LVDS1600x1200Des_1[tempal];
2043 break;
2044 case 8:
2045 return &XGI_LVDSNoScalingDesData[tempal];
2046 break;
2047 case 9:
2048 return &XGI_LVDS1024x768Des_1x75[tempal];
2049 break;
2050 case 10:
2051 return &XGI_LVDS1024x768Des_3x75[tempal];
2052 break;
2053 case 11:
2054 return &XGI_LVDS1024x768Des_2x75[tempal];
2055 break;
2056 case 12:
2057 return &XGI_LVDS1280x1024Des_1x75[tempal];
2058 break;
2059 case 13:
2060 return &XGI_LVDS1280x1024Des_2x75[tempal];
2061 break;
2062 case 14:
2063 return &XGI_LVDSNoScalingDesDatax75[tempal];
2064 break;
2065 default:
2066 break;
2067 }
2068 } else if (table == 4) {
2069 switch (tempdi[i].DATAPTR) {
2070 case 0:
2071 return &XGI_ExtLCD1024x768Data[tempal];
2072 break;
2073 case 1:
2074 return &XGI_StLCD1024x768Data[tempal];
2075 break;
2076 case 2:
2077 return &XGI_CetLCD1024x768Data[tempal];
2078 break;
2079 case 3:
2080 return &XGI_ExtLCD1280x1024Data[tempal];
2081 break;
2082 case 4:
2083 return &XGI_StLCD1280x1024Data[tempal];
2084 break;
2085 case 5:
2086 return &XGI_CetLCD1280x1024Data[tempal];
2087 break;
2088 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002089 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002090 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002091 break;
2092 case 8:
2093 return &XGI_CetLCD1400x1050Data[tempal];
2094 break;
2095 case 9:
2096 return &XGI_ExtLCD1600x1200Data[tempal];
2097 break;
2098 case 10:
2099 return &XGI_StLCD1600x1200Data[tempal];
2100 break;
2101 case 11:
2102 return &XGI_NoScalingData[tempal];
2103 break;
2104 case 12:
2105 return &XGI_ExtLCD1024x768x75Data[tempal];
2106 break;
2107 case 13:
2108 return &XGI_ExtLCD1024x768x75Data[tempal];
2109 break;
2110 case 14:
2111 return &XGI_CetLCD1024x768x75Data[tempal];
2112 break;
2113 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002114 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002115 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002116 break;
2117 case 17:
2118 return &XGI_CetLCD1280x1024x75Data[tempal];
2119 break;
2120 case 18:
2121 return &XGI_NoScalingDatax75[tempal];
2122 break;
2123 default:
2124 break;
2125 }
2126 } else if (table == 5) {
2127 switch (tempdi[i].DATAPTR) {
2128 case 0:
2129 return &XGI_ExtLCDDes1024x768Data[tempal];
2130 break;
2131 case 1:
2132 return &XGI_StLCDDes1024x768Data[tempal];
2133 break;
2134 case 2:
2135 return &XGI_CetLCDDes1024x768Data[tempal];
2136 break;
2137 case 3:
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_ExtLCDDLDes1280x1024Data[tempal];
2141 else
2142 return &XGI_ExtLCDDes1280x1024Data[tempal];
2143 break;
2144 case 4:
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_StLCDDLDes1280x1024Data[tempal];
2148 else
2149 return &XGI_StLCDDes1280x1024Data[tempal];
2150 break;
2151 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01002152 if ((pVBInfo->VBType & VB_SIS301LV) ||
2153 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002154 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2155 else
2156 return &XGI_CetLCDDes1280x1024Data[tempal];
2157 break;
2158 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002159 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01002160 if ((pVBInfo->VBType & VB_SIS301LV) ||
2161 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002162 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002163 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002164 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002165 break;
2166 case 8:
2167 return &XGI_CetLCDDes1400x1050Data[tempal];
2168 break;
2169 case 9:
2170 return &XGI_CetLCDDes1400x1050Data2[tempal];
2171 break;
2172 case 10:
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_ExtLCDDLDes1600x1200Data[tempal];
2176 else
2177 return &XGI_ExtLCDDes1600x1200Data[tempal];
2178 break;
2179 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01002180 if ((pVBInfo->VBType & VB_SIS301LV) ||
2181 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002182 return &XGI_StLCDDLDes1600x1200Data[tempal];
2183 else
2184 return &XGI_StLCDDes1600x1200Data[tempal];
2185 break;
2186 case 12:
2187 return &XGI_NoScalingDesData[tempal];
2188 break;
2189 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002190 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002191 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002192 break;
2193 case 15:
2194 return &XGI_CetLCDDes1024x768x75Data[tempal];
2195 break;
2196 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002197 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01002198 if ((pVBInfo->VBType & VB_SIS301LV) ||
2199 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002200 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002201 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002202 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002203 break;
2204 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01002205 if ((pVBInfo->VBType & VB_SIS301LV) ||
2206 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002207 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2208 else
2209 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2210 break;
2211 case 19:
2212 return &XGI_NoScalingDesDatax75[tempal];
2213 break;
2214 default:
2215 break;
2216 }
2217 } else if (table == 6) {
2218 switch (tempdi[i].DATAPTR) {
2219 case 0:
2220 return &XGI_CH7017LV1024x768[tempal];
2221 break;
2222 case 1:
2223 return &XGI_CH7017LV1400x1050[tempal];
2224 break;
2225 default:
2226 break;
2227 }
2228 }
2229 return NULL;
2230}
2231
2232static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2233 unsigned short ModeIdIndex,
2234 unsigned short RefreshRateTableIndex,
2235 struct vb_device_info *pVBInfo)
2236{
2237 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2238 struct XGI330_TVDataTablStruct *tempdi = NULL;
2239
2240 tempbx = BX;
2241
2242 if (ModeNo <= 0x13) {
2243 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2244 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2245 } else {
2246 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2247 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2248 }
2249
2250 tempal = tempal & 0x3f;
2251 table = tempbx;
2252
2253 switch (tempbx) {
2254 case 0:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02002255 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002256 break;
2257 case 1:
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02002258 tempdi = NULL;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002259 break;
2260 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03002261 case 6:
2262 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002263 break;
2264 case 3:
2265 tempdi = NULL;
2266 break;
2267 case 4:
2268 tempdi = XGI_TVDataTable;
2269 break;
2270 case 5:
2271 tempdi = NULL;
2272 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002273 default:
2274 break;
2275 }
2276
2277 if (tempdi == NULL) /* OEMUtil */
2278 return NULL;
2279
2280 tempdx = pVBInfo->TVInfo;
2281
2282 if (pVBInfo->VBInfo & SetInSlaveMode)
2283 tempdx = tempdx | SetTVLockMode;
2284
2285 if (modeflag & HalfDCLK)
2286 tempdx = tempdx | SetTVLowResolution;
2287
2288 i = 0;
2289
2290 while (tempdi[i].MASK != 0xffff) {
2291 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2292 break;
2293 i++;
2294 }
2295
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002296 /* 07/05/22 */
Aaro Koskinenebe33022011-11-27 23:03:18 +02002297 if (table == 0x04) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002298 switch (tempdi[i].DATAPTR) {
2299 case 0:
2300 return &XGI_ExtPALData[tempal];
2301 break;
2302 case 1:
2303 return &XGI_ExtNTSCData[tempal];
2304 break;
2305 case 2:
2306 return &XGI_StPALData[tempal];
2307 break;
2308 case 3:
2309 return &XGI_StNTSCData[tempal];
2310 break;
2311 case 4:
2312 return &XGI_ExtHiTVData[tempal];
2313 break;
2314 case 5:
2315 return &XGI_St2HiTVData[tempal];
2316 break;
2317 case 6:
2318 return &XGI_ExtYPbPr525iData[tempal];
2319 break;
2320 case 7:
2321 return &XGI_ExtYPbPr525pData[tempal];
2322 break;
2323 case 8:
2324 return &XGI_ExtYPbPr750pData[tempal];
2325 break;
2326 case 9:
2327 return &XGI_StYPbPr525iData[tempal];
2328 break;
2329 case 10:
2330 return &XGI_StYPbPr525pData[tempal];
2331 break;
2332 case 11:
2333 return &XGI_StYPbPr750pData[tempal];
2334 break;
2335 case 12: /* avoid system hang */
2336 return &XGI_ExtNTSCData[tempal];
2337 break;
2338 case 13:
2339 return &XGI_St1HiTVData[tempal];
2340 break;
2341 default:
2342 break;
2343 }
2344 } else if (table == 0x02) {
2345 switch (tempdi[i].DATAPTR) {
2346 case 0:
2347 return &XGI_CHTVUNTSCData[tempal];
2348 break;
2349 case 1:
2350 return &XGI_CHTVONTSCData[tempal];
2351 break;
2352 case 2:
2353 return &XGI_CHTVUPALData[tempal];
2354 break;
2355 case 3:
2356 return &XGI_CHTVOPALData[tempal];
2357 break;
2358 default:
2359 break;
2360 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002361 }
2362 return NULL;
2363}
2364
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002365static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302366 unsigned short RefreshRateTableIndex,
2367 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002368{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302369 unsigned short tempbx;
2370 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002371
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302372 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002373
Peter Huewea3d675c2012-02-09 21:11:47 +01002374 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302375 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2376 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2377 pVBInfo);
2378 pVBInfo->VGAHT = LCDPtr->VGAHT;
2379 pVBInfo->VGAVT = LCDPtr->VGAVT;
2380 pVBInfo->HT = LCDPtr->LCDHT;
2381 pVBInfo->VT = LCDPtr->LCDVT;
2382 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002383
Peter Huewea3d675c2012-02-09 21:11:47 +01002384 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302385 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2386 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002387 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2388 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302389 pVBInfo->HDE = 1024;
2390 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002391 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2392 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302393 pVBInfo->HDE = 1280;
2394 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002395 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302396 pVBInfo->HDE = 1400;
2397 pVBInfo->VDE = 1050;
2398 } else {
2399 pVBInfo->HDE = 1600;
2400 pVBInfo->VDE = 1200;
2401 }
2402 }
2403 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002404}
2405
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002406static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302407 unsigned short RefreshRateTableIndex,
2408 struct xgi_hw_device_info *HwDeviceExtension,
2409 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002410{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302411 unsigned char index;
2412 unsigned short tempbx, i;
2413 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2414 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002415
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302416 if (ModeNo <= 0x13)
2417 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2418 else
2419 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002420
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302421 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002422
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002423 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002424
Peter Huewea3d675c2012-02-09 21:11:47 +01002425 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002426 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2427 XGI_GetLcdPtr(tempbx, ModeNo,
2428 ModeIdIndex,
2429 RefreshRateTableIndex,
2430 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002431
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002432 for (i = 0; i < 8; i++)
2433 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302434 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002435
2436 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
2437
2438 tempbx = 1;
2439
Peter Huewea3d675c2012-02-09 21:11:47 +01002440 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002441 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2442 XGI_GetLcdPtr(
2443 tempbx,
2444 ModeNo,
2445 ModeIdIndex,
2446 RefreshRateTableIndex,
2447 pVBInfo);
2448 for (i = 0; i < 7; i++)
2449 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2450 }
2451
2452 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002453}
2454
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002455static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2456{
2457 unsigned char tempal, tempah, tempbl, i;
2458
Aaro Koskinen58839b02011-03-13 12:26:23 +02002459 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002460 tempal = tempah & 0x0F;
2461 tempah = tempah & 0xF0;
2462 i = 0;
2463 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2464
2465 while (tempbl != 0xFF) {
2466 if (tempbl & 0x80) { /* OEMUtil */
2467 tempal = tempah;
2468 tempbl = tempbl & ~(0x80);
2469 }
2470
2471 if (tempal == tempbl)
2472 break;
2473
2474 i++;
2475
2476 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2477 }
2478
2479 return i;
2480}
2481
2482static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2483{
2484 unsigned short tempah, tempal, tempbl, i;
2485
2486 tempal = pVBInfo->LCDResInfo;
2487 tempah = pVBInfo->LCDTypeInfo;
2488
2489 i = 0;
2490 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2491
2492 while (tempbl != 0xFF) {
2493 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2494 tempal = tempah;
2495 tempbl &= ~0x80;
2496 }
2497
2498 if (tempal == tempbl)
2499 break;
2500
2501 i++;
2502 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2503 }
2504
2505 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002506 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002507 pVBInfo->LCDTypeInfo = 0;
2508 i = 0;
2509 }
2510
2511 return i;
2512}
2513
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002514static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2515 unsigned short *VSyncWidth,
2516 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002517{
2518 unsigned short Index;
2519
2520 Index = XGI_GetLCDCapPtr(pVBInfo);
2521 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2522 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2523
2524 return;
2525}
2526
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002527static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302528 unsigned short RefreshRateTableIndex,
2529 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302531 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2532 unsigned long temp, temp1, temp2, temp3, push3;
2533 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2534 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002535
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302536 if (ModeNo > 0x13)
2537 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2538 else
2539 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002540
Aaro Koskinen66cface2011-08-31 21:46:13 +03002541 tempbx = 3;
2542 if (pVBInfo->LCDInfo & EnableScalingLCD)
2543 LCDPtr1 =
2544 (struct XGI330_LCDDataDesStruct2 *)
2545 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002546 tempbx,
2547 ModeNo,
2548 ModeIdIndex,
2549 RefreshRateTableIndex,
2550 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002551 else
2552 LCDPtr =
2553 (struct XGI330_LCDDataDesStruct *)
2554 XGI_GetLcdPtr(
2555 tempbx,
2556 ModeNo,
2557 ModeIdIndex,
2558 RefreshRateTableIndex,
2559 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002560
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002561 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2562 push1 = tempbx;
2563 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002564
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002565 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01002566 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
2567 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002568 tempax = 1024;
2569 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002570 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
2571 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002572 tempax = 1280;
2573 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002574 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002575 tempax = 1400;
2576 tempbx = 1050;
2577 } else {
2578 tempax = 1600;
2579 tempbx = 1200;
2580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002581
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002582 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2583 pVBInfo->HDE = tempax;
2584 pVBInfo->VDE = tempbx;
2585 pVBInfo->VGAHDE = tempax;
2586 pVBInfo->VGAVDE = tempbx;
2587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002588
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002589 tempax = pVBInfo->HT;
2590
2591 if (pVBInfo->LCDInfo & EnableScalingLCD)
2592 tempbx = LCDPtr1->LCDHDES;
2593 else
2594 tempbx = LCDPtr->LCDHDES;
2595
2596 tempcx = pVBInfo->HDE;
2597 tempbx = tempbx & 0x0fff;
2598 tempcx += tempbx;
2599
2600 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002601 tempcx -= tempax;
2602
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002603 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002604
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002605 tempcx = tempcx >> 3;
2606 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002607
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002608 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2609 (unsigned short) (tempbx & 0xff));
2610 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2611 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002612
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002613 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002614
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002615 if (pVBInfo->LCDInfo & EnableScalingLCD)
2616 tempbx = LCDPtr1->LCDHRS;
2617 else
2618 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002619
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002620 tempcx = push2;
2621
2622 if (pVBInfo->LCDInfo & EnableScalingLCD)
2623 tempcx = LCDPtr1->LCDHSync;
2624
2625 tempcx += tempbx;
2626
2627 if (tempcx >= tempax)
2628 tempcx -= tempax;
2629
2630 tempax = tempbx & 0x07;
2631 tempax = tempax >> 5;
2632 tempcx = tempcx >> 3;
2633 tempbx = tempbx >> 3;
2634
2635 tempcx &= 0x1f;
2636 tempax |= tempcx;
2637
2638 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2639 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2640 (unsigned short) (tempbx & 0xff));
2641
2642 tempax = pVBInfo->VT;
2643 if (pVBInfo->LCDInfo & EnableScalingLCD)
2644 tempbx = LCDPtr1->LCDVDES;
2645 else
2646 tempbx = LCDPtr->LCDVDES;
2647 tempcx = pVBInfo->VDE;
2648
2649 tempbx = tempbx & 0x0fff;
2650 tempcx += tempbx;
2651 if (tempcx >= tempax)
2652 tempcx -= tempax;
2653
2654 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2655 (unsigned short) (tempbx & 0xff));
2656 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2657 (unsigned short) (tempcx & 0xff));
2658
2659 tempbx = (tempbx >> 8) & 0x07;
2660 tempcx = (tempcx >> 8) & 0x07;
2661
2662 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2663 (unsigned short) ((tempcx << 3)
2664 | tempbx));
2665
2666 tempax = pVBInfo->VT;
2667 if (pVBInfo->LCDInfo & EnableScalingLCD)
2668 tempbx = LCDPtr1->LCDVRS;
2669 else
2670 tempbx = LCDPtr->LCDVRS;
2671
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002672 tempcx = push1;
2673
2674 if (pVBInfo->LCDInfo & EnableScalingLCD)
2675 tempcx = LCDPtr1->LCDVSync;
2676
2677 tempcx += tempbx;
2678 if (tempcx >= tempax)
2679 tempcx -= tempax;
2680
2681 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2682 (unsigned short) (tempbx & 0xff));
2683 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2684 (unsigned short) (tempcx & 0x0f));
2685
2686 tempax = ((tempbx >> 8) & 0x07) << 3;
2687
2688 tempbx = pVBInfo->VGAVDE;
2689 if (tempbx != pVBInfo->VDE)
2690 tempax |= 0x40;
2691
Peter Huewea3d675c2012-02-09 21:11:47 +01002692 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002693 tempax |= 0x40;
2694
2695 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2696 tempax);
2697
2698 tempcx = pVBInfo->VGAVT;
2699 tempbx = pVBInfo->VDE;
2700 tempax = pVBInfo->VGAVDE;
2701 tempcx -= tempax;
2702
2703 temp = tempax; /* 0430 ylshieh */
2704 temp1 = (temp << 18) / tempbx;
2705
2706 tempdx = (unsigned short) ((temp << 18) % tempbx);
2707
2708 if (tempdx != 0)
2709 temp1 += 1;
2710
2711 temp2 = temp1;
2712 push3 = temp2;
2713
2714 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2715 (unsigned short) (temp2 & 0xff));
2716 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2717 (unsigned short) ((temp2 >> 8) & 0xff));
2718
2719 tempbx = (unsigned short) (temp2 >> 16);
2720 tempax = tempbx & 0x03;
2721
2722 tempbx = pVBInfo->VGAVDE;
2723 if (tempbx == pVBInfo->VDE)
2724 tempax |= 0x04;
2725
2726 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2727
2728 if (pVBInfo->VBType & VB_XGI301C) {
2729 temp2 = push3;
2730 xgifb_reg_set(pVBInfo->Part4Port,
2731 0x3c,
2732 (unsigned short) (temp2 & 0xff));
2733 xgifb_reg_set(pVBInfo->Part4Port,
2734 0x3b,
2735 (unsigned short) ((temp2 >> 8) &
2736 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002737 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002738 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2739 ~0xc0,
2740 (unsigned short) ((tempbx &
2741 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002742
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002743 tempcx = pVBInfo->VGAVDE;
2744 if (tempcx == pVBInfo->VDE)
2745 xgifb_reg_and_or(pVBInfo->Part4Port,
2746 0x30, ~0x0c, 0x00);
2747 else
2748 xgifb_reg_and_or(pVBInfo->Part4Port,
2749 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302750 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002751
2752 tempcx = pVBInfo->VGAHDE;
2753 tempbx = pVBInfo->HDE;
2754
2755 temp1 = tempcx << 16;
2756
2757 tempax = (unsigned short) (temp1 / tempbx);
2758
2759 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2760 tempax = 65535;
2761
2762 temp3 = tempax;
2763 temp1 = pVBInfo->VGAHDE << 16;
2764
2765 temp1 /= temp3;
2766 temp3 = temp3 << 16;
2767 temp1 -= 1;
2768
2769 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2770
2771 tempax = (unsigned short) (temp3 & 0xff);
2772 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2773
2774 temp1 = pVBInfo->VGAVDE << 18;
2775 temp1 = temp1 / push3;
2776 tempbx = (unsigned short) (temp1 & 0xffff);
2777
Peter Huewe255aabd2012-02-09 21:11:44 +01002778 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002779 tempbx -= 1;
2780
2781 tempax = ((tempbx >> 8) & 0xff) << 3;
2782 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2783 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2784 (unsigned short) (tempax & 0xff));
2785 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2786 (unsigned short) (tempbx & 0xff));
2787
2788 temp3 = temp3 >> 16;
2789
2790 if (modeflag & HalfDCLK)
2791 temp3 = temp3 >> 1;
2792
2793 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2794 (unsigned short) ((temp3 >> 8) & 0xff));
2795 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2796 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797}
2798
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002799/* --------------------------------------------------------------------- */
2800/* Function : XGI_GETLCDVCLKPtr */
2801/* Input : */
2802/* Output : al -> VCLK Index */
2803/* Description : */
2804/* --------------------------------------------------------------------- */
2805static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2806 struct vb_device_info *pVBInfo)
2807{
2808 unsigned short index;
2809
Peter Huewea3d675c2012-02-09 21:11:47 +01002810 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002811 index = XGI_GetLCDCapPtr1(pVBInfo);
2812
2813 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2814 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2815 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2816 } else { /* LCDA */
2817 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2818 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2819 }
2820 }
2821 return;
2822}
2823
2824static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2825 unsigned short ModeNo, unsigned short ModeIdIndex,
2826 struct vb_device_info *pVBInfo)
2827{
2828
2829 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002830 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002831
2832 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002833 /* si+St_ResInfo */
2834 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002835 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002836 /* si+Ext_ResInfo */
2837 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002838
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002839 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2840 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002841 index = XGI_GetLCDCapPtr(pVBInfo);
2842 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2843
Peter Huewea3d675c2012-02-09 21:11:47 +01002844 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002845 return tempal;
2846
2847 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002848 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002849 (VB_SIS301B |
2850 VB_SIS302B |
2851 VB_SIS301LV |
2852 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002853 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002854 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002855 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002856 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002857 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002858 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002859 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002860 if (!(modeflag & Charx8Dot))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002861 tempal = TVCLKBASE_315 + HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002862
2863 }
2864 return tempal;
2865 }
2866
Peter Huewe599801f2012-02-09 21:11:45 +01002867 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002868 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002869 return tempal;
2870 }
2871
Peter Huewe599801f2012-02-09 21:11:45 +01002872 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002873 tempal = YPbPr525pVCLK;
2874 return tempal;
2875 }
2876
2877 tempal = NTSC1024VCLK;
2878
2879 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002880 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002881 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002882 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002883 }
2884
2885 if (pVBInfo->VBInfo & SetCRT2ToTV)
2886 return tempal;
2887 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002888 } /* {End of VB} */
2889
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002890 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002891 tempal = tempal >> 2;
2892 tempal &= 0x03;
2893
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002894 /* for Dot8 Scaling LCD */
2895 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002896 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2897
2898 if (ModeNo <= 0x13)
2899 return tempal;
2900
2901 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2902 return tempal;
2903}
2904
2905static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2906 unsigned char *di_1, struct vb_device_info *pVBInfo)
2907{
Peter Huewe6896b942012-02-09 21:11:46 +01002908 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2909 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002910 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) && (pVBInfo->SetFlag
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002911 & ProgrammingCRT2)) {
2912 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2913 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2914 }
2915 } else {
2916 *di_0 = XGI_VCLKData[tempal].SR2B;
2917 *di_1 = XGI_VCLKData[tempal].SR2C;
2918 }
2919}
2920
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002921static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302922 unsigned short RefreshRateTableIndex,
2923 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002924{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302925 unsigned char di_0, di_1, tempal;
2926 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002927
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302928 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2929 pVBInfo);
2930 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2931 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002932
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302933 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002934 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302935 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002936 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002938 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2939 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302940 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002941 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2942 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 }
2944 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002945}
2946
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002947static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302948 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002949{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302950 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002951
Peter Huewe6896b942012-02-09 21:11:46 +01002952 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2953 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302954 tempcl = 0;
2955 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002956 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302958 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002959 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302960 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002961 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302962 if (!(temp & 0x40))
2963 tempcl |= ActiveCRT1;
2964 }
2965 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002966
Aaro Koskinen58839b02011-03-13 12:26:23 +02002967 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302968 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302970 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002971 /* Check ChannelA by Part1_13 [2003/10/03] */
2972 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302973 if (tempax & 0x04)
2974 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302976 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302978 if (!(tempcl & ActiveLCD))
2979 if (temp == 0x01)
2980 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002981
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302982 if (temp == 0x04)
2983 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002984
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302985 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002986 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002987
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302988 if (!(temp & 0x08))
2989 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302991 if (!(temp & 0x04))
2992 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002993
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302994 if (temp & 0x02)
2995 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002996
Peter Huewe599801f2012-02-09 21:11:45 +01002997 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302998 if (temp & 0x01)
2999 tempch |= ActiveHiTV;
3000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003001
Peter Huewe599801f2012-02-09 21:11:45 +01003002 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003003 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303004 pVBInfo->Part2Port,
3005 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003006
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303007 if (temp & 0x10)
3008 tempch |= ActiveYPbPr;
3009 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303011 if (tempch != 0)
3012 tempcl |= ActiveTV;
3013 }
3014 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003015
Aaro Koskinen58839b02011-03-13 12:26:23 +02003016 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303017 if (tempcl & ActiveLCD) {
3018 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3019 if (temp & ActiveTV)
3020 tempcl |= ActiveTV;
3021 }
3022 }
3023 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01003024 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003025 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003026
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303027 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003028 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303029 } else {
3030 return;
3031 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003032}
3033
Bill Pemberton80adad82010-06-17 13:10:51 -04003034void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003035{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303036 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003037
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303038 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003039 tempbx = VB_SIS302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003040 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303041 if (flag != 0x02) {
Peter Huewe6896b942012-02-09 21:11:46 +01003042 tempbx = VB_SIS301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003043 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303044 if (flag >= 0xB0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003045 tempbx = VB_SIS301B;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303046 if (flag >= 0xC0) {
3047 tempbx = VB_XGI301C;
3048 if (flag >= 0xD0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003049 tempbx = VB_SIS301LV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303050 if (flag >= 0xE0) {
Peter Huewe6896b942012-02-09 21:11:46 +01003051 tempbx = VB_SIS302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003052 tempah = xgifb_reg_get(
3053 pVBInfo->Part4Port,
3054 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303055 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003056 tempbx =
3057 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303058 }
3059 }
3060 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003061
Peter Huewe6896b942012-02-09 21:11:46 +01003062 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003063 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303064 pVBInfo->Part4Port,
3065 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003066
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303067 if (!(flag & 0x02))
3068 tempbx = tempbx | VB_NoLCD;
3069 }
3070 }
3071 }
3072 pVBInfo->VBType = tempbx;
3073 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003074}
3075
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003076static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303077 struct xgi_hw_device_info *HwDeviceExtension,
3078 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003079{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303080 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003081
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303082 if (ModeNo <= 0x13)
3083 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3084 else
3085 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303087 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01003088 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303091 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003092 /* Check Display Device */
3093 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303094 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003095 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303096 push = temp;
3097 push = push << 8;
3098 tempax = temp << 8;
3099 tempbx = tempbx | tempax;
Peter Huewea3d675c2012-02-09 21:11:47 +01003100 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303101 | SetInSlaveMode | DisableCRT2Display);
3102 temp = 0xFFFF ^ temp;
3103 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003104
Aaro Koskinen58839b02011-03-13 12:26:23 +02003105 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303107 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003108
Aaro Koskinen9ffc7e92011-11-27 23:03:14 +02003109 if ((HwDeviceExtension->jChipType >= XG20) ||
3110 (HwDeviceExtension->jChipType >= XG40)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003112 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003113 (VB_SIS302B |
3114 VB_SIS301LV |
3115 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003116 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303117 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003118 tempbx |=
3119 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303121 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003122 tempbx |=
Peter Huewea3d675c2012-02-09 21:11:47 +01003123 XGI_SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303124 }
3125 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303126 }
3127 }
3128 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003129
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303130 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003131 /* [Billy] 07/05/04 */
3132 if (((pVBInfo->IF_DEF_LVDS == 0) &&
Peter Huewe6896b942012-02-09 21:11:46 +01003133 ((pVBInfo->VBType & VB_SIS301LV) ||
3134 (pVBInfo->VBType & VB_SIS302LV) ||
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003135 (pVBInfo->VBType & VB_XGI301C)))) {
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02003136 if (temp & SetYPbPr) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303137 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003138 /* shampoo add for new
3139 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003140 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303141 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003142 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303143 temp &= YPbPrMode;
Peter Huewe599801f2012-02-09 21:11:45 +01003144 tempbx |= SetCRT2ToHiVision;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003147 tempbx &=
Peter Huewe599801f2012-02-09 21:11:45 +01003148 (~SetCRT2ToHiVision);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003149 tempbx |=
Peter Huewe599801f2012-02-09 21:11:45 +01003150 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303151 }
3152 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303153 }
3154 }
3155 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003156
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303157 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303159 if (pVBInfo->IF_DEF_LVDS == 0) {
3160 if (pVBInfo->IF_DEF_YPbPr == 1) {
3161 if (pVBInfo->IF_DEF_HiVision == 1)
3162 temp = 0x09FC;
3163 else
3164 temp = 0x097C;
3165 } else {
3166 if (pVBInfo->IF_DEF_HiVision == 1)
3167 temp = 0x01FC;
3168 else
3169 temp = 0x017C;
3170 }
3171 } else { /* 3nd party chip */
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003172 temp = SetCRT2ToLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303175 if (!(tempbx & temp)) {
3176 tempax |= DisableCRT2Display;
3177 tempbx = 0;
3178 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303180 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3181 if (!(pVBInfo->VBType & VB_NoLCD)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003182 if (tempbx & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303183 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003184 tempbx &= (~(SetCRT2ToLCD |
3185 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01003186 SwitchCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303187 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003188 tempbx &= (~(SetCRT2ToLCD |
3189 SetCRT2ToRAMDAC |
3190 SetCRT2ToTV |
Peter Huewe6896b942012-02-09 21:11:46 +01003191 SwitchCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303192 }
3193 }
3194 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003195
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303196 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003197 /* for driver abnormal */
Peter Huewe6896b942012-02-09 21:11:46 +01003198 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303199 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3200 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003201 tempbx &= (0xFF00 |
3202 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01003203 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003204 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003205 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303206 }
3207 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003208 tempbx &= (~(SetCRT2ToRAMDAC |
3209 SetCRT2ToLCD |
3210 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303211 }
3212 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 if (!(pVBInfo->VBType & VB_NoLCD)) {
3215 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003216 tempbx &= (0xFF00 |
3217 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01003218 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003219 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003220 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303221 }
3222 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303224 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003225 tempbx &= (0xFF00 |
3226 SetCRT2ToSCART |
Peter Huewe6896b942012-02-09 21:11:46 +01003227 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003228 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01003229 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
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_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003233 if (tempbx & SetCRT2ToYPbPr525750)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003234 tempbx &= (0xFF00 |
Peter Huewe6896b942012-02-09 21:11:46 +01003235 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003236 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303237 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003238
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303239 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003240 if (tempbx & SetCRT2ToHiVision)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003241 tempbx &= (0xFF00 |
Peter Huewe599801f2012-02-09 21:11:45 +01003242 SetCRT2ToHiVision |
Peter Huewe6896b942012-02-09 21:11:46 +01003243 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003244 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003246
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303247 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
Peter Huewe6896b942012-02-09 21:11:46 +01003248 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303249 tempbx = DisableCRT2Display;
3250 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003251
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303252 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003253 if ((!(tempbx & DriverMode)) ||
3254 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303255 if (pVBInfo->IF_DEF_LCDA == 1) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003256 if (!(tempbx & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003257 tempbx |= (SetInSlaveMode |
3258 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303259 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303260 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003261
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003262 /* LCD+TV can't support in slave mode
3263 * (Force LCDA+TV->LCDB) */
3264 if ((tempbx & SetInSlaveMode) &&
Peter Huewea3d675c2012-02-09 21:11:47 +01003265 (tempbx & XGI_SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003266 tempbx ^= (SetCRT2ToLCD |
Peter Huewea3d675c2012-02-09 21:11:47 +01003267 XGI_SetCRT2ToLCDA |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003268 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303269 pVBInfo->SetFlag |= ReserveTVOption;
3270 }
3271 }
3272 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003273
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303274 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003275}
3276
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003277static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303278 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003279{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303280 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003281
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303282 tempbx = 0;
3283 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303285 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3286 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003287 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3288 St_ModeFlag; /* si+St_ModeFlag */
3289 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3290 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003292 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3293 Ext_ModeFlag;
3294 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3295 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303296 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003297
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303298 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003299 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01003301 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003302 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01003303 TVSetPALM |
3304 TVSetPALN |
3305 TVSetPAL);
3306 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003307 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01003308 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303309 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003310 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01003311 TVSetNTSCJ |
3312 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003314
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315 if (pVBInfo->IF_DEF_LVDS == 0) {
3316 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01003317 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303318 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003319
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303320 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003321 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003322 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303323 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303325 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01003326 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303328 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01003329 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303330 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01003331 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303332 }
3333 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303335 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01003336 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3337 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303340 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003341 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3342 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303343 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003344
Peter Huewe599801f2012-02-09 21:11:45 +01003345 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003346 (modeflag > 13) &&
3347 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303348 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003351
Peter Huewe599801f2012-02-09 21:11:45 +01003352 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303353 if (pVBInfo->VBInfo & SetInSlaveMode)
3354 tempbx &= (~RPLLDIV2XO);
3355 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003356 if (tempbx &
Peter Huewe599801f2012-02-09 21:11:45 +01003357 (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303358 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003359 else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003360 (VB_SIS301B |
3361 VB_SIS302B |
3362 VB_SIS301LV |
3363 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003364 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303365 if (tempbx & TVSimuMode)
3366 tempbx &= (~RPLLDIV2XO);
3367 }
3368 }
3369 }
3370 }
3371 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003372}
3373
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02003374static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
3375 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003376{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303377 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003378
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303379 pVBInfo->LCDResInfo = 0;
3380 pVBInfo->LCDTypeInfo = 0;
3381 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003382
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003384 /* si+St_ModeFlag // */
3385 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303386 } else {
3387 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003388 /* si+Ext_ResInfo // */
3389 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303390 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003391
Aaro Koskinen58839b02011-03-13 12:26:23 +02003392 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303393 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303395 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01003396 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303398 /* LCD75 [2003/8/22] Vicent */
Peter Huewe255aabd2012-02-09 21:11:44 +01003399 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003401 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01003402 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303403 tempax &= 0x0F;
3404 else
3405 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303407 if ((resinfo == 6) || (resinfo == 9)) {
3408 if (tempax >= 3)
3409 tempbx |= PanelRef75Hz;
3410 } else if ((resinfo == 7) || (resinfo == 8)) {
3411 if (tempax >= 4)
3412 tempbx |= PanelRef75Hz;
3413 }
3414 }
3415 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303417 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003418
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303419 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003420
Peter Huewea3d675c2012-02-09 21:11:47 +01003421 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303422 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003423
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303424 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003425
Aaro Koskinen58839b02011-03-13 12:26:23 +02003426 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003427
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303428 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003429
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303430 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303432 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303436 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01003437 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01003438 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303439 tempbx |= SetLCDDualLink;
3440 }
3441 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303443 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003444 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303445 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3446 == 9) && (!(tempbx & EnableScalingLCD)))
Peter Huewe255aabd2012-02-09 21:11:44 +01003447 /* set to center in 1280x1024 LCDB for Panel_1400x1050 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003448 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303449 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303451 if (pVBInfo->IF_DEF_ExpLink == 1) {
3452 if (modeflag & HalfDCLK) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 if (!(tempbx & SetLCDtoNonExpanding)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003454 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303455 } else {
3456 if (ModeNo > 0x13) {
3457 if (pVBInfo->LCDResInfo
Peter Huewe255aabd2012-02-09 21:11:44 +01003458 == Panel_1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003459 if (resinfo == 4) {/* 512x384 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003460 tempbx |= XGI_EnableLVDSDDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303461 }
3462 }
3463 }
3464 }
3465 }
3466 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 if (pVBInfo->VBInfo & SetInSlaveMode) {
3469 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01003470 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303471 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01003472 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003474
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303475 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003476
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303477 if (pVBInfo->IF_DEF_LVDS == 0) {
3478 if (tempax & (LockLCDBToA | StLCDBToA)) {
3479 if (pVBInfo->VBInfo & SetInSlaveMode) {
3480 if (!(tempax & LockLCDBToA)) {
3481 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003482 pVBInfo->VBInfo &=
3483 ~(SetSimuScanMode |
3484 SetInSlaveMode |
3485 SetCRT2ToLCD);
3486 pVBInfo->VBInfo |=
Peter Huewea3d675c2012-02-09 21:11:47 +01003487 XGI_SetCRT2ToLCDA |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003488 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303489 }
3490 }
3491 }
3492 }
3493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303495 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003496}
3497
Bill Pemberton108afbf2010-06-17 13:10:47 -04003498unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303499 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003500{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303501 if (ModeNo <= 5)
3502 ModeNo |= 1;
3503 if (ModeNo <= 0x13) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303504 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003505 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3506 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003508 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3509 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303510 return 0;
3511 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303513 if (ModeNo == 0x07)
3514 (*ModeIdIndex)++; /* 400 lines */
3515 if (ModeNo <= 3)
3516 (*ModeIdIndex) += 2; /* 400 lines */
3517 /* else 350 lines */
3518 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303519 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003520 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3521 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003523 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3524 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303525 return 0;
3526 }
3527 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003528
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303529 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003530}
3531
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003532static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3533{
3534 unsigned char ujRet = 0;
3535 unsigned char i = 0;
3536
3537 for (i = 0; i < 8; i++) {
3538 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003539 ujRet |= (ujDate >> i) & 1;
3540 }
3541
3542 return ujRet;
3543}
3544
3545/*----------------------------------------------------------------------------*/
3546/* output */
3547/* bl[5] : LVDS signal */
3548/* bl[1] : LVDS backlight */
3549/* bl[0] : LVDS VDD */
3550/*----------------------------------------------------------------------------*/
3551static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3552{
3553 unsigned char CR4A, temp;
3554
Aaro Koskinen58839b02011-03-13 12:26:23 +02003555 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003556 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003557
Aaro Koskinen58839b02011-03-13 12:26:23 +02003558 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003559
3560 temp = XG21GPIODataTransfer(temp);
3561 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003562 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003563 return temp;
3564}
3565
3566/*----------------------------------------------------------------------------*/
3567/* output */
3568/* bl[5] : LVDS signal */
3569/* bl[1] : LVDS backlight */
3570/* bl[0] : LVDS VDD */
3571/*----------------------------------------------------------------------------*/
3572static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3573{
3574 unsigned char CR4A, CRB4, temp;
3575
Aaro Koskinen58839b02011-03-13 12:26:23 +02003576 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003577 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003578
Aaro Koskinen58839b02011-03-13 12:26:23 +02003579 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003580
3581 temp &= 0x0C;
3582 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003583 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003584 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003585 temp |= ((CRB4 & 0x04) << 3);
3586 return temp;
3587}
3588
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003589/*----------------------------------------------------------------------------*/
3590/* input */
3591/* bl[5] : 1;LVDS signal on */
3592/* bl[1] : 1;LVDS backlight on */
3593/* bl[0] : 1:LVDS VDD on */
3594/* bh: 100000b : clear bit 5, to set bit5 */
3595/* 000010b : clear bit 1, to set bit1 */
3596/* 000001b : clear bit 0, to set bit0 */
3597/*----------------------------------------------------------------------------*/
3598static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3599 struct vb_device_info *pVBInfo)
3600{
3601 unsigned char CR4A, temp;
3602
3603 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3604 tempbh &= 0x23;
3605 tempbl &= 0x23;
3606 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3607
3608 if (tempbh & 0x20) {
3609 temp = (tempbl >> 4) & 0x02;
3610
3611 /* CR B4[1] */
3612 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3613
3614 }
3615
3616 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3617
3618 temp = XG21GPIODataTransfer(temp);
3619 temp &= ~tempbh;
3620 temp |= tempbl;
3621 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3622}
3623
Aaro Koskinen776115a2011-11-27 23:03:10 +02003624static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3625 struct vb_device_info *pVBInfo)
3626{
3627 unsigned char CR4A, temp;
3628 unsigned short tempbh0, tempbl0;
3629
3630 tempbh0 = tempbh;
3631 tempbl0 = tempbl;
3632 tempbh0 &= 0x20;
3633 tempbl0 &= 0x20;
3634 tempbh0 >>= 3;
3635 tempbl0 >>= 3;
3636
3637 if (tempbh & 0x20) {
3638 temp = (tempbl >> 4) & 0x02;
3639
3640 /* CR B4[1] */
3641 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3642
3643 }
3644 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3645
3646 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3647 tempbh &= 0x03;
3648 tempbl &= 0x03;
3649 tempbh <<= 2;
3650 tempbl <<= 2; /* GPIOC,GPIOD */
3651 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3652 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3653}
3654
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003655/* --------------------------------------------------------------------- */
3656/* Function : XGI_XG21SetPanelDelay */
3657/* Input : */
3658/* Output : */
3659/* Description : */
3660/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
3661/* : bl : 2 ; T2 : the duration signal on and Vdd on */
3662/* : bl : 3 ; T3 : the duration between CPL off and signal off */
3663/* : bl : 4 ; T4 : the duration signal off and Vdd off */
3664/* --------------------------------------------------------------------- */
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003665static void XGI_XG21SetPanelDelay(struct xgifb_video_info *xgifb_info,
3666 unsigned short tempbl,
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003667 struct vb_device_info *pVBInfo)
3668{
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003669 if (tempbl == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003670 mdelay(xgifb_info->lvds_data.PSC_S1);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003671
3672 if (tempbl == 2)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003673 mdelay(xgifb_info->lvds_data.PSC_S2);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003674
3675 if (tempbl == 3)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003676 mdelay(xgifb_info->lvds_data.PSC_S3);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003677
3678 if (tempbl == 4)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003679 mdelay(xgifb_info->lvds_data.PSC_S4);
Aaro Koskinen9913b6c2011-11-27 23:03:11 +02003680}
3681
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003682static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
3683 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303684 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003685{
3686
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003687 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303688 if (pXGIHWDE->jChipType == XG21) {
3689 if (pVBInfo->IF_DEF_LVDS == 1) {
3690 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003691 /* LVDS VDD on */
3692 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003693 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303694 }
3695 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003696 /* LVDS signal on */
3697 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003698 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003699 /* LVDS backlight on */
3700 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003702 /* DVO/DVI signal on */
3703 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003705
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303706 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303708 if (pXGIHWDE->jChipType == XG27) {
3709 if (pVBInfo->IF_DEF_LVDS == 1) {
3710 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003711 /* LVDS VDD on */
3712 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003713 XGI_XG21SetPanelDelay(xgifb_info, 2, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303714 }
3715 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003716 /* LVDS signal on */
3717 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003718 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003719 /* LVDS backlight on */
3720 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303721 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003722 /* DVO/DVI signal on */
3723 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303724 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003727}
3728
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003729void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
3730 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303731 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003732{
3733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303734 if (pXGIHWDE->jChipType == XG21) {
3735 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003736 /* LVDS backlight off */
3737 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003738 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303739 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003740 /* DVO/DVI signal off */
3741 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303742 }
3743 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303745 if (pXGIHWDE->jChipType == XG27) {
3746 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003747 /* LVDS backlight off */
3748 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02003749 XGI_XG21SetPanelDelay(xgifb_info, 3, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303750 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303752 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003753 /* DVO/DVI signal off */
3754 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303755 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003756
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003757 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003758}
3759
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003760static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003761{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003762 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303763 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003764
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003765 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303766 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003767}
3768
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003769static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003770{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003771 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003772}
3773
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003774static void XGI_SaveCRT2Info(unsigned short ModeNo,
3775 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003776{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303777 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003778
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003779 /* reserve CR34 for CRT1 Mode No */
3780 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303781 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3782 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003783 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003784}
3785
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003786static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3787 unsigned short ModeIdIndex,
3788 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003789{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303790 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303792 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
3793 if (ModeNo <= 0x13) {
3794 xres = pVBInfo->StResInfo[resindex].HTotal;
3795 yres = pVBInfo->StResInfo[resindex].VTotal;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303796 } else {
3797 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3798 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003799 /* si+St_ModeFlag */
3800 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303802 if (modeflag & HalfDCLK)
3803 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303805 if (modeflag & DoubleScanMode)
3806 yres *= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303807 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
3810 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003811 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003812 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303813 if (yres == 1024)
3814 yres = 1056;
3815 }
3816 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003817
Peter Huewe255aabd2012-02-09 21:11:44 +01003818 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303819 if (yres == 400)
3820 yres = 405;
3821 else if (yres == 350)
3822 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003823
Peter Huewea3d675c2012-02-09 21:11:47 +01003824 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303825 if (yres == 360)
3826 yres = 375;
3827 }
3828 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003829
Peter Huewe255aabd2012-02-09 21:11:44 +01003830 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003831 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303832 if (!(pVBInfo->LCDInfo
3833 & LCDNonExpanding)) {
3834 if (yres == 350)
3835 yres = 357;
3836 else if (yres == 400)
3837 yres = 420;
3838 else if (yres == 480)
3839 yres = 525;
3840 }
3841 }
3842 }
3843 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303845 if (xres == 720)
3846 xres = 640;
3847 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003848
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303849 pVBInfo->VGAHDE = xres;
3850 pVBInfo->HDE = xres;
3851 pVBInfo->VGAVDE = yres;
3852 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003853}
3854
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003855static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003856{
3857
Peter Huewea3d675c2012-02-09 21:11:47 +01003858 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003859 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303862 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003863}
3864
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003865static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3866 unsigned short ModeIdIndex,
3867 unsigned short RefreshRateTableIndex,
3868 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003869{
3870 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
3871 StandTableIndex, CRT1Index;
3872
3873 pVBInfo->RVBHCMAX = 1;
3874 pVBInfo->RVBHCFACT = 1;
3875
3876 if (ModeNo <= 0x13) {
3877 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3878 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
3879 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
3880 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
3881 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
3882 } else {
3883 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003884 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
3885 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003886 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003887 temp1 = (unsigned short) pVBInfo->
3888 XGINEWUB_CRT1Table[CRT1Index].CR[0];
3889 temp2 = (unsigned short) pVBInfo->
3890 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003891 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003892 tempbx = (unsigned short) pVBInfo->
3893 XGINEWUB_CRT1Table[CRT1Index].CR[8];
3894 tempcx = (unsigned short) pVBInfo->
3895 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003896 tempcx &= 0x0100;
3897 tempcx = tempcx << 2;
3898 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003899 temp1 = (unsigned short) pVBInfo->
3900 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003901 }
3902
3903 if (temp1 & 0x01)
3904 tempbx |= 0x0100;
3905
3906 if (temp1 & 0x20)
3907 tempbx |= 0x0200;
3908 tempax += 5;
3909
3910 if (modeflag & Charx8Dot)
3911 tempax *= 8;
3912 else
3913 tempax *= 9;
3914
3915 pVBInfo->VGAHT = tempax;
3916 pVBInfo->HT = tempax;
3917 tempbx++;
3918 pVBInfo->VGAVT = tempbx;
3919 pVBInfo->VT = tempbx;
3920}
3921
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003922static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303923 unsigned short RefreshRateTableIndex,
3924 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003925{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303926 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003927
Peter Huewefc39dcb2012-01-15 19:22:12 +01003928 struct SiS_LCDData *LCDPtr = NULL;
3929 struct SiS_TVData *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303931 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003932 /* si+St_ResInfo */
3933 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303934 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
3935 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003936 /* si+Ext_ResInfo */
3937 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303938 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003940
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303941 pVBInfo->NewFlickerMode = 0;
3942 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303944 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3945 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3946 pVBInfo);
3947 return;
3948 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303950 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003951
Peter Huewea3d675c2012-02-09 21:11:47 +01003952 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003953 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303954 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3955 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303957 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3958 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3959 pVBInfo->VGAHT = LCDPtr->VGAHT;
3960 pVBInfo->VGAVT = LCDPtr->VGAVT;
3961 pVBInfo->HT = LCDPtr->LCDHT;
3962 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003963
Peter Huewe255aabd2012-02-09 21:11:44 +01003964 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303965 tempax = 1024;
3966 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003967
Peter Huewea3d675c2012-02-09 21:11:47 +01003968 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303969 if (pVBInfo->VGAVDE == 357)
3970 tempbx = 527;
3971 else if (pVBInfo->VGAVDE == 420)
3972 tempbx = 620;
3973 else if (pVBInfo->VGAVDE == 525)
3974 tempbx = 775;
3975 else if (pVBInfo->VGAVDE == 600)
3976 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977 else
3978 tempbx = 768;
3979 } else
3980 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003981 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303982 tempax = 1024;
3983 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003984 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303985 tempax = 1280;
3986 if (pVBInfo->VGAVDE == 360)
3987 tempbx = 768;
3988 else if (pVBInfo->VGAVDE == 375)
3989 tempbx = 800;
3990 else if (pVBInfo->VGAVDE == 405)
3991 tempbx = 864;
3992 else
3993 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003994 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995 tempax = 1280;
3996 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003997 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303998 tempax = 1280;
3999 if (pVBInfo->VGAVDE == 350)
4000 tempbx = 700;
4001 else if (pVBInfo->VGAVDE == 400)
4002 tempbx = 800;
4003 else if (pVBInfo->VGAVDE == 1024)
4004 tempbx = 960;
4005 else
4006 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01004007 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304008 tempax = 1400;
4009 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304011 if (pVBInfo->VGAVDE == 1024) {
4012 tempax = 1280;
4013 tempbx = 1024;
4014 }
Peter Huewe255aabd2012-02-09 21:11:44 +01004015 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 tempax = 1600;
4017 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01004018 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304019 if (pVBInfo->VGAVDE == 350)
4020 tempbx = 875;
4021 else if (pVBInfo->VGAVDE == 400)
4022 tempbx = 1000;
4023 }
4024 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004025
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304026 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4027 tempax = pVBInfo->VGAHDE;
4028 tempbx = pVBInfo->VGAVDE;
4029 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304031 pVBInfo->HDE = tempax;
4032 pVBInfo->VDE = tempbx;
4033 return;
4034 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304036 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4037 tempbx = 4;
Peter Huewefc39dcb2012-01-15 19:22:12 +01004038 TVPtr = (struct SiS_TVData *) XGI_GetTVPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304039 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4040 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304042 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4043 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4044 pVBInfo->VGAHT = TVPtr->VGAHT;
4045 pVBInfo->VGAVT = TVPtr->VGAVT;
4046 pVBInfo->HDE = TVPtr->TVHDE;
4047 pVBInfo->VDE = TVPtr->TVVDE;
4048 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4049 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004050
Peter Huewe599801f2012-02-09 21:11:45 +01004051 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304052 if (resinfo == 0x08)
4053 pVBInfo->NewFlickerMode = 0x40;
4054 else if (resinfo == 0x09)
4055 pVBInfo->NewFlickerMode = 0x40;
4056 else if (resinfo == 0x12)
4057 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304059 if (pVBInfo->VGAVDE == 350)
4060 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304062 tempax = ExtHiTVHT;
4063 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304065 if (pVBInfo->VBInfo & SetInSlaveMode) {
4066 if (pVBInfo->TVInfo & TVSimuMode) {
4067 tempax = StHiTVHT;
4068 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004069
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304070 if (!(modeflag & Charx8Dot)) {
4071 tempax = StHiTextTVHT;
4072 tempbx = StHiTextTVVT;
4073 }
4074 }
4075 }
Peter Huewe599801f2012-02-09 21:11:45 +01004076 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4077 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304078 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4079 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4080 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004081
Peter Huewe599801f2012-02-09 21:11:45 +01004082 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304083 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4084 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01004085 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304086 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4087 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4088 if (pVBInfo->TVInfo & NTSC1024x768)
4089 tempax = NTSC1024x768HT;
4090 }
4091 } else {
4092 tempax = PALHT;
4093 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01004094 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304095 tempax = NTSCHT;
4096 tempbx = NTSCVT;
4097 if (pVBInfo->TVInfo & NTSC1024x768)
4098 tempax = NTSC1024x768HT;
4099 }
4100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304102 pVBInfo->HT = tempax;
4103 pVBInfo->VT = tempbx;
4104 return;
4105 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004106}
4107
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004108static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304109 unsigned short RefreshRateTableIndex,
4110 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004111{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004112 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304114 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4115 pVBInfo);
4116 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4117 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004118
Peter Huewe6896b942012-02-09 21:11:46 +01004119 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304120 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004121 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4122 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4123 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304124 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004125 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4126 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304127 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004128
Aaro Koskinen8104e322011-03-13 12:26:22 +02004129 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304131 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004132 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304133 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004134 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004135}
4136
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004137static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4138 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004139{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004140 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4141 short index;
4142 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304143
4144 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004145 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304146 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004147 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304148
Peter Huewe6896b942012-02-09 21:11:46 +01004149 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304150
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004151 if (index < 0)
4152 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304153
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004154 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304155}
4156
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004157static unsigned short XGI_GetOffset(unsigned short ModeNo,
4158 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304159 unsigned short RefreshRateTableIndex,
4160 struct xgi_hw_device_info *HwDeviceExtension,
4161 struct vb_device_info *pVBInfo)
4162{
4163 unsigned short temp, colordepth, modeinfo, index, infoflag,
4164 ColorDepth[] = { 0x01, 0x02, 0x04 };
4165
4166 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4167 if (ModeNo <= 0x14)
4168 infoflag = 0;
4169 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004170 infoflag = pVBInfo->
4171 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304172
4173 index = (modeinfo >> 8) & 0xFF;
4174
4175 temp = pVBInfo->ScreenOffset[index];
4176
4177 if (infoflag & InterlaceMode)
4178 temp = temp << 1;
4179
4180 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4181
4182 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4183 temp = ModeNo - 0x7C;
4184 colordepth = ColorDepth[temp];
4185 temp = 0x6B;
4186 if (infoflag & InterlaceMode)
4187 temp = temp << 1;
4188 return temp * colordepth;
4189 } else {
4190 return temp * colordepth;
4191 }
4192}
4193
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004194static void XGI_SetCRT2Offset(unsigned short ModeNo,
4195 unsigned short ModeIdIndex,
4196 unsigned short RefreshRateTableIndex,
4197 struct xgi_hw_device_info *HwDeviceExtension,
4198 struct vb_device_info *pVBInfo)
4199{
4200 unsigned short offset;
4201 unsigned char temp;
4202
4203 if (pVBInfo->VBInfo & SetInSlaveMode)
4204 return;
4205
4206 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4207 HwDeviceExtension, pVBInfo);
4208 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004209 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004210 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004211 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004212 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004213 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004214}
4215
Randy Dunlap89229672010-08-10 08:46:44 -07004216static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004217{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004218 /* threshold high ,disable auto threshold */
4219 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4220 /* threshold low default 04h */
4221 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004222}
4223
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004224static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304225 struct xgi_hw_device_info *HwDeviceExtension,
4226 unsigned short RefreshRateTableIndex,
4227 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004228{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304229 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304231 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004232 CRT1Index = pVBInfo->
4233 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304234 CRT1Index &= IndexMask;
4235 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304238 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4239 HwDeviceExtension, pVBInfo);
4240 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304242 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004243 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004244
Aaro Koskinen8104e322011-03-13 12:26:22 +02004245 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4246 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004247}
4248
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004249static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304250 struct xgi_hw_device_info *HwDeviceExtension,
4251 unsigned short RefreshRateTableIndex,
4252 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004253{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304254 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4255 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304257 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004258 CRT1Index = pVBInfo->
4259 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304260 CRT1Index &= IndexMask;
4261 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004262 }
4263
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304264 if (ModeNo <= 0x13)
4265 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4266 else
4267 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304269 /* bainy change table name */
4270 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004271 /* BTVGA2HT 0x08,0x09 */
4272 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004273 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304274 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004275 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004276 /* BTVGA2HDEE 0x0A,0x0C */
4277 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004278 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304279 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4280 pushbx = pVBInfo->VGAHDE / 2 + 16;
4281 tempcx = tempcx >> 1;
4282 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4283 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304285 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4286 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004287 tempbx |= ((pVBInfo->
4288 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4289 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304290 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4291 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4292 tempcx &= 0x1F;
4293 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4294 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4295 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4296 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004297
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304298 tempbx += 4;
4299 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304301 if (tempcx > (pVBInfo->VGAHT / 2))
4302 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004305
Aaro Koskinen8104e322011-03-13 12:26:22 +02004306 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304307 } else {
4308 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004309 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304310 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004311 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004312 /* BTVGA2HDEE 0x0A,0x0C */
4313 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004314 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304315 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4316 pushbx = pVBInfo->VGAHDE + 16;
4317 tempcx = tempcx >> 1;
4318 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4319 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004320
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304321 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4322 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004323 tempbx |= ((pVBInfo->
4324 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4325 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304326 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4327 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4328 tempcx &= 0x1F;
4329 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4330 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4331 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4332 tempbx += 16;
4333 tempcx += 16;
4334 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304336 if (tempcx > pVBInfo->VGAHT)
4337 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004338
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304339 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004340 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304341 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004342
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304343 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4344 tempbx = pushbx;
4345 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4346 tempax |= (tempbx & 0xFF00);
4347 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004348 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004350 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304351 tempcx = (pVBInfo->VGAVT - 1);
4352 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004353
Aaro Koskinen8104e322011-03-13 12:26:22 +02004354 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 tempbx = pVBInfo->VGAVDE - 1;
4356 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004357 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304358 temp = ((tempbx & 0xFF00) << 3) >> 8;
4359 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004360 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304362 tempax = pVBInfo->VGAVDE;
4363 tempbx = pVBInfo->VGAVDE;
4364 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004365 /* BTVGA2VRS 0x10,0x11 */
4366 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4367 /* BTVGA2VRE 0x11 */
4368 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004369
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4371 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4372 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304374 if (temp & 0x04)
4375 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304377 if (temp & 0x080)
4378 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304380 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004381
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304382 if (temp & 0x08)
4383 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004384
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304385 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4386 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4387 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304389 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004390 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304391 temp = ((tempbx & 0xFF00) >> 8) << 4;
4392 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004393 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304396 if (modeflag & DoubleScanMode)
4397 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004398
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304399 if (modeflag & HalfDCLK)
4400 tempax |= 0x40;
4401
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004402 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004403}
4404
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004405static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4406{
4407 unsigned long tempax, tempbx;
4408
4409 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4410 & 0xFFFF;
4411 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4412 tempax = (tempax * pVBInfo->HT) / tempbx;
4413
4414 return (unsigned short) tempax;
4415}
4416
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004417static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304418 struct xgi_hw_device_info *HwDeviceExtension,
4419 unsigned short RefreshRateTableIndex,
4420 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004421{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304422 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4423 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304425 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004426 /* si+St_ResInfo */
4427 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304428 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4429 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004430 /* si+Ext_ResInfo */
4431 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304432 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004433 CRT1Index = pVBInfo->
4434 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304435 CRT1Index &= IndexMask;
4436 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304438 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4439 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304441 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004442 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304443 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004444
Peter Huewe6896b942012-02-09 21:11:46 +01004445 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304446 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304448 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304450 if (modeflag & HalfDCLK)
4451 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304453 tempax = (tempax / tempcx) - 1;
4454 tempbx |= ((tempax & 0x00FF) << 8);
4455 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004456 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304458 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304460 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01004461 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4462 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304463 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004464
Peter Huewe599801f2012-02-09 21:11:45 +01004465 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004466 if (pVBInfo->VBType & VB_SIS301LV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4468 if (resinfo == 7)
4469 temp -= 2;
4470 }
4471 } else if (resinfo == 7) {
4472 temp -= 2;
4473 }
4474 }
4475 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004476
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004477 /* 0x05 Horizontal Display Start */
4478 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
4479 /* 0x06 Horizontal Blank end */
4480 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304482 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4483 if (pVBInfo->VBInfo & SetCRT2ToTV)
4484 tempax = pVBInfo->VGAHT;
4485 else
4486 tempax = XGI_GetVGAHT2(pVBInfo);
4487 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004488
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304489 if (tempax >= pVBInfo->VGAHT)
4490 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004491
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304492 if (modeflag & HalfDCLK)
4493 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304495 tempax = (tempax / tempcx) - 5;
4496 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01004497 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304498 temp = (tempbx & 0x00FF) - 1;
4499 if (!(modeflag & HalfDCLK)) {
4500 temp -= 6;
4501 if (pVBInfo->TVInfo & TVSimuMode) {
4502 temp -= 4;
4503 if (ModeNo > 0x13)
4504 temp -= 10;
4505 }
4506 }
4507 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 tempbx = (tempbx & 0xFF00) >> 8;
4509 tempcx = (tempcx + tempbx) >> 1;
4510 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304512 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4513 temp -= 1;
4514 if (!(modeflag & HalfDCLK)) {
4515 if ((modeflag & Charx8Dot)) {
4516 temp += 4;
4517 if (pVBInfo->VGAHDE >= 800)
4518 temp -= 6;
4519 }
4520 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004521 } else if (!(modeflag & HalfDCLK)) {
4522 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01004523 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004524 pVBInfo->VGAHDE >= 800) {
4525 temp -= 7;
4526 if (pVBInfo->ModeType == ModeEGA &&
4527 pVBInfo->VGAVDE == 1024) {
4528 temp += 15;
4529 if (pVBInfo->LCDResInfo !=
Peter Huewe255aabd2012-02-09 21:11:44 +01004530 Panel_1280x1024)
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004531 temp += 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304532 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004533
4534 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01004535 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02004536 (pVBInfo->LCDInfo & LCDNonExpanding))
4537 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304538 }
4539 }
4540 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004541
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004542 /* 0x07 Horizontal Retrace Start */
4543 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4544 /* 0x08 Horizontal Retrace End */
4545 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004546
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304547 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4548 if (pVBInfo->TVInfo & TVSimuMode) {
4549 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4550 == 0x11) || (ModeNo == 0x13) || (ModeNo
4551 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004552 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
4553 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304554 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304556 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
4557 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004558 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304559 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004560 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304561 0x08, 0x61);
4562 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004563 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304564 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004565 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304566 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004567 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304568 0x0C, 0xF0);
4569 }
4570 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004571
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304572 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
4573 == 0x07)) {
4574 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004575 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304576 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004577 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304578 0x08, 0x00);
4579 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004580 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304581 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004582 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304583 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004584 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304585 0x0C, 0xF0);
4586 }
4587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304589 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
4590 == 0x0D) || (ModeNo == 0x50)) {
4591 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004592 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304593 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004594 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304595 0x08, 0x03);
4596 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004597 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304598 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004599 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304600 0x08, 0x02);
4601 }
4602 }
4603 }
4604 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004605
Aaro Koskinen8104e322011-03-13 12:26:22 +02004606 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004607 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004608 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304610 tempbx = pVBInfo->VGAVT;
4611 push1 = tempbx;
4612 tempcx = 0x121;
4613 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304615 if (tempbx == 357)
4616 tempbx = 350;
4617 if (tempbx == 360)
4618 tempbx = 350;
4619 if (tempbx == 375)
4620 tempbx = 350;
4621 if (tempbx == 405)
4622 tempbx = 400;
4623 if (tempbx == 525)
4624 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304628 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01004629 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004630 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304631 if (tempbx == 350)
4632 tempbx += 5;
4633 if (tempbx == 480)
4634 tempbx += 5;
4635 }
4636 }
4637 }
4638 tempbx--;
4639 temp = tempbx & 0x00FF;
4640 tempbx--;
4641 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004642 /* 0x10 vertical Blank Start */
4643 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304644 tempbx = push2;
4645 tempbx--;
4646 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004647 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304649 if (tempbx & 0x0100)
4650 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304652 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304654 if (modeflag & DoubleScanMode)
4655 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304657 if (tempbx & 0x0200)
4658 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004659
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304660 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004661 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004662
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304663 if (tempbx & 0x0400)
4664 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004665
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004666 /* 0x11 Vertival Blank End */
4667 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304668
4669 tempax = push1;
4670 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4671 tempax = tempax >> 2;
4672 push1 = tempax; /* push ax */
4673
4674 if (resinfo != 0x09) {
4675 tempax = tempax << 1;
4676 tempbx += tempax;
4677 }
4678
Peter Huewe599801f2012-02-09 21:11:45 +01004679 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004680 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004681 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304682 tempbx -= 10;
4683 } else {
4684 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004685 if (pVBInfo->TVInfo & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004686 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004687 VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004688 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004689 (TVSetYPbPr525p |
4690 TVSetYPbPr750p |
4691 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304692 tempbx += 40;
4693 } else {
4694 tempbx += 40;
4695 }
4696 }
4697 }
4698 }
4699 } else {
4700 tempbx -= 10;
4701 }
4702 } else {
4703 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Huewe599801f2012-02-09 21:11:45 +01004704 if (pVBInfo->TVInfo & TVSetPAL) {
Peter Huewe6896b942012-02-09 21:11:46 +01004705 if (pVBInfo->VBType & VB_SIS301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004706 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004707 (TVSetYPbPr525p |
4708 TVSetYPbPr750p |
4709 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 tempbx += 40;
4711 } else {
4712 tempbx += 40;
4713 }
4714 }
4715 }
4716 }
4717 tempax = push1;
4718 tempax = tempax >> 2;
4719 tempax++;
4720 tempax += tempbx;
4721 push1 = tempax; /* push ax */
4722
Peter Huewe599801f2012-02-09 21:11:45 +01004723 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304724 if (tempbx <= 513) {
4725 if (tempax >= 513)
4726 tempbx = 513;
4727 }
4728 }
4729
4730 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004731 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304732 tempbx--;
4733 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004734 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304735
4736 if (tempbx & 0x0100)
4737 tempcx |= 0x0008;
4738
4739 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004740 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304741
4742 tempbx++;
4743
4744 if (tempbx & 0x0100)
4745 tempcx |= 0x0004;
4746
4747 if (tempbx & 0x0200)
4748 tempcx |= 0x0080;
4749
4750 if (tempbx & 0x0400)
4751 tempcx |= 0x0C00;
4752
4753 tempbx = push1; /* pop ax */
4754 temp = tempbx & 0x00FF;
4755 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004756 /* 0x0D vertical Retrace End */
4757 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304758
4759 if (tempbx & 0x0010)
4760 tempcx |= 0x2000;
4761
4762 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004763 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304764 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004765 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304766 tempax = modeflag;
4767 temp = (tempax & 0xFF00) >> 8;
4768
4769 temp = (temp >> 1) & 0x09;
4770
Peter Huewe6896b942012-02-09 21:11:46 +01004771 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 temp |= 0x01;
4773
Aaro Koskinen8104e322011-03-13 12:26:22 +02004774 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4775 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4776 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777
4778 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4779 temp = 0x80;
4780 else
4781 temp = 0x00;
4782
Aaro Koskinen8104e322011-03-13 12:26:22 +02004783 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304784
4785 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004786}
4787
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004788static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304789 unsigned short RefreshRateTableIndex,
4790 struct xgi_hw_device_info *HwDeviceExtension,
4791 struct vb_device_info *pVBInfo)
4792{
4793 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4794 modeflag, resinfo, crt2crtc;
4795 unsigned char *TimingPoint;
4796
4797 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4798
4799 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004800 /* si+St_ResInfo */
4801 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304802 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4803 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
4804 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004805 /* si+Ext_ResInfo */
4806 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004808 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
4809 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304810 }
4811
4812 tempax = 0;
4813
4814 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4815 tempax |= 0x0800;
4816
4817 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4818 tempax |= 0x0400;
4819
4820 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4821 tempax |= 0x0200;
4822
Peter Huewe599801f2012-02-09 21:11:45 +01004823 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 tempax |= 0x1000;
4825
Peter Huewe599801f2012-02-09 21:11:45 +01004826 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827 tempax |= 0x0100;
4828
Peter Huewe599801f2012-02-09 21:11:45 +01004829 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304830 tempax &= 0xfe00;
4831
4832 tempax = (tempax & 0xff00) >> 8;
4833
Aaro Koskinen8104e322011-03-13 12:26:22 +02004834 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304835 TimingPoint = pVBInfo->NTSCTiming;
4836
Peter Huewe599801f2012-02-09 21:11:45 +01004837 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304838 TimingPoint = pVBInfo->PALTiming;
4839
Peter Huewe599801f2012-02-09 21:11:45 +01004840 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 TimingPoint = pVBInfo->HiTVExtTiming;
4842
4843 if (pVBInfo->VBInfo & SetInSlaveMode)
4844 TimingPoint = pVBInfo->HiTVSt2Timing;
4845
4846 if (pVBInfo->SetFlag & TVSimuMode)
4847 TimingPoint = pVBInfo->HiTVSt1Timing;
4848
4849 if (!(modeflag & Charx8Dot))
4850 TimingPoint = pVBInfo->HiTVTextTiming;
4851 }
4852
Peter Huewe599801f2012-02-09 21:11:45 +01004853 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4854 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304855 TimingPoint = pVBInfo->YPbPr525iTiming;
4856
Peter Huewe599801f2012-02-09 21:11:45 +01004857 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304858 TimingPoint = pVBInfo->YPbPr525pTiming;
4859
Peter Huewe599801f2012-02-09 21:11:45 +01004860 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304861 TimingPoint = pVBInfo->YPbPr750pTiming;
4862 }
4863
4864 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004865 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304866
4867 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004868 /* di->temp2[j] */
4869 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304870
4871 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004872 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304873
4874 temp = pVBInfo->NewFlickerMode;
4875 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004876 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304877
Peter Huewe599801f2012-02-09 21:11:45 +01004878 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304879 tempax = 950;
4880
Peter Huewe599801f2012-02-09 21:11:45 +01004881 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304882 tempax = 520;
4883 else
4884 tempax = 440;
4885
4886 if (pVBInfo->VDE <= tempax) {
4887 tempax -= pVBInfo->VDE;
4888 tempax = tempax >> 2;
4889 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4890 push1 = tempax;
4891 temp = (tempax & 0xFF00) >> 8;
4892 temp += (unsigned short) TimingPoint[0];
4893
Peter Huewe6896b942012-02-09 21:11:46 +01004894 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4895 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304896 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4897 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004898 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304899 tempcx = pVBInfo->VGAHDE;
4900 if (tempcx >= 1024) {
4901 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004902 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304903 temp = 0x19; /* PAL */
4904 }
4905 }
4906 }
4907
Aaro Koskinen8104e322011-03-13 12:26:22 +02004908 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304909 tempax = push1;
4910 temp = (tempax & 0xFF00) >> 8;
4911 temp += TimingPoint[1];
4912
Peter Huewe6896b942012-02-09 21:11:46 +01004913 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4914 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304915 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4916 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004917 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304918 tempcx = pVBInfo->VGAHDE;
4919 if (tempcx >= 1024) {
4920 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004921 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304922 temp = 0x52; /* PAL */
4923 }
4924 }
4925 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004926 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304927 }
4928
4929 /* 301b */
4930 tempcx = pVBInfo->HT;
4931
4932 if (XGI_IsLCDDualLink(pVBInfo))
4933 tempcx = tempcx >> 1;
4934
4935 tempcx -= 2;
4936 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004937 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304938
4939 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004940 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304941
4942 tempcx = pVBInfo->HT >> 1;
4943 push1 = tempcx; /* push cx */
4944 tempcx += 7;
4945
Peter Huewe599801f2012-02-09 21:11:45 +01004946 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304947 tempcx -= 4;
4948
4949 temp = tempcx & 0x00FF;
4950 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004951 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304952
4953 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4954 tempbx += tempcx;
4955 push2 = tempbx;
4956 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004957 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 temp = (tempbx & 0xFF00) >> 8;
4959 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004960 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304961
4962 tempbx = push2;
4963 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004964 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304965 tempbx = tempbx - 4;
4966 tempcx = tempbx;
4967 }
4968
4969 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004970 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304971
4972 j += 2;
4973 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4974 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004975 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304976 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004977 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304978
4979 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004980 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304981 tempcx -= 4;
4982
4983 temp = tempcx & 0xFF;
4984 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004985 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304986
4987 tempcx = push1; /* pop cx */
4988 j += 2;
4989 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4990 tempcx -= temp;
4991 temp = tempcx & 0x00FF;
4992 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004993 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304994
4995 tempcx -= 11;
4996
4997 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4998 tempax = XGI_GetVGAHT2(pVBInfo);
4999 tempcx = tempax - 1;
5000 }
5001 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005002 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305003
5004 tempbx = pVBInfo->VDE;
5005
5006 if (pVBInfo->VGAVDE == 360)
5007 tempbx = 746;
5008 if (pVBInfo->VGAVDE == 375)
5009 tempbx = 746;
5010 if (pVBInfo->VGAVDE == 405)
5011 tempbx = 853;
5012
5013 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005014 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005015 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005016 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01005017 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305018 tempbx = tempbx >> 1;
5019 } else
5020 tempbx = tempbx >> 1;
5021 }
5022
5023 tempbx -= 2;
5024 temp = tempbx & 0x00FF;
5025
Peter Huewe599801f2012-02-09 21:11:45 +01005026 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01005027 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005028 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305029 if (pVBInfo->VBInfo & SetInSlaveMode) {
5030 if (ModeNo == 0x2f)
5031 temp += 1;
5032 }
5033 }
5034 } else {
5035 if (pVBInfo->VBInfo & SetInSlaveMode) {
5036 if (ModeNo == 0x2f)
5037 temp += 1;
5038 }
5039 }
5040 }
5041
Aaro Koskinen8104e322011-03-13 12:26:22 +02005042 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043
5044 temp = (tempcx & 0xFF00) >> 8;
5045 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5046
Peter Huewe599801f2012-02-09 21:11:45 +01005047 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01005048 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005049 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305050 temp |= 0x10;
5051
5052 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5053 temp |= 0x20;
5054 }
5055 } else {
5056 temp |= 0x10;
5057 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5058 temp |= 0x20;
5059 }
5060 }
5061
Aaro Koskinen8104e322011-03-13 12:26:22 +02005062 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305063
Peter Huewe6896b942012-02-09 21:11:46 +01005064 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5065 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305066 tempbx = pVBInfo->VDE;
5067 tempcx = tempbx - 2;
5068
5069 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01005070 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
5071 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305072 tempbx = tempbx >> 1;
5073 }
5074
Peter Huewe6896b942012-02-09 21:11:46 +01005075 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305076 temp = 0;
5077 if (tempcx & 0x0400)
5078 temp |= 0x20;
5079
5080 if (tempbx & 0x0400)
5081 temp |= 0x40;
5082
Aaro Koskinen8104e322011-03-13 12:26:22 +02005083 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305084 }
5085
5086 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005087 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305088 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005089 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305090 }
5091
5092 tempbx = tempbx & 0x00FF;
5093
5094 if (!(modeflag & HalfDCLK)) {
5095 tempcx = pVBInfo->VGAHDE;
5096 if (tempcx >= pVBInfo->HDE) {
5097 tempbx |= 0x2000;
5098 tempax &= 0x00FF;
5099 }
5100 }
5101
5102 tempcx = 0x0101;
5103
5104 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5105 if (pVBInfo->VGAHDE >= 1024) {
5106 tempcx = 0x1920;
5107 if (pVBInfo->VGAHDE >= 1280) {
5108 tempcx = 0x1420;
5109 tempbx = tempbx & 0xDFFF;
5110 }
5111 }
5112 }
5113
5114 if (!(tempbx & 0x2000)) {
5115 if (modeflag & HalfDCLK)
5116 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5117
5118 push1 = tempbx;
5119 tempeax = pVBInfo->VGAHDE;
5120 tempebx = (tempcx & 0xFF00) >> 8;
5121 longtemp = tempeax * tempebx;
5122 tempecx = tempcx & 0x00FF;
5123 longtemp = longtemp / tempecx;
5124
5125 /* 301b */
5126 tempecx = 8 * 1024;
5127
Peter Huewe6896b942012-02-09 21:11:46 +01005128 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5129 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305130 tempecx = tempecx * 8;
5131 }
5132
5133 longtemp = longtemp * tempecx;
5134 tempecx = pVBInfo->HDE;
5135 temp2 = longtemp % tempecx;
5136 tempeax = longtemp / tempecx;
5137 if (temp2 != 0)
5138 tempeax += 1;
5139
5140 tempax = (unsigned short) tempeax;
5141
5142 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005143 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5144 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305145 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5146 }
5147 /* end 301b */
5148
5149 tempbx = push1;
5150 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5151 | (tempbx & 0x00FF));
5152 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5153 | (tempax & 0x00FF));
5154 temp = (tempax & 0xFF00) >> 8;
5155 } else {
5156 temp = (tempax & 0x00FF) >> 8;
5157 }
5158
Aaro Koskinen8104e322011-03-13 12:26:22 +02005159 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305160 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005161 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 temp = tempcx & 0x00FF;
5163
5164 if (tempbx & 0x2000)
5165 temp = 0;
5166
5167 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5168 temp |= 0x18;
5169
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005170 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01005171 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305172 tempbx = 0x0382;
5173 tempcx = 0x007e;
5174 } else {
5175 tempbx = 0x0369;
5176 tempcx = 0x0061;
5177 }
5178
5179 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005180 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305181 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005182 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305183
5184 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5185 temp = temp << 2;
5186 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5187
Peter Huewe599801f2012-02-09 21:11:45 +01005188 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305189 temp |= 0x10;
5190
Peter Huewe599801f2012-02-09 21:11:45 +01005191 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305192 temp |= 0x20;
5193
Peter Huewe599801f2012-02-09 21:11:45 +01005194 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305195 temp |= 0x60;
5196 }
5197
Aaro Koskinen8104e322011-03-13 12:26:22 +02005198 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005199 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005200 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305201
Peter Huewe599801f2012-02-09 21:11:45 +01005202 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305203 if (pVBInfo->TVInfo & NTSC1024x768) {
5204 TimingPoint = XGI_NTSC1024AdjTime;
5205 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005206 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305207 TimingPoint[j]);
5208 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005209 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305210 }
5211 }
5212
5213 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5214 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01005215 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005216 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305217 0x08); /* PALM Mode */
5218 }
5219
Peter Huewe599801f2012-02-09 21:11:45 +01005220 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005221 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305222 0x01);
5223 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005224 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305225
Aaro Koskinendc505562011-03-13 12:26:26 +02005226 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305227 }
5228
Peter Huewe599801f2012-02-09 21:11:45 +01005229 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305230 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005231 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305232 }
5233
5234 if (pVBInfo->VBInfo & SetCRT2ToTV)
5235 return;
5236}
5237
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005238static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305239 struct xgi_hw_device_info *HwDeviceExtension,
5240 unsigned short RefreshRateTableIndex,
5241 struct vb_device_info *pVBInfo)
5242{
5243 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5244 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5245
5246 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5247
5248 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005249 /* si+St_ResInfo */
5250 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5252 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005253 /* si+Ext_ResInfo */
5254 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305255 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005256 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5257 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305258 CRT1Index &= IndexMask;
5259 }
5260
5261 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5262 return;
5263
5264 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5265
5266 if (XGI_IsLCDDualLink(pVBInfo))
5267 tempbx = tempbx >> 1;
5268
5269 tempbx -= 1;
5270 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005271 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305272 temp = (tempbx & 0xFF00) >> 8;
5273 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005274 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305275 temp = 0x01;
5276
Peter Huewe255aabd2012-02-09 21:11:44 +01005277 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305278 if (pVBInfo->ModeType == ModeEGA) {
5279 if (pVBInfo->VGAHDE >= 1024) {
5280 temp = 0x02;
Peter Huewea3d675c2012-02-09 21:11:47 +01005281 if (pVBInfo->LCDInfo & XGI_LCDVESATiming)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305282 temp = 0x01;
5283 }
5284 }
5285 }
5286
Aaro Koskinen8104e322011-03-13 12:26:22 +02005287 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305288 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5289 push1 = tempbx;
5290 tempbx--;
5291 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005292 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305293 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005294 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305295
5296 tempcx = pVBInfo->VT - 1;
5297 push2 = tempcx + 1;
5298 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005299 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305300 temp = (tempcx & 0xFF00) >> 8;
5301 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005302 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005303 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5304 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5305 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5306 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305307
5308 /* Customized LCDB Des no add */
5309 tempbx = 5;
5310 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5311 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5312 tempah = pVBInfo->LCDResInfo;
5313 tempah &= PanelResInfo;
5314
Peter Huewe255aabd2012-02-09 21:11:44 +01005315 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305316 tempbx = 1024;
5317 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01005318 } else if ((tempah == Panel_1280x1024) ||
5319 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305320 tempbx = 1280;
5321 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01005322 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305323 tempbx = 1400;
5324 tempcx = 1050;
5325 } else {
5326 tempbx = 1600;
5327 tempcx = 1200;
5328 }
5329
5330 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5331 tempbx = pVBInfo->HDE;
5332 tempcx = pVBInfo->VDE;
5333 }
5334
5335 pushbx = tempbx;
5336 tempax = pVBInfo->VT;
5337 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5338 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5339 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5340 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5341 tempbx = pVBInfo->LCDVDES;
5342 tempcx += tempbx;
5343
5344 if (tempcx >= tempax)
5345 tempcx -= tempax; /* lcdvdes */
5346
5347 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005348 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305349 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005350 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305351 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5352 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5353 tempah = tempch;
5354 tempah = tempah << 3;
5355 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005356 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305357
5358 /* getlcdsync() */
5359 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5360 tempcx = tempbx;
5361 tempax = pVBInfo->VT;
5362 tempbx = pVBInfo->LCDVRS;
5363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305364 tempcx += tempbx;
5365 if (tempcx >= tempax)
5366 tempcx -= tempax;
5367
5368 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005369 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305370 temp = (tempbx & 0xFF00) >> 8;
5371 temp = temp << 4;
5372 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005373 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305374 tempcx = pushbx;
5375 tempax = pVBInfo->HT;
5376 tempbx = pVBInfo->LCDHDES;
5377 tempbx &= 0x0FFF;
5378
5379 if (XGI_IsLCDDualLink(pVBInfo)) {
5380 tempax = tempax >> 1;
5381 tempbx = tempbx >> 1;
5382 tempcx = tempcx >> 1;
5383 }
5384
Peter Huewe6896b942012-02-09 21:11:46 +01005385 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305386 tempbx += 1;
5387
5388 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5389 tempbx += 1;
5390
5391 tempcx += tempbx;
5392
5393 if (tempcx >= tempax)
5394 tempcx -= tempax;
5395
5396 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005397 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305398 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005399 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305400 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005401 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305402 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005403 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305404
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305405 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5406 tempcx = tempax;
5407 tempax = pVBInfo->HT;
5408 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305409 if (XGI_IsLCDDualLink(pVBInfo)) {
5410 tempax = tempax >> 1;
5411 tempbx = tempbx >> 1;
5412 tempcx = tempcx >> 1;
5413 }
5414
Peter Huewe6896b942012-02-09 21:11:46 +01005415 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305416 tempbx += 1;
5417
5418 tempcx += tempbx;
5419
5420 if (tempcx >= tempax)
5421 tempcx -= tempax;
5422
5423 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005424 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305425
5426 temp = (tempbx & 0xFF00) >> 8;
5427 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005428 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005430 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305431
Peter Huewea3d675c2012-02-09 21:11:47 +01005432 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305433 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01005434 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5435 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305436 | VB_XGI301C)) {
5437 temp = 0xC6;
5438 } else
5439 temp = 0xC4;
5440
Aaro Koskinen8104e322011-03-13 12:26:22 +02005441 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5442 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305443 }
5444
5445 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01005446 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5447 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305448 | VB_XGI301C)) {
5449 temp = 0x4F;
5450 } else
5451 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005452 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305453 }
5454 }
5455}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005456
5457/* --------------------------------------------------------------------- */
5458/* Function : XGI_GetTap4Ptr */
5459/* Input : */
5460/* Output : di -> Tap4 Reg. Setting Pointer */
5461/* Description : */
5462/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005463static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305464 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005465{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305466 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305468 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005469
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305470 if (tempcx == 0) {
5471 tempax = pVBInfo->VGAHDE;
5472 tempbx = pVBInfo->HDE;
5473 } else {
5474 tempax = pVBInfo->VGAVDE;
5475 tempbx = pVBInfo->VDE;
5476 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005477
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005478 if (tempax <= tempbx)
5479 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305480 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005481 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005482
Peter Huewe599801f2012-02-09 21:11:45 +01005483 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305484 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005485
Peter Huewe599801f2012-02-09 21:11:45 +01005486 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
5487 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
5488 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005489 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01005490 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305491 Tap4TimingPtr = YPbPr750pTap4Timing;
5492 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005493
Peter Huewe599801f2012-02-09 21:11:45 +01005494 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005495 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005496
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305497 i = 0;
5498 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5499 if (Tap4TimingPtr[i].DE == tempax)
5500 break;
5501 i++;
5502 }
5503 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005504}
5505
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005506static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005507{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305508 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005509
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305510 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305512 if (!(pVBInfo->VBType & VB_XGI301C))
5513 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305515 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5516 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005517 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005518
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005519 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01005520 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005521 /* Set Vertical Scaling */
5522 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305523 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005524 xgifb_reg_set(pVBInfo->Part2Port,
5525 i,
5526 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305527 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005528
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005529 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01005530 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005531 /* Enable V.Scaling */
5532 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305533 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005534 /* Enable H.Scaling */
5535 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005536}
5537
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005538static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305539 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005540{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305541 unsigned short i;
5542 unsigned char *tempdi;
5543 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305545 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005546 /* si+St_ResInfo */
5547 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305548 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005549 /* si+Ext_ResInfo */
5550 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005551
Aaro Koskinen8104e322011-03-13 12:26:22 +02005552 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01005553 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005554 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5555 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305556 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005557 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5558 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305559 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305561 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5562 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005563
Peter Huewe599801f2012-02-09 21:11:45 +01005564 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005565 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5566 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
5567 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005569
Peter Huewe599801f2012-02-09 21:11:45 +01005570 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
5571 & SetCRT2ToYPbPr525750)) {
5572 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305573 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305575 tempdi = pVBInfo->HiTVGroup3Data;
5576 if (pVBInfo->SetFlag & TVSimuMode) {
5577 tempdi = pVBInfo->HiTVGroup3Simu;
5578 if (!(modeflag & Charx8Dot))
5579 tempdi = pVBInfo->HiTVGroup3Text;
5580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005581
Peter Huewe599801f2012-02-09 21:11:45 +01005582 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305583 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005584
Peter Huewe599801f2012-02-09 21:11:45 +01005585 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305586 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305588 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005589 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305591 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01005592 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005593 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305594 }
5595 }
5596 return;
5597} /* {end of XGI_SetGroup3} */
5598
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005599static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305600 unsigned short RefreshRateTableIndex,
5601 struct xgi_hw_device_info *HwDeviceExtension,
5602 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005603{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305604 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305606 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305608 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005609 /* si+St_ResInfo */
5610 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305611 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005612 /* si+Ext_ResInfo */
5613 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305615 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005616 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005617
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305618 tempbx = pVBInfo->RVBHCMAX;
5619 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005620 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305621 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
5622 tempcx = pVBInfo->VGAHT - 1;
5623 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005624 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305626 temp = ((tempcx & 0xFF00) >> 8) << 3;
5627 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305629 tempcx = pVBInfo->VGAVT - 1;
5630 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5631 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305633 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005634 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005636 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005637 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305638 tempcx = pVBInfo->VBInfo;
5639 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305641 if (modeflag & HalfDCLK)
5642 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305644 if (XGI_IsLCDDualLink(pVBInfo))
5645 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005646
Peter Huewe599801f2012-02-09 21:11:45 +01005647 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 temp = 0;
5649 if (tempbx <= 1024)
5650 temp = 0xA0;
5651 if (tempbx == 1280)
5652 temp = 0xC0;
5653 } else if (tempcx & SetCRT2ToTV) {
5654 temp = 0xA0;
5655 if (tempbx <= 800)
5656 temp = 0x80;
5657 } else {
5658 temp = 0x80;
5659 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5660 temp = 0;
5661 if (tempbx > 800)
5662 temp = 0x60;
5663 }
5664 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005665
Peter Huewe599801f2012-02-09 21:11:45 +01005666 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305667 temp = 0x00;
5668 if (pVBInfo->VGAHDE == 1280)
5669 temp = 0x40;
5670 if (pVBInfo->VGAHDE == 1024)
5671 temp = 0x20;
5672 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005673 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005674
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305675 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005676
Peter Huewe599801f2012-02-09 21:11:45 +01005677 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305678 if (!(temp & 0xE000))
5679 tempbx = tempbx >> 1;
5680 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305682 tempcx = pVBInfo->RVBHRS;
5683 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005684 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305686 tempeax = pVBInfo->VGAVDE;
5687 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305689 if (tempeax <= tempebx) {
5690 tempcx = (tempcx & (~0x4000));
5691 tempeax = pVBInfo->VGAVDE;
5692 } else {
5693 tempeax -= tempebx;
5694 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005695
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305696 templong = (tempeax * 256 * 1024) % tempebx;
5697 tempeax = (tempeax * 256 * 1024) / tempebx;
5698 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305700 if (templong != 0)
5701 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305703 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005704 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005705
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305706 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005707 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305708 tempbx = (unsigned short) (tempebx >> 16);
5709 temp = tempbx & 0x00FF;
5710 temp = temp << 4;
5711 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005712 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005713
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305714 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01005715 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5716 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305717 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005718 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305719 tempax = pVBInfo->VGAHDE;
5720 if (modeflag & HalfDCLK)
5721 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305723 if (XGI_IsLCDDualLink(pVBInfo))
5724 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305726 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5727 if (tempax > 800)
5728 tempax -= 800;
5729 } else {
5730 if (pVBInfo->VGAHDE > 800) {
5731 if (pVBInfo->VGAHDE == 1024)
5732 tempax = (tempax * 25 / 32) - 1;
5733 else
5734 tempax = (tempax * 20 / 32) - 1;
5735 }
5736 }
5737 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 temp = (tempax & 0xFF00) >> 8;
5740 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005741 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005743 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005744
Peter Huewe599801f2012-02-09 21:11:45 +01005745 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305746 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005747 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305749 }
5750 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305752 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5753 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01005754 | TVSetYPbPr525p | TVSetYPbPr750p
5755 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305756 temp |= 0x0001;
5757 if ((pVBInfo->VBInfo & SetInSlaveMode)
5758 && (!(pVBInfo->TVInfo
5759 & TVSimuMode)))
5760 temp &= (~0x0001);
5761 }
5762 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005763
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005764 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305765 tempbx = pVBInfo->HT;
5766 if (XGI_IsLCDDualLink(pVBInfo))
5767 tempbx = tempbx >> 1;
5768 tempbx = (tempbx >> 1) - 2;
5769 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005770 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305771 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005772 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305773 }
5774 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305776 if (pVBInfo->ISXPDOS == 0)
5777 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5778 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005779}
5780
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005781static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5782{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005783 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005784}
5785
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005786static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305787 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005788{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305791 Pindex = pVBInfo->Part5Port;
5792 Pdata = pVBInfo->Part5Port + 1;
5793 if (pVBInfo->ModeType == ModeVGA) {
5794 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01005795 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305796 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305797 }
5798 }
5799 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005800}
5801
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005802static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305803 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005804{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005805 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005806}
5807
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005808static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305809 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005810{
5811
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005812 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005813}
5814
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005815static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
5816 unsigned short ModeNo, unsigned short ModeIdIndex,
5817 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005818{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005819 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305821 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
5822 if (ModeNo <= 0x13) {
5823 xres = pVBInfo->StResInfo[resindex].HTotal;
5824 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005825 /* si+St_ResInfo */
5826 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305827 } else {
5828 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5829 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005830 /* si+St_ModeFlag */
5831 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305832 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305834 if (!(modeflag & Charx8Dot)) {
5835 xres /= 9;
5836 xres *= 8;
5837 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305839 if (ModeNo > 0x13) {
5840 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
5841 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305843 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5844 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305846 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005847
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005848 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305849 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04005850
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005851 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305852 return 0;
5853
5854 if (ModeNo > 0x13) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005855 if (xres != xgifb_info->lvds_data.LVDSHDE ||
5856 yres != xgifb_info->lvds_data.LVDSVDE) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005857 colordepth = XGI_GetColorDepth(ModeNo,
5858 ModeIdIndex,
5859 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305860 if (colordepth > 2)
5861 return 0;
5862
5863 }
5864 }
5865 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866}
5867
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005868static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
5869 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005870 unsigned short ModeNo,
5871 unsigned short ModeIdIndex,
5872 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005873{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305874 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005875 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305876 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
5877 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
5878 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005879
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005880 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005881 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305882 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005883 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005884
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005885 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005886
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005887 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005888 /* SR35[7] FP VSync polarity */
5889 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
5890 /* SR30[5] FP HSync polarity */
5891 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005892
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005893 if (chip_id == XG27)
5894 XGI_SetXG27FPBits(pVBInfo);
5895 else
5896 XGI_SetXG21FPBits(pVBInfo);
5897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305898 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
5899 if (ModeNo <= 0x13) {
5900 xres = pVBInfo->StResInfo[resindex].HTotal;
5901 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005902 /* si+St_ResInfo */
5903 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305904 } else {
5905 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
5906 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005907 /* si+St_ModeFlag */
5908 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305909 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305911 if (!(modeflag & Charx8Dot))
5912 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005913
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005914 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005915
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005916 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305917 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
5918 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305920 if (LVDSHBS > LVDSHT)
5921 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005922
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005923 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305924 if (LVDSHRS > LVDSHT)
5925 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005926
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005927 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305928 if (LVDSHRE > LVDSHT)
5929 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005930
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005931 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005932
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005933 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005934
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005935 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305936 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
5937 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305939 if (LVDSVBS > LVDSVT)
5940 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005941
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005942 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305943 if (LVDSVRS > LVDSVT)
5944 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005945
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005946 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305947 if (LVDSVRE > LVDSVT)
5948 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005949
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005950 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005951
Aaro Koskinen58839b02011-03-13 12:26:23 +02005952 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005953 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005954
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305955 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005956 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305958 /* HT SR0B[1:0] CR00 */
5959 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005960 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005961 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305963 /* HBS SR0B[5:4] CR02 */
5964 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005965 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005966 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305968 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5969 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005970 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5971 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5972 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005973
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305974 /* HRS SR0B[7:6] CR04 */
5975 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005976 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005977 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005978
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305979 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5980 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005981 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005982 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305984 /* HRE SR0C[2] CR05[4:0] */
5985 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005986 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5987 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305989 /* Panel HRE SR2F[7:2] */
5990 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005991 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305993 /* VT SR0A[0] CR07[5][0] CR06 */
5994 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005995 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5996 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5997 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005998 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306000 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6001 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006002 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6003 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6004 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006005 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006006
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306007 /* VBE SR0A[4] CR16 */
6008 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006009 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006010 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306012 /* VRS SR0A[3] CR7[7][2] CR10 */
6013 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006014 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6015 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6016 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006017 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006018
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006019 if (chip_id == XG27) {
6020 /* Panel VRS SR35[2:0] SR34[7:0] */
6021 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
6022 (value & 0x700) >> 8);
6023 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
6024 } else {
6025 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6026 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
6027 (value & 0x600) >> 9);
6028 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
6029 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
6030 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306032 /* VRE SR0A[5] CR11[3:0] */
6033 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006034 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6035 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306037 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006038 if (chip_id == XG27)
6039 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6040 (value << 2) & 0xFC);
6041 else
6042 /* SR3F[7] has to be 0, h/w bug */
6043 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6044 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006045
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306046 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006047
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006048 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006049 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006050 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006051 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006052 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306053 value += 0x10;
6054 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006055
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306056 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006057 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006058 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006059 /* set data, panning = 0, shift left 1 dot*/
6060 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006061
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006062 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006063 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306064
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006065 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306066 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006067
6068}
6069
6070/* --------------------------------------------------------------------- */
6071/* Function : XGI_IsLCDON */
6072/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006073/* Output : 0 : Skip PSC Control */
6074/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006075/* Description : */
6076/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006077static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006078{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306079 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006080
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306081 tempax = pVBInfo->VBInfo;
6082 if (tempax & SetCRT2ToDualEdge)
6083 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01006084 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306085 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306087 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006088}
6089
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006090/* --------------------------------------------------------------------- */
6091/* Function : XGI_DisableChISLCD */
6092/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006093/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006094/* Description : */
6095/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006096static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006097{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306098 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006099
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306100 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006101 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006102
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306103 if (tempbx & (EnableChA | DisableChA)) {
6104 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6105 return 0;
6106 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306108 if (!(tempbx & (EnableChB | DisableChB)))
6109 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306111 if (tempah & 0x01) /* Chk LCDB Mode */
6112 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306114 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006115}
6116
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006117/* --------------------------------------------------------------------- */
6118/* Function : XGI_EnableChISLCD */
6119/* Input : */
6120/* Output : 0 -> Not LCD mode */
6121/* Description : */
6122/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006123static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006124{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306125 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306127 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006128 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006129
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306130 if (tempbx & (EnableChA | DisableChA)) {
6131 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6132 return 0;
6133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006134
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306135 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006136 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006137
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306138 if (tempah & 0x01) /* Chk LCDB Mode */
6139 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306141 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006142}
6143
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006144static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
6145 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306146 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006147{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006148 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006149
Peter Huewe6896b942012-02-09 21:11:46 +01006150 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6151 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306152 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006153 if (!(pVBInfo->VBInfo &
6154 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006155 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306156 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6157 tempah = 0x7F; /* Disable Channel A */
Peter Huewea3d675c2012-02-09 21:11:47 +01006158 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006159 /* Disable Channel B */
6160 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306162 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006163 /* force to disable Cahnnel */
6164 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306166 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006167 /* Force to disable Channel B */
6168 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306169 }
6170 }
6171 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006172
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006173 /* disable part4_1f */
6174 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006175
Peter Huewe6896b942012-02-09 21:11:46 +01006176 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006177 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306178 || (XGI_DisableChISLCD(pVBInfo))
6179 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006180 /* LVDS Driver power down */
6181 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306182 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306184 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01006185 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306186 | SetSimuScanMode))) {
6187 if (pVBInfo->SetFlag & GatingCRT)
6188 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006189 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306190 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006191
Peter Huewea3d675c2012-02-09 21:11:47 +01006192 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306193 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01006194 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006195 /* Power down */
6196 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306197 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006198
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006199 /* disable TV as primary VGA swap */
6200 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306202 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02006203 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006204
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006205 if ((pVBInfo->SetFlag & DisableChB) ||
6206 (pVBInfo->VBInfo &
6207 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01006208 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006209 (pVBInfo->VBInfo &
6210 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006211 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006212
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006213 if ((pVBInfo->SetFlag & DisableChB) ||
6214 (pVBInfo->VBInfo &
6215 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01006216 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006217 (pVBInfo->VBInfo &
6218 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
6219 /* save Part1 index 0 */
6220 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
6221 /* BTDAC = 1, avoid VB reset */
6222 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
6223 /* disable CRT2 */
6224 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6225 /* restore Part1 index 0 */
6226 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306227 }
6228 } else { /* {301} */
6229 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006230 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
6231 /* Disable CRT2 */
6232 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6233 /* Disable TV asPrimary VGA swap */
6234 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306235 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006236
Peter Huewea3d675c2012-02-09 21:11:47 +01006237 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306238 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006239 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306240 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006241}
6242
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006243/* --------------------------------------------------------------------- */
6244/* Function : XGI_GetTVPtrIndex */
6245/* Input : */
6246/* Output : */
6247/* Description : bx 0 : ExtNTSC */
6248/* 1 : StNTSC */
6249/* 2 : ExtPAL */
6250/* 3 : StPAL */
6251/* 4 : ExtHiTV */
6252/* 5 : StHiTV */
6253/* 6 : Ext525i */
6254/* 7 : St525i */
6255/* 8 : Ext525p */
6256/* 9 : St525p */
6257/* A : Ext750p */
6258/* B : St750p */
6259/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006260static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006261{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306262 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006263
Peter Huewe599801f2012-02-09 21:11:45 +01006264 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306265 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01006266 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306267 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01006268 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306269 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01006270 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306271 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01006272 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306273 tempbx = 10;
6274 if (pVBInfo->TVInfo & TVSimuMode)
6275 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306277 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006278}
6279
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006280/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006281/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006282/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006283/* Output : bx 0 : NTSC */
6284/* 1 : PAL */
6285/* 2 : PALM */
6286/* 3 : PALN */
6287/* 4 : NTSC1024x768 */
6288/* 5 : PAL-M 1024x768 */
6289/* 6-7: reserved */
6290/* cl 0 : YFilter1 */
6291/* 1 : YFilter2 */
6292/* ch 0 : 301A */
6293/* 1 : 301B/302B/301LV/302LV */
6294/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006295/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006296static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
6297 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006298{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006299 *tempbx = 0;
6300 *tempcl = 0;
6301 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006302
Peter Huewe599801f2012-02-09 21:11:45 +01006303 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006304 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006305
Peter Huewe599801f2012-02-09 21:11:45 +01006306 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006307 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006308
Peter Huewe599801f2012-02-09 21:11:45 +01006309 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006310 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006311
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006312 if (pVBInfo->TVInfo & NTSC1024x768) {
6313 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01006314 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006315 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306316 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006317
Peter Huewe6896b942012-02-09 21:11:46 +01006318 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6319 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006320 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
6321 & TVSimuMode)) {
6322 *tempbx += 8;
6323 *tempcl += 1;
6324 }
6325 }
6326
Peter Huewe6896b942012-02-09 21:11:46 +01006327 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6328 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006329 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006330}
6331
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006332static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006333{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306334 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306336 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006337
Peter Huewe6896b942012-02-09 21:11:46 +01006338 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6339 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006340 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306341 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
6342 tempbl = 0;
6343 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306345 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
6346 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006347
Peter Huewe6896b942012-02-09 21:11:46 +01006348 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6349 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306350 | VB_XGI301C))
6351 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306353 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6354 tempbl = tempbl >> 4;
Peter Huewea3d675c2012-02-09 21:11:47 +01006355 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006356 /* Get LCD Delay */
6357 index = XGI_GetLCDCapPtr(pVBInfo);
6358 tempbh = pVBInfo->LCDCapList[index].
6359 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006360
Peter Huewea3d675c2012-02-09 21:11:47 +01006361 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306362 tempbl = tempbh;
6363 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306365 tempbl &= 0x0F;
6366 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02006367 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306369 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
6370 | SetCRT2ToTV)) { /* Channel B */
6371 tempah &= 0xF0;
6372 tempah |= tempbl;
6373 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006374
Peter Huewea3d675c2012-02-09 21:11:47 +01006375 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) { /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306376 tempah &= 0x0F;
6377 tempah |= tempbh;
6378 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006379 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306380 }
6381 } else if (pVBInfo->IF_DEF_LVDS == 1) {
6382 tempbl = 0;
6383 tempbh = 0;
6384 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006385 /* / Get LCD Delay */
6386 tempah = pVBInfo->LCDCapList[
6387 XGI_GetLCDCapPtr(pVBInfo)].
6388 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306389 tempah &= 0x0f;
6390 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006391 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306392 tempah);
6393 }
6394 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006395}
6396
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006397static void XGI_SetLCDCap_A(unsigned short tempcx,
6398 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006399{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306400 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006401
Aaro Koskinen58839b02011-03-13 12:26:23 +02006402 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306404 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006405 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006406 /* Enable Dither */
6407 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006408 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306409 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006410 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306411 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006412 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306413 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006414}
6415
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006416/* --------------------------------------------------------------------- */
6417/* Function : XGI_SetLCDCap_B */
6418/* Input : cx -> LCD Capability */
6419/* Output : */
6420/* Description : */
6421/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006422static void XGI_SetLCDCap_B(unsigned short tempcx,
6423 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006424{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306425 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006426 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306427 (unsigned short) (((tempcx & 0x00ff) >> 6)
6428 | 0x0c));
6429 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006430 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306431 (unsigned short) (((tempcx & 0x00ff) >> 6)
6432 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006433}
6434
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02006435static void XGI_LongWait(struct vb_device_info *pVBInfo)
6436{
6437 unsigned short i;
6438
6439 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
6440
6441 if (!(i & 0xC0)) {
6442 for (i = 0; i < 0xFFFF; i++) {
6443 if (!(inb(pVBInfo->P3da) & 0x08))
6444 break;
6445 }
6446
6447 for (i = 0; i < 0xFFFF; i++) {
6448 if ((inb(pVBInfo->P3da) & 0x08))
6449 break;
6450 }
6451 }
6452}
6453
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006454static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006455{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306456 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306458 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006459
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006460 /* disable down spectrum D[4] */
6461 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306462 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006463 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306464 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006465
Aaro Koskinen8104e322011-03-13 12:26:22 +02006466 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306467 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006468 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306469 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006470 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306471 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006472 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306473 pVBInfo->LCDCapList[index].Spectrum_34);
6474 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006475 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006476}
6477
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006478static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
6479{
6480 unsigned short tempcx;
6481
6482 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
6483
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006484 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01006485 (VB_SIS301B |
6486 VB_SIS302B |
6487 VB_SIS301LV |
6488 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006489 VB_XGI301C)) { /* 301LV/302LV only */
6490 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01006491 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006492 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006493 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006494 (unsigned char) (tempcx & 0x1F));
6495 }
6496 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006497 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006498 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
6499 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
6500 | EnablePLLSPLOW)) >> 8));
6501 }
6502
Peter Huewe6896b942012-02-09 21:11:46 +01006503 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6504 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006505 if (pVBInfo->VBInfo & SetCRT2ToLCD)
6506 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01006507 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006508 XGI_SetLCDCap_A(tempcx, pVBInfo);
6509
Peter Huewe6896b942012-02-09 21:11:46 +01006510 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006511 if (tempcx & EnableSpectrum)
6512 SetSpectrum(pVBInfo);
6513 }
6514 } else {
6515 /* LVDS,CH7017 */
6516 XGI_SetLCDCap_A(tempcx, pVBInfo);
6517 }
6518}
6519
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006520/* --------------------------------------------------------------------- */
6521/* Function : XGI_SetAntiFlicker */
6522/* Input : */
6523/* Output : */
6524/* Description : Set TV Customized Param. */
6525/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006526static void XGI_SetAntiFlicker(unsigned short ModeNo,
6527 unsigned short ModeIdIndex,
6528 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006529{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306530 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006531
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306532 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006533
Peter Huewe599801f2012-02-09 21:11:45 +01006534 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306535 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006536
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306537 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6538 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306540 if (ModeNo <= 0x13)
6541 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
6542 else
6543 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306545 tempbx += index;
6546 tempah = TVAntiFlickList[tempbx];
6547 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006548
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006549 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006550}
6551
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006552static void XGI_SetEdgeEnhance(unsigned short ModeNo,
6553 unsigned short ModeIdIndex,
6554 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006555{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306556 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006557
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306558 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306560 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6561 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006562
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306563 if (ModeNo <= 0x13)
6564 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
6565 else
6566 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306568 tempbx += index;
6569 tempah = TVEdgeList[tempbx];
6570 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006571
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006572 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006573}
6574
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006575static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006576{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306577 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006578
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306579 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306581 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006582
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306583 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
6584 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006585
Aaro Koskinen8104e322011-03-13 12:26:22 +02006586 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306587 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006588 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306589 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006590 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306591 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006592 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306593 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006594}
6595
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006596static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306597 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006598{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306599 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306601 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306603 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306605 switch (tempbx) {
6606 case 0x00:
6607 case 0x04:
6608 filterPtr = NTSCYFilter1;
6609 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306611 case 0x01:
6612 filterPtr = PALYFilter1;
6613 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306615 case 0x02:
6616 case 0x05:
6617 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306618 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03006619 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306620 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306622 case 0x08:
6623 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306624 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306625 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306626 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03006627 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306628 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306630 default:
6631 return;
6632 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306634 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006635 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
6636 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306637 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006638 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
6639 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306641 if (tempcl == 0)
6642 index = tempal * 4;
6643 else
6644 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306646 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006647 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
6648 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
6649 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
6650 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306651 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006652 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
6653 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
6654 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
6655 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306656 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006657
Peter Huewe6896b942012-02-09 21:11:46 +01006658 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6659 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006660 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
6661 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
6662 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306663 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006664}
6665
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006666/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006667/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006668/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006669/* Output : */
6670/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006671/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006672static void XGI_OEM310Setting(unsigned short ModeNo,
6673 unsigned short ModeIdIndex,
6674 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006675{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006676 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006677
Peter Huewea3d675c2012-02-09 21:11:47 +01006678 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006679 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006680
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006681 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006682 XGI_SetPhaseIncr(pVBInfo);
6683 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
6684 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006685
Peter Huewe6896b942012-02-09 21:11:46 +01006686 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006687 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306688 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006689}
6690
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006691/* --------------------------------------------------------------------- */
6692/* Function : XGI_SetCRT2ModeRegs */
6693/* Input : */
6694/* Output : */
6695/* Description : Origin code for crt2group */
6696/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006697static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306698 struct xgi_hw_device_info *HwDeviceExtension,
6699 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006700{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306701 unsigned short tempbl;
6702 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306704 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006705
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306706 tempah = 0;
6707 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006708 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306709 tempah &= ~0x10; /* BTRAMDAC */
6710 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306712 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
6713 | SetCRT2ToLCD)) {
6714 tempah = 0x40; /* BTDRAM */
6715 if (ModeNo > 0x13) {
6716 tempcl = pVBInfo->ModeType;
6717 tempcl -= ModeVGA;
6718 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006719 /* BT Color */
6720 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306721 if (tempah == 0)
6722 tempah = 1;
6723 tempah |= 0x040;
6724 }
6725 }
6726 if (pVBInfo->VBInfo & SetInSlaveMode)
6727 tempah ^= 0x50; /* BTDAC */
6728 }
6729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006730
Aaro Koskinen8104e322011-03-13 12:26:22 +02006731 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306732 tempah = 0x08;
6733 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306735 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006736 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306737 } else {
6738 tempah = 0x00;
6739 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306741 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
Peter Huewea3d675c2012-02-09 21:11:47 +01006742 | SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
6743 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006744 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306745 tempbl &= 0xf7;
6746 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006747 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306748 tempbl, tempah);
6749 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01006750 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306751 tempbl &= 0xf7;
6752 tempah |= 0x01;
6753 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006754
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006755 if (pVBInfo->VBInfo &
6756 (SetCRT2ToRAMDAC |
6757 SetCRT2ToTV |
6758 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306759 tempbl &= 0xf8;
6760 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306762 if (!(pVBInfo->VBInfo & SetInSlaveMode))
6763 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006764
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006765 if (!(pVBInfo->VBInfo &
6766 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306767 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006768 if (!(pVBInfo->VBInfo &
6769 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306770 tempah = tempah ^ 0x01;
6771 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006772
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006773 if (!(pVBInfo->VBInfo &
6774 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306775 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006776 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306777 0x2e, tempbl, tempah);
6778 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006779 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306780 0x2e, tempbl, tempah);
6781 }
6782 }
6783 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006784 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306785 tempah);
6786 }
6787 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306789 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006790 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306791 tempah &= (~0x08);
6792 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
6793 & SetInSlaveMode))) {
6794 tempah |= 0x010;
6795 }
6796 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306798 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306799 tempah |= 0x020;
6800 if (ModeNo > 0x13) {
6801 if (pVBInfo->VBInfo & DriverMode)
6802 tempah = tempah ^ 0x20;
6803 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306804 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006805
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006806 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306807 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306809 if (pVBInfo->LCDInfo & SetLCDDualLink)
6810 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006811
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306812 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306813 if (pVBInfo->TVInfo & RPLLDIV2XO)
6814 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306815 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006816
Peter Huewe255aabd2012-02-09 21:11:44 +01006817 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
6818 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306819 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006820
Peter Huewe255aabd2012-02-09 21:11:44 +01006821 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306822 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006823
Aaro Koskinen8104e322011-03-13 12:26:22 +02006824 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306825 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006826
Peter Huewe6896b942012-02-09 21:11:46 +01006827 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6828 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306829 tempah = 0;
6830 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306832 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6833 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01006834 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306835 tempah |= 0x04; /* shampoo 0129 */
6836 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006837
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006838 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306839 tempah = 0x00;
6840 tempbl = 0xcf;
6841 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6842 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6843 tempah |= 0x30;
6844 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006845
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006846 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306847 tempah = 0;
6848 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306850 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6851 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6852 tempah |= 0xc0;
6853 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006854 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306855 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306857 tempah = 0;
6858 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01006859 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306860 tempbl = 0xff;
6861 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
6862 tempah |= 0x80;
6863 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006864
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006865 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006866
Peter Huewe6896b942012-02-09 21:11:46 +01006867 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306868 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006869 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
6870 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306871 }
6872 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006873}
6874
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006875static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306876 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006877{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306878 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006879
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306880 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006881
Peter Huewea3d675c2012-02-09 21:11:47 +01006882 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306883 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006884
6885}
6886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306887void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6888 struct vb_device_info *pVBInfo)
6889{
6890
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006891 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006892
6893}
6894
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306895void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
6896 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006897{
6898
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006899 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006900
6901}
6902
Bill Pemberton80adad82010-06-17 13:10:51 -04006903unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006904{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306905 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306907 if (pVBInfo->IF_DEF_LVDS == 1) {
6908 return 1;
6909 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006910 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306911 if ((flag == 1) || (flag == 2))
6912 return 1; /* 301b */
6913 else
6914 return 0;
6915 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006916}
6917
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006918unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
6919 unsigned short ModeNo, unsigned short ModeIdIndex,
6920 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006921{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006922 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
6923 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
6924 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006925
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006926 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006927
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006928 if (ModeNo <= 0x13)
6929 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6930 else
6931 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6932
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006933 if (ModeNo < 0x14)
6934 return 0xFFFF;
6935
Aaro Koskinen58839b02011-03-13 12:26:23 +02006936 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006937 index = index >> pVBInfo->SelectCRT2Rate;
6938 index &= 0x0F;
6939
6940 if (pVBInfo->LCDInfo & LCDNonExpanding)
6941 index = 0;
6942
6943 if (index > 0)
6944 index--;
6945
6946 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006947 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006948 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01006949 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
6950 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006951 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006952 /* 301b */
6953 temp = LCDARefreshIndex[
6954 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006955 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006956 temp = LCDRefreshIndex[
6957 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006958
6959 if (index > temp)
6960 index = temp;
6961 } else {
6962 index = 0;
6963 }
6964 }
6965 }
6966
6967 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
6968 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
6969 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006970 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
6971 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006972 index++;
6973 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006974 /* Alan 10/19/2007;
6975 * do the similar adjustment like XGISearchCRT1Rate() */
6976 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
6977 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006978 index++;
6979 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006980 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
6981 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006982 index++;
6983 }
6984 }
6985
6986 i = 0;
6987 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006988 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
6989 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006990 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006991 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6992 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006993 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006994 if (temp < pVBInfo->ModeType)
6995 break;
6996 i++;
6997 index--;
6998
6999 } while (index != 0xFFFF);
7000 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7001 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007002 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
7003 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007004 if (temp & InterlaceMode)
7005 i++;
7006 }
7007 }
7008 i--;
7009 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7010 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7011 RefreshRateTableIndex, &i, pVBInfo);
7012 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02007013 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007014}
7015
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007016static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307017 struct xgi_hw_device_info *HwDeviceExtension,
7018 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007019{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007020 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007021
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007022 pVBInfo->SetFlag |= ProgrammingCRT2;
7023 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7024 ModeIdIndex, pVBInfo);
7025 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7026 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7027 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7028 HwDeviceExtension, pVBInfo);
7029 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7030 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007031}
7032
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02007033static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007034 struct xgi_hw_device_info *HwDeviceExtension,
7035 struct vb_device_info *pVBInfo)
7036{
7037 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7038
7039 tempbx = pVBInfo->VBInfo;
7040 pVBInfo->SetFlag |= ProgrammingCRT2;
7041 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7042 pVBInfo->SelectCRT2Rate = 4;
7043 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7044 ModeIdIndex, pVBInfo);
7045 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7046 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7047 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7048 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7049 RefreshRateTableIndex, pVBInfo);
7050 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7051 RefreshRateTableIndex, pVBInfo);
7052 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7053 RefreshRateTableIndex, pVBInfo);
7054 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7055 HwDeviceExtension, pVBInfo);
7056 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7057 RefreshRateTableIndex, pVBInfo);
7058 XGI_SetTap4Regs(pVBInfo);
7059 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7060 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7061 HwDeviceExtension, pVBInfo);
7062 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7063 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7064 XGI_AutoThreshold(pVBInfo);
7065 return 1;
7066}
7067
7068void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7069{
7070 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7071 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7072 0x05, 0x00 };
7073
7074 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7075
7076 unsigned char CR17, CR63, SR31;
7077 unsigned short temp;
7078 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7079
7080 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007081 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007082
7083 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007084 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007085 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007086 pVBInfo->P3d4, 0x53) | 0x02));
7087
Aaro Koskinen58839b02011-03-13 12:26:23 +02007088 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
7089 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
7090 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007091
Aaro Koskinen8104e322011-03-13 12:26:22 +02007092 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7093 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007094
Aaro Koskinen58839b02011-03-13 12:26:23 +02007095 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007096 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007097
Aaro Koskinen58839b02011-03-13 12:26:23 +02007098 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007099 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007100
Aaro Koskinen58839b02011-03-13 12:26:23 +02007101 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007102 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02007103 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007104 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007105
Aaro Koskinen8104e322011-03-13 12:26:22 +02007106 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007107
7108 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007109 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007110
7111 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007112 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007113 CRTCData[i]);
7114
7115 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007116 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007117 CRTCData[i]);
7118
7119 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007120 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007121 CRTCData[i]);
7122
Aaro Koskinen8104e322011-03-13 12:26:22 +02007123 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007124 & 0xE0));
7125
Aaro Koskinen8104e322011-03-13 12:26:22 +02007126 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7127 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7128 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007129
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007130 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007131
7132 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007133 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
7134 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
7135 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007136 }
7137
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007138 mdelay(1);
7139
7140 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007141 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007142
7143 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007144 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007145 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007146 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007147
7148 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007149 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007150
7151 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007152 outb(0, (pVBInfo->P3c8 + 1));
7153 outb(0, (pVBInfo->P3c8 + 1));
7154 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007155 }
7156
Aaro Koskinen8104e322011-03-13 12:26:22 +02007157 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
7158 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
7159 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007160
7161 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02007162 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007163 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007164 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007165}
7166
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007167static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
7168 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007169 struct vb_device_info *pVBInfo)
7170{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02007171 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007172
Peter Huewe6896b942012-02-09 21:11:46 +01007173 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
7174 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007175 if (!(pVBInfo->SetFlag & DisableChA)) {
7176 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007177 /* Power on */
7178 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007179 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007180 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7181 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007182 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007183 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007184 }
7185 }
7186 }
7187
7188 if (!(pVBInfo->SetFlag & DisableChB)) {
7189 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
7190 & (SetCRT2ToLCD | SetCRT2ToTV
7191 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007192 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007193 pVBInfo->P3c4, 0x32);
7194 tempah &= 0xDF;
7195 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007196 if (!(pVBInfo->VBInfo &
7197 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007198 tempah |= 0x20;
7199 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007200 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007201 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007202
Aaro Koskinen58839b02011-03-13 12:26:23 +02007203 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007204 pVBInfo->Part1Port, 0x2E);
7205
7206 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007207 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007208 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007209 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007210 }
7211 }
7212
7213 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
7214 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007215 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007216 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01007217 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007218 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007219 if (XGI_EnableChISLCD(pVBInfo) ||
7220 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01007221 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007222 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02007223 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007224 pVBInfo->Part4Port,
7225 0x2A,
7226 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007227 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007228 /* LVDS Driver power on */
7229 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007230 }
7231 }
7232
7233 tempah = 0x00;
7234
7235 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7236 tempah = 0xc0;
7237
7238 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01007239 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007240 if (pVBInfo->VBInfo &
7241 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007242 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007243 if (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01007244 XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007245 tempah = tempah ^ 0xC0;
7246
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007247 if (pVBInfo->SetFlag &
7248 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007249 tempah &= 0xBF;
7250
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007251 if (pVBInfo->SetFlag &
7252 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007253 tempah &= 0x7F;
7254
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007255 if (pVBInfo->SetFlag &
7256 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007257 tempah |= 0x40;
7258
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007259 if (pVBInfo->SetFlag &
7260 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007261 tempah |= 0x80;
7262 }
7263 }
7264 }
7265 }
7266
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007267 /* EnablePart4_1F */
7268 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007269
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007270 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007271 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007272 XGI_DisableGatingCRT(HwDeviceExtension,
7273 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007274 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
7275 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007276 }
7277 }
7278 } /* 301 */
7279 else { /* LVDS */
7280 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01007281 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007282 /* enable CRT2 */
7283 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007284
Aaro Koskinen58839b02011-03-13 12:26:23 +02007285 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007286 0x2E);
7287 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007288 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007289
Aaro Koskinendc505562011-03-13 12:26:26 +02007290 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007291 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007292 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007293}
7294
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007295static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
7296 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007297 unsigned short ModeNo, unsigned short ModeIdIndex,
7298 struct vb_device_info *pVBInfo)
7299{
7300 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
7301
7302 unsigned short XGINew_P3cc = pVBInfo->P3cc;
7303
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007304 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007305 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
Aaro Koskineneb9aef12011-11-27 23:03:15 +02007306 outb(pVBInfo->StandTable[StandTableIndex].MISC, pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007307 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
7308 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7309 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
7310 XGI_ClearExt1Regs(pVBInfo);
7311
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007312 if (HwDeviceExtension->jChipType == XG27) {
7313 if (pVBInfo->IF_DEF_LVDS == 0)
7314 XGI_SetDefaultVCLK(pVBInfo);
7315 }
7316
7317 temp = ~ProgrammingCRT2;
7318 pVBInfo->SetFlag &= temp;
7319 pVBInfo->SelectCRT2Rate = 0;
7320
Peter Huewe6896b942012-02-09 21:11:46 +01007321 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
7322 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01007323 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007324 | SetInSlaveMode)) {
7325 pVBInfo->SetFlag |= ProgrammingCRT2;
7326 }
7327 }
7328
7329 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7330 ModeIdIndex, pVBInfo);
7331 if (RefreshRateTableIndex != 0xFFFF) {
7332 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
7333 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7334 pVBInfo, HwDeviceExtension);
7335 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
7336 RefreshRateTableIndex, pVBInfo);
7337 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7338 HwDeviceExtension, pVBInfo);
7339 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
7340 RefreshRateTableIndex, pVBInfo);
7341 }
7342
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007343 if ((HwDeviceExtension->jChipType >= XG20) &&
7344 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007345 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007346 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
7347 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007348 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007349 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007350 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
7351 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007352 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7353 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007354 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007355 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007356 }
7357 }
7358
7359 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007360 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007361 if (temp & 0xA0) {
7362
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007363 if (HwDeviceExtension->jChipType == XG27)
7364 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
7365 RefreshRateTableIndex, pVBInfo);
7366 else
7367 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
7368 RefreshRateTableIndex, pVBInfo);
7369
7370 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
7371 RefreshRateTableIndex);
7372
Aaro Koskinen105d8d02011-08-31 21:46:00 +03007373 xgifb_set_lcd(HwDeviceExtension->jChipType,
7374 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007375
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007376 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007377 xgifb_set_lvds(xgifb_info,
7378 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007379 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007380 }
7381 }
7382
7383 pVBInfo->SetFlag &= (~ProgrammingCRT2);
7384 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
7385 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
7386 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007387 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007388}
7389
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007390unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
7391 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007392 unsigned short ModeNo)
7393{
7394 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007395 struct vb_device_info VBINF;
7396 struct vb_device_info *pVBInfo = &VBINF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007397 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
7398 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007399 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007400
7401 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
7402 pVBInfo->IF_DEF_YPbPr = 0;
7403 pVBInfo->IF_DEF_HiVision = 0;
7404 pVBInfo->IF_DEF_CRT2Monitor = 0;
7405 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007406 } else {
7407 pVBInfo->IF_DEF_YPbPr = 1;
7408 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02007409 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007410 }
7411
7412 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
7413 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
7414 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
7415 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
7416 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
7417 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
7418 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
7419 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
7420 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
7421 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
7422 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
7423 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
7424 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01007425 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
7426 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
7427 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
7428 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
7429 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007430
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007431 /* for x86 Linux, XG21 LVDS */
7432 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007433 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007434 pVBInfo->IF_DEF_LVDS = 1;
7435 }
7436 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007437 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
7438 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007439 pVBInfo->IF_DEF_LVDS = 1;
7440 }
7441 }
7442
7443 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
7444 XGI_GetVBType(pVBInfo);
7445
7446 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02007447 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007448 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007449 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007450
7451 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
7452 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
7453
7454 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7455
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007456 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7457 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
7458 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
7459 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007460 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007461
Peter Huewea3d675c2012-02-09 21:11:47 +01007462 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007463 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007464 ModeIdIndex, pVBInfo);
7465
Peter Huewea3d675c2012-02-09 21:11:47 +01007466 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007467 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7468 HwDeviceExtension, pVBInfo);
7469 }
7470 } else {
Peter Huewe6896b942012-02-09 21:11:46 +01007471 if (!(pVBInfo->VBInfo & SwitchCRT2)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007472 XGI_SetCRT1Group(xgifb_info,
7473 HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007474 ModeIdIndex, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01007475 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007476 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7477 HwDeviceExtension,
7478 pVBInfo);
7479 }
7480 }
7481 }
7482
Peter Huewe6896b942012-02-09 21:11:46 +01007483 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007484 switch (HwDeviceExtension->ujVBChipID) {
7485 case VB_CHIP_301:
7486 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7487 pVBInfo); /*add for CRT2 */
7488 break;
7489
7490 case VB_CHIP_302:
7491 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7492 pVBInfo); /*add for CRT2 */
7493 break;
7494
7495 default:
7496 break;
7497 }
7498 }
7499
7500 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
7501 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
7502 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007503 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007504 } /* !XG20 */
7505 else {
7506 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007507 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007508 ModeIdIndex,
7509 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007510 return 0;
7511
7512 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007513 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01007514 St_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007515 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007516 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01007517 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007518 }
7519
7520 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03007521 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007522
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007523 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007524
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007525 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
7526 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007527
Aaro Koskinenfab04b92011-12-06 00:10:45 +02007528 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007529 }
7530
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007531 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
7532
7533 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7534 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
7535 }
7536
7537 return 1;
7538}