blob: efdda2256b9e94ea9fe390532850402e77d92ec5 [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"
11#include "vb_util.h"
12#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020013#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020014
15
16#define IndexMask 0xff
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020017
Randy Dunlap89229672010-08-10 08:46:44 -070018static unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
21 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
22 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
25 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
26 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020027
Randy Dunlap89229672010-08-10 08:46:44 -070028static unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040029 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
30 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
31 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
32 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
33 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
34 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
35 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
36 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020037
Randy Dunlap89229672010-08-10 08:46:44 -070038static unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040039 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
40 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
41 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
42 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
43 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
44 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
45 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
46 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020047
Randy Dunlap89229672010-08-10 08:46:44 -070048static unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040049 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
50 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
51 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
52 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
53 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
54 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
55 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
56 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
57 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
58 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020059
Bill Pemberton80adad82010-06-17 13:10:51 -040060void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020061{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053062 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
63 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
64 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
65 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
66 pVBInfo->XGINEWUB_CRT1Table
67 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053069 /* add for new UNIVGABIOS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +080070 /* XGINew_UBLCDDataTable =
71 * (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053072 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Aaro Koskinen06587332011-03-13 12:26:10 +020074 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
75 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053076 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
77 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
78 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
79 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
80 pVBInfo->ModeResInfo
81 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053083 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
84 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
85 pVBInfo->pSR07 = &XGI330_SR07;
86 pVBInfo->LCDResInfo = 0;
87 pVBInfo->LCDTypeInfo = 0;
88 pVBInfo->LCDInfo = 0;
89 pVBInfo->VBInfo = 0;
90 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053092 pVBInfo->SR15 = XGI340_SR13;
93 pVBInfo->CR40 = XGI340_cr41;
94 pVBInfo->SR25 = XGI330_sr25;
95 pVBInfo->pSR31 = &XGI330_sr31;
96 pVBInfo->pSR32 = &XGI330_sr32;
97 pVBInfo->CR6B = XGI340_CR6B;
98 pVBInfo->CR6E = XGI340_CR6E;
99 pVBInfo->CR6F = XGI340_CR6F;
100 pVBInfo->CR89 = XGI340_CR89;
101 pVBInfo->AGPReg = XGI340_AGPReg;
102 pVBInfo->SR16 = XGI340_SR16;
103 pVBInfo->pCRCF = &XG40_CRCF;
104 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530106 pVBInfo->CR49 = XGI330_CR49;
107 pVBInfo->pSR1F = &XGI330_SR1F;
108 pVBInfo->pSR21 = &XGI330_SR21;
109 pVBInfo->pSR22 = &XGI330_SR22;
110 pVBInfo->pSR23 = &XGI330_SR23;
111 pVBInfo->pSR24 = &XGI330_SR24;
112 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530114 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
115 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
116 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
117 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
118 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
119 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
120 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
121 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
122 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
123 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530125 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
126 pVBInfo->PALTiming = XGI330_PALTiming;
127 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
128 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
129 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
130 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
131 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
132 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
133 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
134 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
135 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
136 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
137 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
138 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530140 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
141 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
142 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530144 /* 310 customization related */
145 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
146 pVBInfo->LCDCapList = XGI_LCDDLCapList;
147 else
148 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530150 if ((ChipType == XG21) || (ChipType == XG27))
151 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530153 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
154 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530156 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 if (ChipType >= XG20)
159 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530161 if (ChipType == XG27) {
162 pVBInfo->MCLKData
163 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
164 pVBInfo->CR40 = XGI27_cr41;
165 pVBInfo->pXGINew_CR97 = &XG27_CR97;
166 pVBInfo->pSR36 = &XG27_SR36;
167 pVBInfo->pCR8F = &XG27_CR8F;
168 pVBInfo->pCRD0 = XG27_CRD0;
169 pVBInfo->pCRDE = XG27_CRDE;
170 pVBInfo->pSR40 = &XG27_SR40;
171 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200172
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
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530218 i = SetCRT2ToLCDA;
219 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
220 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_SetMiscRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800239 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530241 unsigned char Miscdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200242
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800243 /* Get Misc from file */
244 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530245 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800246 if (pVBInfo->VBType & (VB_XGI301B |
247 VB_XGI302B |
248 VB_XGI301LV |
249 VB_XGI302LV |
250 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530251 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
252 Miscdata |= 0x0C;
253 }
254 }
255 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200257 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200258}
259
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200260static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800261 unsigned short StandTableIndex,
262 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200263{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530264 unsigned char CRTCdata;
265 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200266
Aaro Koskinen58839b02011-03-13 12:26:23 +0200267 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530268 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200269 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530271 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800272 /* Get CRTC from file */
273 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200274 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530275 }
276 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800277 if ((HwDeviceExtension->jChipType == XGI_630) &&
278 (HwDeviceExtension->jChipRevision == 0x30)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530279 if (pVBInfo->VBInfo & SetInSlaveMode) {
280 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200281 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530282 }
283 }
284 }
285 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200286}
287
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800288static void XGI_SetATTRegs(unsigned short ModeNo,
289 unsigned short StandTableIndex,
290 unsigned short ModeIdIndex,
291 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530293 unsigned char ARdata;
294 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200295
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530296 if (ModeNo <= 0x13)
297 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
298 else
299 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 for (i = 0; i <= 0x13; i++) {
302 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
303 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
304 if (i == 0x13) {
305 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
306 ARdata = 0;
307 } else {
308 if (pVBInfo->VBInfo & (SetCRT2ToTV
309 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800310 if (pVBInfo->VBInfo &
311 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530312 ARdata = 0;
313 }
314 }
315 }
316 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200317
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200318 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200319 outb(i, pVBInfo->P3c0); /* set index */
320 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200322
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200323 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200324 outb(0x14, pVBInfo->P3c0); /* set index */
325 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200326 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200327 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200328}
329
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200330static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800331 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200332{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530333 unsigned char GRdata;
334 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530336 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800337 /* Get GR from file */
338 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200339 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530340 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200343 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530344 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200345 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530346 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200347}
348
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200349static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200350{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530351 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200354 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200355}
356
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200357static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200358{
359
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200360 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200361 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
362 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200363
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200364 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200365 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
366 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200367
Aaro Koskinendc505562011-03-13 12:26:26 +0200368 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530369 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200370}
371
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200372static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530373 unsigned short ModeIdIndex,
374 unsigned short RefreshRateTableIndex, unsigned short *i,
375 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200376{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530377 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200378
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530379 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800380 /* si+St_ModeFlag */
381 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530382 else
383 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200384
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530385 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
386 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
387 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530389 if (pVBInfo->IF_DEF_LVDS == 0) {
390 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
391 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530393 if (pVBInfo->VBType & VB_XGI301C)
394 tempax |= SupportCRT2in301C;
395 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200396
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800397 /* 301b */
398 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530399 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530401 if (pVBInfo->LCDResInfo != Panel1280x1024) {
402 if (pVBInfo->LCDResInfo != Panel1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800403 if (pVBInfo->LCDInfo &
404 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530405 if (resinfo >= 9) {
406 tempax = 0;
407 return 0;
408 }
409 }
410 }
411 }
412 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530414 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800415 if ((pVBInfo->VBType & VB_XGI301LV) &&
416 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530417 tempax |= SupportYPbPr;
418 if (pVBInfo->VBInfo & SetInSlaveMode) {
419 if (resinfo == 4)
420 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 if (resinfo == 3)
423 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530425 if (resinfo > 7)
426 return 0;
427 }
428 } else {
429 tempax |= SupportHiVisionTV;
430 if (pVBInfo->VBInfo & SetInSlaveMode) {
431 if (resinfo == 4)
432 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530434 if (resinfo == 3) {
435 if (pVBInfo->SetFlag
436 & TVSimuMode)
437 return 0;
438 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530440 if (resinfo > 7)
441 return 0;
442 }
443 }
444 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800445 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
446 SetCRT2ToSVIDEO |
447 SetCRT2ToSCART |
448 SetCRT2ToYPbPr |
449 SetCRT2ToHiVisionTV)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530450 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530452 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
453 | VB_XGI301LV | VB_XGI302LV
454 | VB_XGI301C)) {
455 tempax |= SupportTV1024;
456 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530458 if (!(pVBInfo->VBInfo & SetPALTV)) {
459 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800460 if (pVBInfo->VBInfo &
461 SetInSlaveMode) {
462 if (!(pVBInfo->VBInfo &
463 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530464 return 0;
465 }
466 }
467 }
468 }
469 }
470 }
471 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530472 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
473 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200474
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530475 if (resinfo > 0x08)
476 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200477
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530478 if (pVBInfo->LCDResInfo < Panel1024x768) {
479 if (resinfo > 0x07)
480 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530482 if (resinfo == 0x04)
483 return 0; /* 512x384 */
484 }
485 }
486 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200487
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800488 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
489 tempbx; (*i)--) {
490 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
491 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530492 if (infoflag & tempax)
493 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530495 if ((*i) == 0)
496 break;
497 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200498
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530499 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800500 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
501 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530502 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
503 != tempbx) {
504 return 0;
505 }
506
507 if (infoflag & tempax)
508 return 1;
509 }
510 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200511}
512
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200513static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530514 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200515{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530516 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800518 /* di+0x00 */
519 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530520 sync &= 0xC0;
521 temp = 0x2F;
522 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200523 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524}
525
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200526static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530527 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200528{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530529 unsigned char data, data1, pushax;
530 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200531
Aaro Koskinen8104e322011-03-13 12:26:22 +0200532 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
533 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200534 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200535
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800536 /* unlock cr0-7 */
537 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530538 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200539 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200540
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530541 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200542 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200543
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530544 for (i = 0x01; i <= 0x04; i++) {
545 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200546 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530547 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530549 for (i = 0x05; i <= 0x06; i++) {
550 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200551 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530552 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200553
Aaro Koskinen58839b02011-03-13 12:26:23 +0200554 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530555 j &= 0x1F;
556 data = pVBInfo->TimingH[0].data[7];
557 data &= 0xE0;
558 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200559 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200560
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530561 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200562 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530563 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200564 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200565 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530566 data1 = data;
567 data1 &= 0xE0;
568 data &= 0x1F;
569 if (data == 0) {
570 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200571 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530572 0x0c);
573 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200574 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530575 data = pushax;
576 }
577 data = data - 1;
578 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200579 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200580 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530581 data = data >> 5;
582 data = data + 3;
583 if (data > 7)
584 data = data - 7;
585 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200586 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200588}
589
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800590static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
591 unsigned short ModeNo,
592 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200593{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530594 unsigned char data;
595 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200596
Aaro Koskinen8104e322011-03-13 12:26:22 +0200597 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
598 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200599 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530601 for (i = 0x00; i <= 0x01; i++) {
602 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200603 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530604 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530606 for (i = 0x02; i <= 0x03; i++) {
607 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200608 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530609 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530611 for (i = 0x04; i <= 0x05; i++) {
612 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200613 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530614 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200615
Aaro Koskinen58839b02011-03-13 12:26:23 +0200616 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530617 j &= 0xC0;
618 data = pVBInfo->TimingV[0].data[6];
619 data &= 0x3F;
620 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200621 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530623 data = pVBInfo->TimingV[0].data[6];
624 data &= 0x80;
625 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530627 if (ModeNo <= 0x13)
628 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
629 else
630 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530632 i &= DoubleScanMode;
633 if (i)
634 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200635
Aaro Koskinen58839b02011-03-13 12:26:23 +0200636 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530637 j &= 0x5F;
638 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200639 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200640}
641
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200642static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
643 unsigned short RefreshRateTableIndex,
644 struct vb_device_info *pVBInfo,
645 struct xgi_hw_device_info *HwDeviceExtension)
646{
647 unsigned char index, data;
648 unsigned short i;
649
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800650 /* Get index */
651 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200652 index = index & IndexMask;
653
Aaro Koskinen58839b02011-03-13 12:26:23 +0200654 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200655 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200656 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200657
658 for (i = 0; i < 8; i++)
659 pVBInfo->TimingH[0].data[i]
660 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
661
662 for (i = 0; i < 7; i++)
663 pVBInfo->TimingV[0].data[i]
664 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
665
666 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
667
668 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
669
670 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200671 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200672}
673
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200674/* --------------------------------------------------------------------- */
675/* Function : XGI_SetXG21CRTC */
676/* Input : Stand or enhance CRTC table */
677/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
678/* Description : Set LCD timing */
679/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200680static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530681 unsigned short RefreshRateTableIndex,
682 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200683{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530684 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
685 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530687 if (ModeNo <= 0x13) {
688 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800689 /* CR04 HRS */
690 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
691 /* SR2E [7:0]->HRS */
692 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
693 /* Tempbx: CR05 HRE */
694 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530695 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
696 Tempcx = Tempax;
697 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
698 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
699 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
700 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
701 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800702 /* SR2F [7:2]->HRE */
703 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200704 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200705
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800706 /* Tempax: CR16 VRS */
707 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530708 Tempbx = Tempax; /* Tempbx=Tempax */
709 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200710 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800711
712 /* Tempax: CR7 VRS */
713 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530714 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
715 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
716 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
717 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800718 /* SR34[7:0]: VRS[8:1] */
719 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800721 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
722 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530723 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
724 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
725 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
726 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200727
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800728 /* CR16 VRE */
729 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530730 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
731 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
732 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
733 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
734 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
735 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
736 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
737 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
738 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
739 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
740 Temp1 >>= 9; /* [10:9]->[1:0] */
741 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
742 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
743 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800744 /* SR3F D[7:2]->VRE D[1:0]->VRS */
745 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530746 } else {
747 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800748 /* Tempax: CR4 HRS */
749 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530750 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800751 /* SR2E[7:0]->HRS */
752 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200753
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530754 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
755 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
756 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
757 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
758 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200759
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530760 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
761 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530763 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
764 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
765 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
766 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200767
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530768 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
769 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530771 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
772 if (Tempax < Tempcx) /* HRE < HRS */
773 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530775 Temp2 &= 0xFF;
776 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
777 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
778 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
779 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800780 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
781 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200782 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200783
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800784 /* CR10 VRS */
785 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530786 Tempbx = Tempax; /* Tempbx: VRS */
787 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200788 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800789 /* CR7[2][7] VRE */
790 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530791 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
792 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
793 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
794 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200795 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530797 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
798 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
799 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
800 Tempax &= 0x80;
801 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
802 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800803 /* Tempax: SRA */
804 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530805 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
806 Temp2 = Tempax;
807 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
808 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800810 /* Tempax: CR11 VRE */
811 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530812 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800813 /* Tempbx: SRA */
814 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530815 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
816 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
817 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
818 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
819 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530821 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
822 if (Tempax < Temp3) /* VRE < VRS */
823 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200824
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530825 Temp2 &= 0xFF;
826 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
827 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
828 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
829 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
830 Tempbx = (unsigned char) Temp1;
831 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
832 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800833 /* SR3F D[7:2]->VRE D[1:0]->VRS */
834 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530835 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200836}
837
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800838static void XGI_SetXG27CRTC(unsigned short ModeNo,
839 unsigned short ModeIdIndex,
840 unsigned short RefreshRateTableIndex,
841 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200842{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400843 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530845 if (ModeNo <= 0x13) {
846 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800847 /* CR04 HRS */
848 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
849 /* SR2E [7:0]->HRS */
850 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
851 /* Tempbx: CR05 HRE */
852 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530853 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
854 Tempcx = Tempax;
855 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
856 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
857 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
858 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
859 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800860 /* SR2F [7:2]->HRE */
861 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200862 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200863
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800864 /* Tempax: CR10 VRS */
865 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200866 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530867 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800868 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
869 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530870 Tempbx = Tempax; /* Tempbx=CR07 */
871 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
872 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800873 /* SR35 D[0]->VRS D[8] */
874 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530875 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
876 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200877
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800878 /* CR11 VRE */
879 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530880 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
881 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
882 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
883 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
884 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
885 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800886 /* Tempax[7:0]: VRE[7:0] */
887 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530888 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
889 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800890 /* SR3F D[7:2]->VRE D[5:0] */
891 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
892 /* SR35 D[2:1]->VRS[10:9] */
893 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530894 } else {
895 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800896 /* Tempax: CR4 HRS */
897 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530898 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800899 /* SR2E[7:0]->HRS */
900 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200901
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800902 /* SR0B */
903 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530904 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
905 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200906
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
908 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
909 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530911 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
912 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
913 Tempax <<= 3; /* Tempax[5]: HRE[5] */
914 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530916 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
917 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200918
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800919 /* Tempax: CR4 HRS */
920 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530921 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
922 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
923 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530925 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
926 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
927 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
928 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800929 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
930 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200931 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200932
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800933 /* CR10 VRS */
934 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
935 /* SR34[7:0]->VRS[7:0] */
936 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200937
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530938 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800939 /* CR7[7][2] VRS[9][8] */
940 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530941 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
942 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
943 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800944 /* SR35[0]: VRS[8] */
945 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530946 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
947 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800948 /* Tempax: SR0A */
949 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530950 Tempax &= 0x08; /* SR0A[3] VRS[10] */
951 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200952
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800953 /* Tempax: CR11 VRE */
954 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530955 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800956 /* Tempbx: SR0A */
957 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530958 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
959 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
960 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
961 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
962 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
963 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200964
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530965 if (Tempbx <= Tempcx) /* VRE <= VRS */
966 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200967
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800968 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
969 Tempax = (Tempbx << 2) & 0xFF;
970 /* SR3F[7:2]:VRE[5:0] */
971 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530972 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800973 /* SR35[2:0]:VRS[10:8] */
974 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530975 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200976}
977
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300978static void xgifb_set_lcd(int chip_id,
979 struct vb_device_info *pVBInfo,
980 unsigned short RefreshRateTableIndex,
981 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200982{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400983 unsigned short Data, Temp, b3CC;
984 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530986 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200987
Aaro Koskinen8104e322011-03-13 12:26:22 +0200988 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
989 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
990 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
991 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300992
993 if (chip_id == XG27) {
994 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
995 if ((Temp & 0x03) == 0) { /* dual 12 */
996 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
997 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
998 }
999 }
1000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301001 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001002 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1003 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1004 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1005 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301006 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001007
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001008 if (chip_id == XG27) {
1009 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301010 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001011 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1012 if (Temp & 0x01) {
1013 /* 18 bits FP */
1014 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
1015 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
1016 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301017 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001018
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001019 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001020
Aaro Koskinendc505562011-03-13 12:26:26 +02001021 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1022 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001023
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301024 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001025 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301026 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001027 /* Hsync polarity */
1028 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301029 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001030 /* Vsync polarity */
1031 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301032 } else {
1033 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1034 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001035 /* Hsync polarity */
1036 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301037 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001038 /* Vsync polarity */
1039 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301040 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001041}
1042
1043/* --------------------------------------------------------------------- */
1044/* Function : XGI_UpdateXG21CRTC */
1045/* Input : */
1046/* Output : CRT1 CRTC */
1047/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1048/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001049static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1050 struct vb_device_info *pVBInfo,
1051 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001052{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301053 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001054
Aaro Koskinendc505562011-03-13 12:26:26 +02001055 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301056 if (ModeNo <= 0x13) {
1057 for (i = 0; i < 12; i++) {
1058 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1059 index = i;
1060 }
1061 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001062 if (ModeNo == 0x2E &&
1063 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1064 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301065 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001066 else if (ModeNo == 0x2E &&
1067 (pVBInfo->RefIndex[RefreshRateTableIndex].
1068 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301069 index = 13;
1070 else if (ModeNo == 0x2F)
1071 index = 14;
1072 else if (ModeNo == 0x50)
1073 index = 15;
1074 else if (ModeNo == 0x59)
1075 index = 16;
1076 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301078 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001079 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301080 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001081 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301082 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001083 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301084 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001085 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301086 pVBInfo->UpdateCRT1[index].CR16);
1087 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001088}
1089
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001090static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301091 unsigned short ModeNo, unsigned short ModeIdIndex,
1092 unsigned short RefreshRateTableIndex,
1093 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001094{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001095 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001096
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301097 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301101 if (ModeNo <= 0x13) {
1102 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1103 tempax = pVBInfo->StResInfo[resindex].HTotal;
1104 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1105 } else {
1106 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1107 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1108 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1109 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301111 if (modeflag & HalfDCLK)
1112 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301114 if (ModeNo > 0x13) {
1115 if (modeflag & HalfDCLK)
1116 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001117
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301118 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001119
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301120 if (temp & InterlaceMode)
1121 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301123 if (modeflag & DoubleScanMode)
1124 tempbx = tempbx << 1;
1125 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301127 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301129 /* if (!(modeflag & Charx8Dot)) */
1130 /* tempcx = 9; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001131
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301132 tempax /= tempcx;
1133 tempax -= 1;
1134 tempbx -= 1;
1135 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001136 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1137 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301138 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001139 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1140 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001141 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301142 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001143 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301144 tempax = 0;
1145 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301147 if (tempbx & 0x01)
1148 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301150 if (tempbx & 0x02)
1151 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001153 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001154 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301155 data &= 0xFF;
1156 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301158 if (tempbx & 0x04)
1159 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001161 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001162 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001163}
1164
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001165unsigned short XGI_GetResInfo(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301166 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001167{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001168 unsigned short resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001169
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301170 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001171 /* si+St_ResInfo */
1172 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301173 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001174 /* si+Ext_ResInfo */
1175 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301176 return resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001177}
1178
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001179static void XGI_SetCRT1Offset(unsigned short ModeNo,
1180 unsigned short ModeIdIndex,
1181 unsigned short RefreshRateTableIndex,
1182 struct xgi_hw_device_info *HwDeviceExtension,
1183 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001184{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301185 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001186
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301187 /* GetOffset */
1188 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1189 temp = temp >> 8;
1190 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301192 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1193 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001194
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301195 if (temp2)
1196 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301198 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301200 switch (temp2) {
1201 case 0:
1202 temp2 = 1;
1203 break;
1204 case 1:
1205 temp2 = 2;
1206 break;
1207 case 2:
1208 temp2 = 4;
1209 break;
1210 case 3:
1211 temp2 = 4;
1212 break;
1213 case 4:
1214 temp2 = 6;
1215 break;
1216 case 5:
1217 temp2 = 8;
1218 break;
1219 default:
1220 break;
1221 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301223 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1224 temp = temp * temp2 + temp2 / 2;
1225 else
1226 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301228 /* SetOffset */
1229 DisplayUnit = temp;
1230 temp2 = temp;
1231 temp = temp >> 8; /* ah */
1232 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001233 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301234 i &= 0xF0;
1235 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001236 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301238 temp = (unsigned char) temp2;
1239 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001240 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301242 /* SetDisplayUnit */
1243 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1244 temp2 &= InterlaceMode;
1245 if (temp2)
1246 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301248 DisplayUnit = DisplayUnit << 5;
1249 ah = (DisplayUnit & 0xff00) >> 8;
1250 al = DisplayUnit & 0x00ff;
1251 if (al == 0)
1252 ah += 1;
1253 else
1254 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001255
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301256 if (HwDeviceExtension->jChipType >= XG20)
1257 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1258 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259
Aaro Koskinen8104e322011-03-13 12:26:22 +02001260 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001261}
1262
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001263static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1264 unsigned short ModeIdIndex,
1265 unsigned short RefreshRateTableIndex,
1266 struct xgi_hw_device_info *HwDeviceExtension,
1267 struct vb_device_info *pVBInfo)
1268{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001269 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2,
1270 VCLK65 + 2,
1271 VCLK65 + 2,
1272 VCLK65 + 2 };
1273 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5,
1274 VCLK108_2 + 5,
1275 VCLK108_2 + 5,
1276 VCLK108_2 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001277 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001278 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2,
1279 VCLK65 + 2,
1280 VCLK65 + 2,
1281 VCLK65 + 2 };
1282 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2,
1283 VCLK65 + 2,
1284 VCLK65 + 2,
1285 VCLK65 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001286
1287 unsigned short CRT2Index, VCLKIndex;
1288 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001289
1290 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001291 /* si+St_ResInfo */
1292 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001293 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1294 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1295 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001296 /* si+Ext_ResInfo */
1297 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001298 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001299 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1300 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001301 }
1302
1303 if (pVBInfo->IF_DEF_LVDS == 0) {
1304 CRT2Index = CRT2Index >> 6; /* for LCD */
1305 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1306 if (pVBInfo->LCDResInfo != Panel1024x768)
1307 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1308 else
1309 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1310 } else { /* for TV */
1311 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1312 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1313 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1314 VCLKIndex = HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001315 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001316 } else {
1317 VCLKIndex = HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001318 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001319 }
1320
1321 if (pVBInfo->SetFlag & TVSimuMode) {
1322 if (modeflag & Charx8Dot) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001323 VCLKIndex =
1324 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001325 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001326 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001327 VCLKIndex =
1328 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001329 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001330 }
1331 }
1332
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001333 /* 301lv */
1334 if (pVBInfo->VBType & VB_XGI301LV) {
1335 if (!(pVBInfo->VBExtInfo ==
1336 VB_YPbPr1080i)) {
1337 VCLKIndex =
1338 YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001339 if (!(pVBInfo->VBExtInfo
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001340 ==
1341 VB_YPbPr750p)) {
1342 VCLKIndex =
1343 YPbPr525pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001344 if (!(pVBInfo->VBExtInfo
1345 == VB_YPbPr525p)) {
1346 VCLKIndex
1347 = YPbPr525iVCLK_2;
1348 if (!(pVBInfo->SetFlag
1349 & RPLLDIV2XO))
1350 VCLKIndex
1351 = YPbPr525iVCLK;
1352 }
1353 }
1354 }
1355 }
1356 } else {
1357 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001358 if (pVBInfo->SetFlag &
1359 RPLLDIV2XO) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001360 VCLKIndex = TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001361 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001362 } else {
1363 VCLKIndex = TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001364 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001365 }
1366 }
1367 }
1368 } else { /* for CRT2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001369 /* Port 3cch */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001370 VCLKIndex = (unsigned char) inb(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001371 (pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001372 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1373 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001374 /* di+Ext_CRTVCLK */
1375 VCLKIndex =
1376 pVBInfo->RefIndex[
1377 RefreshRateTableIndex].
1378 Ext_CRTVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001379 VCLKIndex &= IndexMask;
1380 }
1381 }
1382 }
1383 } else { /* LVDS */
1384 if (ModeNo <= 0x13)
1385 VCLKIndex = CRT2Index;
1386 else
1387 VCLKIndex = CRT2Index;
1388
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001389 VCLKIndex = VCLKIndex >> 6;
1390 if ((pVBInfo->LCDResInfo == Panel800x600) ||
1391 (pVBInfo->LCDResInfo == Panel320x480))
1392 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
1393 else if ((pVBInfo->LCDResInfo == Panel1024x768) ||
1394 (pVBInfo->LCDResInfo == Panel1024x768x75))
1395 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1396 else
1397 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001398 }
1399 /* VCLKIndex = VCLKIndex&IndexMask; */
1400
1401 return VCLKIndex;
1402}
1403
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001404static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1405 unsigned short ModeIdIndex,
1406 struct xgi_hw_device_info *HwDeviceExtension,
1407 unsigned short RefreshRateTableIndex,
1408 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001409{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001410 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301411 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001412
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301413 if (pVBInfo->IF_DEF_LVDS == 1) {
1414 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001415 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001416 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1417 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301418 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001419 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301420 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001421 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301422 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1423 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1424 & SetCRT2ToLCDA)) {
1425 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1426 RefreshRateTableIndex, HwDeviceExtension,
1427 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001428 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001429 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301430 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001431 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301432 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001433 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1434 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301435 } else {
1436 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001437 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001438 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1439 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301440 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001441 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301442 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001443 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301444 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001445
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301446 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001447 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1448 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001449 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001450 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001451 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301452 index = data;
1453 index &= 0xE0;
1454 data &= 0x1F;
1455 data = data << 1;
1456 data += 1;
1457 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001458 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301459 }
1460 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001461}
1462
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001463static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301464 struct xgi_hw_device_info *HwDeviceExtension,
1465 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001466{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301467 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001468
Aaro Koskinen58839b02011-03-13 12:26:23 +02001469 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301470 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001471 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001472
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301473 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001474 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001475 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301476 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001477 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001478 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301479 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001480 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301481 } else {
1482 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001483 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001484 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301485 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001486 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301487 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001488 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001489 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301490 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001491 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301492 }
1493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301495 if (HwDeviceExtension->jChipType == XG21)
1496 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001497}
1498
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001499static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1500 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1501 struct vb_device_info *pVBInfo)
1502{
1503 unsigned short data, data2 = 0;
1504 short VCLK;
1505
1506 unsigned char index;
1507
1508 if (ModeNo <= 0x13)
1509 VCLK = 0;
1510 else {
1511 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1512 index &= IndexMask;
1513 VCLK = pVBInfo->VCLKData[index].CLOCK;
1514 }
1515
Aaro Koskinen58839b02011-03-13 12:26:23 +02001516 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001517 data &= 0xf3;
1518 if (VCLK >= 200)
1519 data |= 0x0c; /* VCLK > 200 */
1520
1521 if (HwDeviceExtension->jChipType >= XG20)
1522 data &= ~0x04; /* 2 pixel mode */
1523
Aaro Koskinen8104e322011-03-13 12:26:22 +02001524 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001525
1526 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001527 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001528 data &= 0xE7;
1529 if (VCLK < 200)
1530 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001531 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001532 }
1533
1534 /* Jong for Adavantech LCD ripple issue
1535 if ((VCLK >= 0) && (VCLK < 135))
1536 data2 = 0x03;
1537 else if ((VCLK >= 135) && (VCLK < 160))
1538 data2 = 0x02;
1539 else if ((VCLK >= 160) && (VCLK < 260))
1540 data2 = 0x01;
1541 else if (VCLK > 260)
1542 data2 = 0x00;
1543 */
1544 data2 = 0x00;
1545
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001546 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001547 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001548 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001549
1550}
1551
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001552static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301553 unsigned short ModeNo, unsigned short ModeIdIndex,
1554 unsigned short RefreshRateTableIndex,
1555 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001556{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301557 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1558 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301560 if (ModeNo > 0x13) {
1561 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001562 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1563 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301564 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001565 /* si+St_ModeFlag */
1566 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001567
Aaro Koskinen58839b02011-03-13 12:26:23 +02001568 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001569 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301571 if (ModeNo > 0x13)
1572 data = infoflag;
1573 else
1574 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001575
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301576 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301578 if (ModeNo > 0x13) {
1579 if (pVBInfo->ModeType > 0x02) {
1580 data2 |= 0x02;
1581 data3 = pVBInfo->ModeType - ModeVGA;
1582 data3 = data3 << 2;
1583 data2 |= data3;
1584 }
1585 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301587 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301589 if (data)
1590 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001591
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001592 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001593 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301594 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1595 if (ModeNo <= 0x13)
1596 xres = pVBInfo->StResInfo[resindex].HTotal;
1597 else
1598 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301600 data = 0x0000;
1601 if (infoflag & InterlaceMode) {
1602 if (xres == 1024)
1603 data = 0x0035;
1604 else if (xres == 1280)
1605 data = 0x0048;
1606 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301608 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001609 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301610 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001611 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301613 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001614 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001615
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301616 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001617
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301618 if (modeflag & LineCompareOff)
1619 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001620
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301621 if (ModeNo > 0x13) {
1622 if (pVBInfo->ModeType == ModeEGA)
1623 data2 |= 0x40;
1624 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001625
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001626 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301627 data = 0x60;
1628 if (pVBInfo->ModeType != ModeText) {
1629 data = data ^ 0x60;
1630 if (pVBInfo->ModeType != ModeEGA)
1631 data = data ^ 0xA0;
1632 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001633 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001634
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301635 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1636 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001637
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301638 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1639 /* if (XGINew_IF_DEF_NEW_LOWRES) */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001640 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex);
1641 * //030305 fix lowresolution bug */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001642
Aaro Koskinen58839b02011-03-13 12:26:23 +02001643 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301645 if (HwDeviceExtension->jChipType == XG27) {
1646 if (data & 0x40)
1647 data = 0x2c;
1648 else
1649 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001650 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001651 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301652 } else if (HwDeviceExtension->jChipType >= XG20) {
1653 if (data & 0x40)
1654 data = 0x33;
1655 else
1656 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001657 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1658 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301659 } else {
1660 if (data & 0x40)
1661 data = 0x2c;
1662 else
1663 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001664 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301665 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001666
1667}
1668
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001669static void XGI_WriteDAC(unsigned short dl,
1670 unsigned short ah,
1671 unsigned short al,
1672 unsigned short dh,
1673 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001674{
1675 unsigned short temp, bh, bl;
1676
1677 bh = ah;
1678 bl = al;
1679
1680 if (dl != 0) {
1681 temp = bh;
1682 bh = dh;
1683 dh = temp;
1684 if (dl == 1) {
1685 temp = bl;
1686 bl = dh;
1687 dh = temp;
1688 } else {
1689 temp = bl;
1690 bl = bh;
1691 bh = temp;
1692 }
1693 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001694 outb((unsigned short) dh, pVBInfo->P3c9);
1695 outb((unsigned short) bh, pVBInfo->P3c9);
1696 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001697}
1698
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001699static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301700 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001701{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301702 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
1703 ah, dh, *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301705 if (ModeNo <= 0x13)
1706 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1707 else
1708 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001709
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301710 data &= DACInfoFlag;
1711 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001712
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301713 if (data == 0x00)
1714 table = XGINew_MDA_DAC;
1715 else if (data == 0x08)
1716 table = XGINew_CGA_DAC;
1717 else if (data == 0x10)
1718 table = XGINew_EGA_DAC;
1719 else if (data == 0x18) {
1720 time = 256;
1721 table = XGINew_VGA_DAC;
1722 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001723
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301724 if (time == 256)
1725 j = 16;
1726 else
1727 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001728
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001729 outb(0xFF, pVBInfo->P3c6);
1730 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301732 for (i = 0; i < j; i++) {
1733 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301735 for (k = 0; k < 3; k++) {
1736 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301738 if (data & 0x01)
1739 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301741 if (data & 0x02)
1742 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001743
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001744 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301745 data = data >> 2;
1746 }
1747 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301749 if (time == 256) {
1750 for (i = 16; i < 32; i++) {
1751 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301753 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001754 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301755 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301757 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301759 for (m = 0; m < 9; m++) {
1760 di = si;
1761 bx = si + 0x04;
1762 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301764 for (n = 0; n < 3; n++) {
1765 for (o = 0; o < 5; o++) {
1766 dh = table[si];
1767 ah = table[di];
1768 al = table[bx];
1769 si++;
1770 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1771 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301773 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301775 for (o = 0; o < 3; o++) {
1776 dh = table[bx];
1777 ah = table[di];
1778 al = table[si];
1779 si--;
1780 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1781 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301783 dl++;
1784 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301786 si += 5;
1787 }
1788 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001789}
1790
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001791static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1792 unsigned short ModeIdIndex,
1793 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001794{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301795 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301797 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001798 /* si+St_ResInfo */
1799 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301800 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001801 /* si+Ext_ResInfo */
1802 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301804 /* if (ModeNo > 0x13) */
1805 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1806 /* else */
1807 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301809 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001810 /* si+St_ResInfo */
1811 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301812 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001813 /* si+Ext_ResInfo */
1814 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301816 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301818 if (ModeNo <= 0x13) {
1819 xres = pVBInfo->StResInfo[resindex].HTotal;
1820 yres = pVBInfo->StResInfo[resindex].VTotal;
1821 } else {
1822 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1823 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1824 }
1825 if (ModeNo > 0x13) {
1826 if (modeflag & HalfDCLK)
1827 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301829 if (modeflag & DoubleScanMode)
1830 yres = yres << 1;
1831 }
1832 /* if (modeflag & Charx8Dot) */
1833 /* { */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301835 if (xres == 720)
1836 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301838 /* } */
1839 pVBInfo->VGAHDE = xres;
1840 pVBInfo->HDE = xres;
1841 pVBInfo->VGAVDE = yres;
1842 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001843}
1844
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001845static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1846 unsigned short ModeIdIndex,
1847 unsigned short RefreshRateTableIndex,
1848 struct vb_device_info *pVBInfo)
1849{
1850 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1851
1852 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1853
1854 tempbx = BX;
1855
1856 if (ModeNo <= 0x13) {
1857 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1858 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1859 } else {
1860 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1861 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1862 }
1863
1864 tempal = tempal & 0x0f;
1865
1866 if (tempbx <= 1) { /* ExpLink */
1867 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001868 /* find no Ext_CRT2CRTC2 */
1869 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001870 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001871 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1872 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001873 }
1874
1875 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
1876 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001877 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1878 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001879 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001880 tempal = pVBInfo->RefIndex[
1881 RefreshRateTableIndex].
1882 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001883 }
1884
1885 if (tempbx & 0x01)
1886 tempal = (tempal >> 4);
1887
1888 tempal = (tempal & 0x0f);
1889 }
1890
1891 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
1892
1893 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1894 if ((tempbx == 5) || (tempbx) == 7)
1895 tempcx = LCDDesDataLen2;
1896 else if ((tempbx == 3) || (tempbx == 8))
1897 tempcx = LVDSDesDataLen2;
1898 }
1899 /* mov di, word ptr cs:LCDDataList[bx] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001900 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] |
1901 (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001902
1903 switch (tempbx) {
1904 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001905 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001906 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001907 break;
1908 case 2:
1909 tempdi = XGI_EPLLCDDataPtr;
1910 break;
1911 case 3:
1912 tempdi = XGI_EPLLCDDesDataPtr;
1913 break;
1914 case 4:
1915 tempdi = XGI_LCDDataTable;
1916 break;
1917 case 5:
1918 tempdi = XGI_LCDDesDataTable;
1919 break;
1920 case 6:
1921 tempdi = XGI_EPLCHLCDRegPtr;
1922 break;
1923 case 7:
1924 case 8:
1925 case 9:
1926 tempdi = NULL;
1927 break;
1928 default:
1929 break;
1930 }
1931
1932 if (tempdi == NULL) /* OEMUtil */
1933 return NULL;
1934
1935 table = tempbx;
1936 i = 0;
1937
1938 while (tempdi[i].PANELID != 0xff) {
1939 tempdx = pVBInfo->LCDResInfo;
1940 if (tempbx & 0x0080) { /* OEMUtil */
1941 tempbx &= (~0x0080);
1942 tempdx = pVBInfo->LCDTypeInfo;
1943 }
1944
1945 if (pVBInfo->LCDInfo & EnableScalingLCD)
1946 tempdx &= (~PanelResInfo);
1947
1948 if (tempdi[i].PANELID == tempdx) {
1949 tempbx = tempdi[i].MASK;
1950 tempdx = pVBInfo->LCDInfo;
1951
1952 if (ModeNo <= 0x13) /* alan 09/10/2003 */
1953 tempdx |= SetLCDStdMode;
1954
1955 if (modeflag & HalfDCLK)
1956 tempdx |= SetLCDLowResolution;
1957
1958 tempbx &= tempdx;
1959 if (tempbx == tempdi[i].CAP)
1960 break;
1961 }
1962 i++;
1963 }
1964
1965 if (table == 0) {
1966 switch (tempdi[i].DATAPTR) {
1967 case 0:
1968 return &XGI_LVDSCRT11024x768_1_H[tempal];
1969 break;
1970 case 1:
1971 return &XGI_LVDSCRT11024x768_2_H[tempal];
1972 break;
1973 case 2:
1974 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1975 break;
1976 case 3:
1977 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1978 break;
1979 case 4:
1980 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1981 break;
1982 case 5:
1983 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1984 break;
1985 case 6:
1986 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1987 break;
1988 case 7:
1989 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1990 break;
1991 case 8:
1992 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1993 break;
1994 case 9:
1995 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1996 break;
1997 case 10:
1998 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1999 break;
2000 default:
2001 break;
2002 }
2003 } else if (table == 1) {
2004 switch (tempdi[i].DATAPTR) {
2005 case 0:
2006 return &XGI_LVDSCRT11024x768_1_V[tempal];
2007 break;
2008 case 1:
2009 return &XGI_LVDSCRT11024x768_2_V[tempal];
2010 break;
2011 case 2:
2012 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2013 break;
2014 case 3:
2015 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2016 break;
2017 case 4:
2018 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2019 break;
2020 case 5:
2021 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2022 break;
2023 case 6:
2024 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2025 break;
2026 case 7:
2027 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2028 break;
2029 case 8:
2030 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2031 break;
2032 case 9:
2033 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2034 break;
2035 case 10:
2036 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2037 break;
2038 default:
2039 break;
2040 }
2041 } else if (table == 2) {
2042 switch (tempdi[i].DATAPTR) {
2043 case 0:
2044 return &XGI_LVDS1024x768Data_1[tempal];
2045 break;
2046 case 1:
2047 return &XGI_LVDS1024x768Data_2[tempal];
2048 break;
2049 case 2:
2050 return &XGI_LVDS1280x1024Data_1[tempal];
2051 break;
2052 case 3:
2053 return &XGI_LVDS1280x1024Data_2[tempal];
2054 break;
2055 case 4:
2056 return &XGI_LVDS1400x1050Data_1[tempal];
2057 break;
2058 case 5:
2059 return &XGI_LVDS1400x1050Data_2[tempal];
2060 break;
2061 case 6:
2062 return &XGI_LVDS1600x1200Data_1[tempal];
2063 break;
2064 case 7:
2065 return &XGI_LVDSNoScalingData[tempal];
2066 break;
2067 case 8:
2068 return &XGI_LVDS1024x768Data_1x75[tempal];
2069 break;
2070 case 9:
2071 return &XGI_LVDS1024x768Data_2x75[tempal];
2072 break;
2073 case 10:
2074 return &XGI_LVDS1280x1024Data_1x75[tempal];
2075 break;
2076 case 11:
2077 return &XGI_LVDS1280x1024Data_2x75[tempal];
2078 break;
2079 case 12:
2080 return &XGI_LVDSNoScalingDatax75[tempal];
2081 break;
2082 default:
2083 break;
2084 }
2085 } else if (table == 3) {
2086 switch (tempdi[i].DATAPTR) {
2087 case 0:
2088 return &XGI_LVDS1024x768Des_1[tempal];
2089 break;
2090 case 1:
2091 return &XGI_LVDS1024x768Des_3[tempal];
2092 break;
2093 case 2:
2094 return &XGI_LVDS1024x768Des_2[tempal];
2095 break;
2096 case 3:
2097 return &XGI_LVDS1280x1024Des_1[tempal];
2098 break;
2099 case 4:
2100 return &XGI_LVDS1280x1024Des_2[tempal];
2101 break;
2102 case 5:
2103 return &XGI_LVDS1400x1050Des_1[tempal];
2104 break;
2105 case 6:
2106 return &XGI_LVDS1400x1050Des_2[tempal];
2107 break;
2108 case 7:
2109 return &XGI_LVDS1600x1200Des_1[tempal];
2110 break;
2111 case 8:
2112 return &XGI_LVDSNoScalingDesData[tempal];
2113 break;
2114 case 9:
2115 return &XGI_LVDS1024x768Des_1x75[tempal];
2116 break;
2117 case 10:
2118 return &XGI_LVDS1024x768Des_3x75[tempal];
2119 break;
2120 case 11:
2121 return &XGI_LVDS1024x768Des_2x75[tempal];
2122 break;
2123 case 12:
2124 return &XGI_LVDS1280x1024Des_1x75[tempal];
2125 break;
2126 case 13:
2127 return &XGI_LVDS1280x1024Des_2x75[tempal];
2128 break;
2129 case 14:
2130 return &XGI_LVDSNoScalingDesDatax75[tempal];
2131 break;
2132 default:
2133 break;
2134 }
2135 } else if (table == 4) {
2136 switch (tempdi[i].DATAPTR) {
2137 case 0:
2138 return &XGI_ExtLCD1024x768Data[tempal];
2139 break;
2140 case 1:
2141 return &XGI_StLCD1024x768Data[tempal];
2142 break;
2143 case 2:
2144 return &XGI_CetLCD1024x768Data[tempal];
2145 break;
2146 case 3:
2147 return &XGI_ExtLCD1280x1024Data[tempal];
2148 break;
2149 case 4:
2150 return &XGI_StLCD1280x1024Data[tempal];
2151 break;
2152 case 5:
2153 return &XGI_CetLCD1280x1024Data[tempal];
2154 break;
2155 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002156 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002157 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002158 break;
2159 case 8:
2160 return &XGI_CetLCD1400x1050Data[tempal];
2161 break;
2162 case 9:
2163 return &XGI_ExtLCD1600x1200Data[tempal];
2164 break;
2165 case 10:
2166 return &XGI_StLCD1600x1200Data[tempal];
2167 break;
2168 case 11:
2169 return &XGI_NoScalingData[tempal];
2170 break;
2171 case 12:
2172 return &XGI_ExtLCD1024x768x75Data[tempal];
2173 break;
2174 case 13:
2175 return &XGI_ExtLCD1024x768x75Data[tempal];
2176 break;
2177 case 14:
2178 return &XGI_CetLCD1024x768x75Data[tempal];
2179 break;
2180 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002181 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002182 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002183 break;
2184 case 17:
2185 return &XGI_CetLCD1280x1024x75Data[tempal];
2186 break;
2187 case 18:
2188 return &XGI_NoScalingDatax75[tempal];
2189 break;
2190 default:
2191 break;
2192 }
2193 } else if (table == 5) {
2194 switch (tempdi[i].DATAPTR) {
2195 case 0:
2196 return &XGI_ExtLCDDes1024x768Data[tempal];
2197 break;
2198 case 1:
2199 return &XGI_StLCDDes1024x768Data[tempal];
2200 break;
2201 case 2:
2202 return &XGI_CetLCDDes1024x768Data[tempal];
2203 break;
2204 case 3:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002205 if ((pVBInfo->VBType & VB_XGI301LV) ||
2206 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002207 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2208 else
2209 return &XGI_ExtLCDDes1280x1024Data[tempal];
2210 break;
2211 case 4:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002212 if ((pVBInfo->VBType & VB_XGI301LV) ||
2213 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002214 return &XGI_StLCDDLDes1280x1024Data[tempal];
2215 else
2216 return &XGI_StLCDDes1280x1024Data[tempal];
2217 break;
2218 case 5:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002219 if ((pVBInfo->VBType & VB_XGI301LV) ||
2220 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002221 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2222 else
2223 return &XGI_CetLCDDes1280x1024Data[tempal];
2224 break;
2225 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002226 case 7:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002227 if ((pVBInfo->VBType & VB_XGI301LV) ||
2228 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002229 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002230 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002231 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002232 break;
2233 case 8:
2234 return &XGI_CetLCDDes1400x1050Data[tempal];
2235 break;
2236 case 9:
2237 return &XGI_CetLCDDes1400x1050Data2[tempal];
2238 break;
2239 case 10:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002240 if ((pVBInfo->VBType & VB_XGI301LV) ||
2241 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002242 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2243 else
2244 return &XGI_ExtLCDDes1600x1200Data[tempal];
2245 break;
2246 case 11:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002247 if ((pVBInfo->VBType & VB_XGI301LV) ||
2248 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002249 return &XGI_StLCDDLDes1600x1200Data[tempal];
2250 else
2251 return &XGI_StLCDDes1600x1200Data[tempal];
2252 break;
2253 case 12:
2254 return &XGI_NoScalingDesData[tempal];
2255 break;
2256 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002257 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002258 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002259 break;
2260 case 15:
2261 return &XGI_CetLCDDes1024x768x75Data[tempal];
2262 break;
2263 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002264 case 17:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002265 if ((pVBInfo->VBType & VB_XGI301LV) ||
2266 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002267 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002268 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002269 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002270 break;
2271 case 18:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002272 if ((pVBInfo->VBType & VB_XGI301LV) ||
2273 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002274 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2275 else
2276 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2277 break;
2278 case 19:
2279 return &XGI_NoScalingDesDatax75[tempal];
2280 break;
2281 default:
2282 break;
2283 }
2284 } else if (table == 6) {
2285 switch (tempdi[i].DATAPTR) {
2286 case 0:
2287 return &XGI_CH7017LV1024x768[tempal];
2288 break;
2289 case 1:
2290 return &XGI_CH7017LV1400x1050[tempal];
2291 break;
2292 default:
2293 break;
2294 }
2295 }
2296 return NULL;
2297}
2298
2299static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2300 unsigned short ModeIdIndex,
2301 unsigned short RefreshRateTableIndex,
2302 struct vb_device_info *pVBInfo)
2303{
2304 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2305 struct XGI330_TVDataTablStruct *tempdi = NULL;
2306
2307 tempbx = BX;
2308
2309 if (ModeNo <= 0x13) {
2310 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2311 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2312 } else {
2313 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2314 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2315 }
2316
2317 tempal = tempal & 0x3f;
2318 table = tempbx;
2319
2320 switch (tempbx) {
2321 case 0:
2322 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002323 break;
2324 case 1:
2325 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002326 break;
2327 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03002328 case 6:
2329 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002330 break;
2331 case 3:
2332 tempdi = NULL;
2333 break;
2334 case 4:
2335 tempdi = XGI_TVDataTable;
2336 break;
2337 case 5:
2338 tempdi = NULL;
2339 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002340 default:
2341 break;
2342 }
2343
2344 if (tempdi == NULL) /* OEMUtil */
2345 return NULL;
2346
2347 tempdx = pVBInfo->TVInfo;
2348
2349 if (pVBInfo->VBInfo & SetInSlaveMode)
2350 tempdx = tempdx | SetTVLockMode;
2351
2352 if (modeflag & HalfDCLK)
2353 tempdx = tempdx | SetTVLowResolution;
2354
2355 i = 0;
2356
2357 while (tempdi[i].MASK != 0xffff) {
2358 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2359 break;
2360 i++;
2361 }
2362
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002363 /* 07/05/22 */
2364 if (table == 0x00) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002365 } else if (table == 0x01) {
2366 } else if (table == 0x04) {
2367 switch (tempdi[i].DATAPTR) {
2368 case 0:
2369 return &XGI_ExtPALData[tempal];
2370 break;
2371 case 1:
2372 return &XGI_ExtNTSCData[tempal];
2373 break;
2374 case 2:
2375 return &XGI_StPALData[tempal];
2376 break;
2377 case 3:
2378 return &XGI_StNTSCData[tempal];
2379 break;
2380 case 4:
2381 return &XGI_ExtHiTVData[tempal];
2382 break;
2383 case 5:
2384 return &XGI_St2HiTVData[tempal];
2385 break;
2386 case 6:
2387 return &XGI_ExtYPbPr525iData[tempal];
2388 break;
2389 case 7:
2390 return &XGI_ExtYPbPr525pData[tempal];
2391 break;
2392 case 8:
2393 return &XGI_ExtYPbPr750pData[tempal];
2394 break;
2395 case 9:
2396 return &XGI_StYPbPr525iData[tempal];
2397 break;
2398 case 10:
2399 return &XGI_StYPbPr525pData[tempal];
2400 break;
2401 case 11:
2402 return &XGI_StYPbPr750pData[tempal];
2403 break;
2404 case 12: /* avoid system hang */
2405 return &XGI_ExtNTSCData[tempal];
2406 break;
2407 case 13:
2408 return &XGI_St1HiTVData[tempal];
2409 break;
2410 default:
2411 break;
2412 }
2413 } else if (table == 0x02) {
2414 switch (tempdi[i].DATAPTR) {
2415 case 0:
2416 return &XGI_CHTVUNTSCData[tempal];
2417 break;
2418 case 1:
2419 return &XGI_CHTVONTSCData[tempal];
2420 break;
2421 case 2:
2422 return &XGI_CHTVUPALData[tempal];
2423 break;
2424 case 3:
2425 return &XGI_CHTVOPALData[tempal];
2426 break;
2427 default:
2428 break;
2429 }
2430 } else if (table == 0x06) {
2431 }
2432 return NULL;
2433}
2434
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002435static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302436 unsigned short RefreshRateTableIndex,
2437 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002438{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302439 unsigned short tempbx;
2440 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302442 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302444 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2445 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2446 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2447 pVBInfo);
2448 pVBInfo->VGAHT = LCDPtr->VGAHT;
2449 pVBInfo->VGAVT = LCDPtr->VGAVT;
2450 pVBInfo->HT = LCDPtr->LCDHT;
2451 pVBInfo->VT = LCDPtr->LCDVT;
2452 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002453
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302454 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2455 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2456 | EnableScalingLCD))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002457 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2458 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302459 pVBInfo->HDE = 1024;
2460 pVBInfo->VDE = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002461 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2462 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302463 pVBInfo->HDE = 1280;
2464 pVBInfo->VDE = 1024;
2465 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2466 pVBInfo->HDE = 1400;
2467 pVBInfo->VDE = 1050;
2468 } else {
2469 pVBInfo->HDE = 1600;
2470 pVBInfo->VDE = 1200;
2471 }
2472 }
2473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002474}
2475
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002476static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302477 unsigned short RefreshRateTableIndex,
2478 struct xgi_hw_device_info *HwDeviceExtension,
2479 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002480{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302481 unsigned char index;
2482 unsigned short tempbx, i;
2483 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2484 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302486 if (ModeNo <= 0x13)
2487 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2488 else
2489 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002490
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302491 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002492
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002493 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002494
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002495 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2496 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2497 XGI_GetLcdPtr(tempbx, ModeNo,
2498 ModeIdIndex,
2499 RefreshRateTableIndex,
2500 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002501
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002502 for (i = 0; i < 8; i++)
2503 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302504 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002505
2506 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
2507
2508 tempbx = 1;
2509
2510 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2511 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2512 XGI_GetLcdPtr(
2513 tempbx,
2514 ModeNo,
2515 ModeIdIndex,
2516 RefreshRateTableIndex,
2517 pVBInfo);
2518 for (i = 0; i < 7; i++)
2519 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2520 }
2521
2522 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002523}
2524
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002525static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2526{
2527 unsigned char tempal, tempah, tempbl, i;
2528
Aaro Koskinen58839b02011-03-13 12:26:23 +02002529 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002530 tempal = tempah & 0x0F;
2531 tempah = tempah & 0xF0;
2532 i = 0;
2533 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2534
2535 while (tempbl != 0xFF) {
2536 if (tempbl & 0x80) { /* OEMUtil */
2537 tempal = tempah;
2538 tempbl = tempbl & ~(0x80);
2539 }
2540
2541 if (tempal == tempbl)
2542 break;
2543
2544 i++;
2545
2546 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2547 }
2548
2549 return i;
2550}
2551
2552static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2553{
2554 unsigned short tempah, tempal, tempbl, i;
2555
2556 tempal = pVBInfo->LCDResInfo;
2557 tempah = pVBInfo->LCDTypeInfo;
2558
2559 i = 0;
2560 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2561
2562 while (tempbl != 0xFF) {
2563 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2564 tempal = tempah;
2565 tempbl &= ~0x80;
2566 }
2567
2568 if (tempal == tempbl)
2569 break;
2570
2571 i++;
2572 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2573 }
2574
2575 if (tempbl == 0xFF) {
2576 pVBInfo->LCDResInfo = Panel1024x768;
2577 pVBInfo->LCDTypeInfo = 0;
2578 i = 0;
2579 }
2580
2581 return i;
2582}
2583
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002584static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2585 unsigned short *VSyncWidth,
2586 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002587{
2588 unsigned short Index;
2589
2590 Index = XGI_GetLCDCapPtr(pVBInfo);
2591 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2592 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2593
2594 return;
2595}
2596
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002597static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302598 unsigned short RefreshRateTableIndex,
2599 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002600{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302601 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2602 unsigned long temp, temp1, temp2, temp3, push3;
2603 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2604 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302606 if (ModeNo > 0x13)
2607 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2608 else
2609 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002610
Aaro Koskinen66cface2011-08-31 21:46:13 +03002611 tempbx = 3;
2612 if (pVBInfo->LCDInfo & EnableScalingLCD)
2613 LCDPtr1 =
2614 (struct XGI330_LCDDataDesStruct2 *)
2615 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002616 tempbx,
2617 ModeNo,
2618 ModeIdIndex,
2619 RefreshRateTableIndex,
2620 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002621 else
2622 LCDPtr =
2623 (struct XGI330_LCDDataDesStruct *)
2624 XGI_GetLcdPtr(
2625 tempbx,
2626 ModeNo,
2627 ModeIdIndex,
2628 RefreshRateTableIndex,
2629 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002630
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002631 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2632 push1 = tempbx;
2633 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002634
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002635 /* GetLCDResInfo */
2636 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2637 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
2638 tempax = 1024;
2639 tempbx = 768;
2640 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2641 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
2642 tempax = 1280;
2643 tempbx = 1024;
2644 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2645 tempax = 1400;
2646 tempbx = 1050;
2647 } else {
2648 tempax = 1600;
2649 tempbx = 1200;
2650 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002651
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002652 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2653 pVBInfo->HDE = tempax;
2654 pVBInfo->VDE = tempbx;
2655 pVBInfo->VGAHDE = tempax;
2656 pVBInfo->VGAVDE = tempbx;
2657 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002658
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002659 tempax = pVBInfo->HT;
2660
2661 if (pVBInfo->LCDInfo & EnableScalingLCD)
2662 tempbx = LCDPtr1->LCDHDES;
2663 else
2664 tempbx = LCDPtr->LCDHDES;
2665
2666 tempcx = pVBInfo->HDE;
2667 tempbx = tempbx & 0x0fff;
2668 tempcx += tempbx;
2669
2670 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002671 tempcx -= tempax;
2672
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002673 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002674
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002675 tempcx = tempcx >> 3;
2676 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002677
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002678 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2679 (unsigned short) (tempbx & 0xff));
2680 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2681 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002682
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002683 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002684
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002685 if (pVBInfo->LCDInfo & EnableScalingLCD)
2686 tempbx = LCDPtr1->LCDHRS;
2687 else
2688 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002689
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002690 tempcx = push2;
2691
2692 if (pVBInfo->LCDInfo & EnableScalingLCD)
2693 tempcx = LCDPtr1->LCDHSync;
2694
2695 tempcx += tempbx;
2696
2697 if (tempcx >= tempax)
2698 tempcx -= tempax;
2699
2700 tempax = tempbx & 0x07;
2701 tempax = tempax >> 5;
2702 tempcx = tempcx >> 3;
2703 tempbx = tempbx >> 3;
2704
2705 tempcx &= 0x1f;
2706 tempax |= tempcx;
2707
2708 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2709 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2710 (unsigned short) (tempbx & 0xff));
2711
2712 tempax = pVBInfo->VT;
2713 if (pVBInfo->LCDInfo & EnableScalingLCD)
2714 tempbx = LCDPtr1->LCDVDES;
2715 else
2716 tempbx = LCDPtr->LCDVDES;
2717 tempcx = pVBInfo->VDE;
2718
2719 tempbx = tempbx & 0x0fff;
2720 tempcx += tempbx;
2721 if (tempcx >= tempax)
2722 tempcx -= tempax;
2723
2724 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2725 (unsigned short) (tempbx & 0xff));
2726 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2727 (unsigned short) (tempcx & 0xff));
2728
2729 tempbx = (tempbx >> 8) & 0x07;
2730 tempcx = (tempcx >> 8) & 0x07;
2731
2732 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2733 (unsigned short) ((tempcx << 3)
2734 | tempbx));
2735
2736 tempax = pVBInfo->VT;
2737 if (pVBInfo->LCDInfo & EnableScalingLCD)
2738 tempbx = LCDPtr1->LCDVRS;
2739 else
2740 tempbx = LCDPtr->LCDVRS;
2741
2742 /* tempbx = tempbx >> 4; */
2743 tempcx = push1;
2744
2745 if (pVBInfo->LCDInfo & EnableScalingLCD)
2746 tempcx = LCDPtr1->LCDVSync;
2747
2748 tempcx += tempbx;
2749 if (tempcx >= tempax)
2750 tempcx -= tempax;
2751
2752 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2753 (unsigned short) (tempbx & 0xff));
2754 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2755 (unsigned short) (tempcx & 0x0f));
2756
2757 tempax = ((tempbx >> 8) & 0x07) << 3;
2758
2759 tempbx = pVBInfo->VGAVDE;
2760 if (tempbx != pVBInfo->VDE)
2761 tempax |= 0x40;
2762
2763 if (pVBInfo->LCDInfo & EnableLVDSDDA)
2764 tempax |= 0x40;
2765
2766 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2767 tempax);
2768
2769 tempcx = pVBInfo->VGAVT;
2770 tempbx = pVBInfo->VDE;
2771 tempax = pVBInfo->VGAVDE;
2772 tempcx -= tempax;
2773
2774 temp = tempax; /* 0430 ylshieh */
2775 temp1 = (temp << 18) / tempbx;
2776
2777 tempdx = (unsigned short) ((temp << 18) % tempbx);
2778
2779 if (tempdx != 0)
2780 temp1 += 1;
2781
2782 temp2 = temp1;
2783 push3 = temp2;
2784
2785 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2786 (unsigned short) (temp2 & 0xff));
2787 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2788 (unsigned short) ((temp2 >> 8) & 0xff));
2789
2790 tempbx = (unsigned short) (temp2 >> 16);
2791 tempax = tempbx & 0x03;
2792
2793 tempbx = pVBInfo->VGAVDE;
2794 if (tempbx == pVBInfo->VDE)
2795 tempax |= 0x04;
2796
2797 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2798
2799 if (pVBInfo->VBType & VB_XGI301C) {
2800 temp2 = push3;
2801 xgifb_reg_set(pVBInfo->Part4Port,
2802 0x3c,
2803 (unsigned short) (temp2 & 0xff));
2804 xgifb_reg_set(pVBInfo->Part4Port,
2805 0x3b,
2806 (unsigned short) ((temp2 >> 8) &
2807 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002808 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002809 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2810 ~0xc0,
2811 (unsigned short) ((tempbx &
2812 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002813
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002814 tempcx = pVBInfo->VGAVDE;
2815 if (tempcx == pVBInfo->VDE)
2816 xgifb_reg_and_or(pVBInfo->Part4Port,
2817 0x30, ~0x0c, 0x00);
2818 else
2819 xgifb_reg_and_or(pVBInfo->Part4Port,
2820 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302821 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002822
2823 tempcx = pVBInfo->VGAHDE;
2824 tempbx = pVBInfo->HDE;
2825
2826 temp1 = tempcx << 16;
2827
2828 tempax = (unsigned short) (temp1 / tempbx);
2829
2830 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2831 tempax = 65535;
2832
2833 temp3 = tempax;
2834 temp1 = pVBInfo->VGAHDE << 16;
2835
2836 temp1 /= temp3;
2837 temp3 = temp3 << 16;
2838 temp1 -= 1;
2839
2840 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2841
2842 tempax = (unsigned short) (temp3 & 0xff);
2843 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2844
2845 temp1 = pVBInfo->VGAVDE << 18;
2846 temp1 = temp1 / push3;
2847 tempbx = (unsigned short) (temp1 & 0xffff);
2848
2849 if (pVBInfo->LCDResInfo == Panel1024x768)
2850 tempbx -= 1;
2851
2852 tempax = ((tempbx >> 8) & 0xff) << 3;
2853 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2854 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2855 (unsigned short) (tempax & 0xff));
2856 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2857 (unsigned short) (tempbx & 0xff));
2858
2859 temp3 = temp3 >> 16;
2860
2861 if (modeflag & HalfDCLK)
2862 temp3 = temp3 >> 1;
2863
2864 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2865 (unsigned short) ((temp3 >> 8) & 0xff));
2866 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2867 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002868}
2869
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002870/* --------------------------------------------------------------------- */
2871/* Function : XGI_GETLCDVCLKPtr */
2872/* Input : */
2873/* Output : al -> VCLK Index */
2874/* Description : */
2875/* --------------------------------------------------------------------- */
2876static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2877 struct vb_device_info *pVBInfo)
2878{
2879 unsigned short index;
2880
2881 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002882 /* index = XGI_GetLCDCapPtr(pVBInfo); */
2883 index = XGI_GetLCDCapPtr1(pVBInfo);
2884
2885 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2886 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2887 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2888 } else { /* LCDA */
2889 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2890 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2891 }
2892 }
2893 return;
2894}
2895
2896static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2897 unsigned short ModeNo, unsigned short ModeIdIndex,
2898 struct vb_device_info *pVBInfo)
2899{
2900
2901 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002902 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002903
2904 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002905 /* si+St_ResInfo */
2906 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002907 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002908 /* si+Ext_ResInfo */
2909 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002910
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002911 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2912 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002913 index = XGI_GetLCDCapPtr(pVBInfo);
2914 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2915
2916 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
2917 return tempal;
2918
2919 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002920 if (pVBInfo->VBType &
2921 (VB_XGI301B |
2922 VB_XGI302B |
2923 VB_XGI301LV |
2924 VB_XGI302LV |
2925 VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002926 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
2927 tempal = HiTVVCLKDIV2;
2928 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2929 tempal = HiTVVCLK;
2930 if (pVBInfo->TVInfo & TVSimuMode) {
2931 tempal = HiTVSimuVCLK;
2932 if (!(modeflag & Charx8Dot))
2933 tempal = HiTVTextVCLK;
2934
2935 }
2936 return tempal;
2937 }
2938
2939 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
2940 tempal = YPbPr750pVCLK;
2941 return tempal;
2942 }
2943
2944 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
2945 tempal = YPbPr525pVCLK;
2946 return tempal;
2947 }
2948
2949 tempal = NTSC1024VCLK;
2950
2951 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
2952 tempal = TVVCLKDIV2;
2953 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2954 tempal = TVVCLK;
2955 }
2956
2957 if (pVBInfo->VBInfo & SetCRT2ToTV)
2958 return tempal;
2959 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002960 } /* {End of VB} */
2961
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002962 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002963 tempal = tempal >> 2;
2964 tempal &= 0x03;
2965
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002966 /* for Dot8 Scaling LCD */
2967 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002968 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2969
2970 if (ModeNo <= 0x13)
2971 return tempal;
2972
2973 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2974 return tempal;
2975}
2976
2977static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2978 unsigned char *di_1, struct vb_device_info *pVBInfo)
2979{
Aaro Koskinen83f76a92011-08-31 21:45:58 +03002980 if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002981 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
2982 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
2983 & ProgrammingCRT2)) {
2984 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
2985 *di_1 = XGI_VBVCLKData[tempal].SR2C;
2986 }
2987 } else {
2988 *di_0 = XGI_VCLKData[tempal].SR2B;
2989 *di_1 = XGI_VCLKData[tempal].SR2C;
2990 }
2991}
2992
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002993static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302994 unsigned short RefreshRateTableIndex,
2995 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002996{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 unsigned char di_0, di_1, tempal;
2998 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303000 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3001 pVBInfo);
3002 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3003 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303005 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003006 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303007 (unsigned short) (0x10 * i));
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003008 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303009 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003010 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3011 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303012 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003013 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3014 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303015 }
3016 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003017}
3018
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003019static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303020 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003021{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303022 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003023
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303024 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3025 | VB_XGI302LV | VB_XGI301C)) {
3026 tempcl = 0;
3027 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003028 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003029
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303030 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003031 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303032 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003033 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303034 if (!(temp & 0x40))
3035 tempcl |= ActiveCRT1;
3036 }
3037 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003038
Aaro Koskinen58839b02011-03-13 12:26:23 +02003039 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303040 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303042 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003043 /* Check ChannelA by Part1_13 [2003/10/03] */
3044 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303045 if (tempax & 0x04)
3046 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303048 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303050 if (!(tempcl & ActiveLCD))
3051 if (temp == 0x01)
3052 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303054 if (temp == 0x04)
3055 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303057 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003058 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303060 if (!(temp & 0x08))
3061 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303063 if (!(temp & 0x04))
3064 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003065
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303066 if (temp & 0x02)
3067 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303069 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3070 if (temp & 0x01)
3071 tempch |= ActiveHiTV;
3072 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303074 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003075 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303076 pVBInfo->Part2Port,
3077 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003078
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303079 if (temp & 0x10)
3080 tempch |= ActiveYPbPr;
3081 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303083 if (tempch != 0)
3084 tempcl |= ActiveTV;
3085 }
3086 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003087
Aaro Koskinen58839b02011-03-13 12:26:23 +02003088 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 if (tempcl & ActiveLCD) {
3090 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3091 if (temp & ActiveTV)
3092 tempcl |= ActiveTV;
3093 }
3094 }
3095 temp = tempcl;
3096 tempbl = ~ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003097 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303099 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003100 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303101 } else {
3102 return;
3103 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003104}
3105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303106void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3107 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003108{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303109 /*
3110 if ( HwDeviceExtension->jChipType >= XG20 ) {
3111 pVBInfo->Set_VGAType = XG20;
Aaro Koskinen06587332011-03-13 12:26:10 +02003112 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303113 pVBInfo->Set_VGAType = VGA_XGI340;
3114 }
3115 */
3116 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003117}
3118
Bill Pemberton80adad82010-06-17 13:10:51 -04003119void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003120{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303121 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303123 if (pVBInfo->IF_DEF_LVDS == 0) {
3124 tempbx = VB_XGI302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003125 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303126 if (flag != 0x02) {
3127 tempbx = VB_XGI301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003128 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303129 if (flag >= 0xB0) {
3130 tempbx = VB_XGI301B;
3131 if (flag >= 0xC0) {
3132 tempbx = VB_XGI301C;
3133 if (flag >= 0xD0) {
3134 tempbx = VB_XGI301LV;
3135 if (flag >= 0xE0) {
3136 tempbx = VB_XGI302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003137 tempah = xgifb_reg_get(
3138 pVBInfo->Part4Port,
3139 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303140 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003141 tempbx =
3142 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303143 }
3144 }
3145 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303147 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003148 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303149 pVBInfo->Part4Port,
3150 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 if (!(flag & 0x02))
3153 tempbx = tempbx | VB_NoLCD;
3154 }
3155 }
3156 }
3157 pVBInfo->VBType = tempbx;
3158 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003159}
3160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303161void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3162 struct xgi_hw_device_info *HwDeviceExtension,
3163 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003164{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303165 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303167 if (ModeNo <= 0x13)
3168 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3169 else
3170 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003171
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303172 pVBInfo->SetFlag = 0;
3173 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3174 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003177 /* Check Display Device */
3178 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303179 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003180 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303181 push = temp;
3182 push = push << 8;
3183 tempax = temp << 8;
3184 tempbx = tempbx | tempax;
3185 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3186 | SetInSlaveMode | DisableCRT2Display);
3187 temp = 0xFFFF ^ temp;
3188 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003189
Aaro Koskinen58839b02011-03-13 12:26:23 +02003190 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303192 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003193
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303194 if ((pVBInfo->Set_VGAType >= XG20)
3195 || (pVBInfo->Set_VGAType >= XG40)) {
3196 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003197 /* if ((pVBInfo->VBType & VB_XGI302B)
3198 || (pVBInfo->VBType & VB_XGI301LV)
3199 || (pVBInfo->VBType & VB_XGI302LV)
3200 || (pVBInfo->VBType & VB_XGI301C))
3201 */
3202 if (pVBInfo->VBType &
3203 (VB_XGI302B |
3204 VB_XGI301LV |
3205 VB_XGI302LV |
3206 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303207 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003208 tempbx |=
3209 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303211 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003212 tempbx |=
3213 SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 }
3215 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303216 }
3217 }
3218 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003219
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303220 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003221 /* [Billy] 07/05/04 */
3222 if (((pVBInfo->IF_DEF_LVDS == 0) &&
3223 ((pVBInfo->VBType & VB_XGI301LV) ||
3224 (pVBInfo->VBType & VB_XGI302LV) ||
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003225 (pVBInfo->VBType & VB_XGI301C)))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303226 if (temp & SetYPbPr) { /* temp = CR38 */
3227 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003228 /* shampoo add for new
3229 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003230 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303231 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003232 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303233 temp &= YPbPrMode;
3234 tempbx |= SetCRT2ToHiVisionTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303236 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003237 tempbx &=
3238 (~SetCRT2ToHiVisionTV);
3239 tempbx |=
3240 SetCRT2ToYPbPr;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303241 }
3242 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003243
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303244 /* tempbx |= SetCRT2ToYPbPr; */
3245 }
3246 }
3247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003248
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303249 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303251 if (pVBInfo->IF_DEF_LVDS == 0) {
3252 if (pVBInfo->IF_DEF_YPbPr == 1) {
3253 if (pVBInfo->IF_DEF_HiVision == 1)
3254 temp = 0x09FC;
3255 else
3256 temp = 0x097C;
3257 } else {
3258 if (pVBInfo->IF_DEF_HiVision == 1)
3259 temp = 0x01FC;
3260 else
3261 temp = 0x017C;
3262 }
3263 } else { /* 3nd party chip */
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003264 temp = SetCRT2ToLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303265 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003266
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303267 if (!(tempbx & temp)) {
3268 tempax |= DisableCRT2Display;
3269 tempbx = 0;
3270 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003271
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303272 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3273 if (!(pVBInfo->VBType & VB_NoLCD)) {
3274 if (tempbx & SetCRT2ToLCDA) {
3275 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003276 tempbx &= (~(SetCRT2ToLCD |
3277 SetCRT2ToRAMDAC |
3278 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303279 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003280 tempbx &= (~(SetCRT2ToLCD |
3281 SetCRT2ToRAMDAC |
3282 SetCRT2ToTV |
3283 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303284 }
3285 }
3286 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003287
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303288 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003289 /* for driver abnormal */
3290 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3292 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003293 tempbx &= (0xFF00 |
3294 SetCRT2ToRAMDAC |
3295 SwitchToCRT2 |
3296 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303297 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3298 }
3299 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003300 tempbx &= (~(SetCRT2ToRAMDAC |
3301 SetCRT2ToLCD |
3302 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303303 }
3304 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003305
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303306 if (!(pVBInfo->VBType & VB_NoLCD)) {
3307 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003308 tempbx &= (0xFF00 |
3309 SetCRT2ToLCD |
3310 SwitchToCRT2 |
3311 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303312 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3313 }
3314 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003315
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303316 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003317 tempbx &= (0xFF00 |
3318 SetCRT2ToSCART |
3319 SwitchToCRT2 |
3320 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303321 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3322 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303324 if (pVBInfo->IF_DEF_YPbPr == 1) {
3325 if (tempbx & SetCRT2ToYPbPr)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003326 tempbx &= (0xFF00 |
3327 SwitchToCRT2 |
3328 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303329 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003330
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 if (pVBInfo->IF_DEF_HiVision == 1) {
3332 if (tempbx & SetCRT2ToHiVisionTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003333 tempbx &= (0xFF00 |
3334 SetCRT2ToHiVisionTV |
3335 SwitchToCRT2 |
3336 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303337 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003338
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303339 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3340 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3341 tempbx = DisableCRT2Display;
3342 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003343
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303344 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003345 if ((!(tempbx & DriverMode)) ||
3346 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303347 if (pVBInfo->IF_DEF_LCDA == 1) {
3348 if (!(tempbx & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003349 tempbx |= (SetInSlaveMode |
3350 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303352 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003353
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003354 /* LCD+TV can't support in slave mode
3355 * (Force LCDA+TV->LCDB) */
3356 if ((tempbx & SetInSlaveMode) &&
3357 (tempbx & SetCRT2ToLCDA)) {
3358 tempbx ^= (SetCRT2ToLCD |
3359 SetCRT2ToLCDA |
3360 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303361 pVBInfo->SetFlag |= ReserveTVOption;
3362 }
3363 }
3364 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303366 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003367}
3368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303369void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3370 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003371{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303372 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303374 tempbx = 0;
3375 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303377 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3378 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003379 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3380 St_ModeFlag; /* si+St_ModeFlag */
3381 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3382 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003384 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3385 Ext_ModeFlag;
3386 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3387 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303388 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303390 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003391 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303392 tempbx = temp;
3393 if (tempbx & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003394 tempbx &= (SetCHTVOverScan |
3395 SetPALMTV |
3396 SetPALNTV |
3397 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303398 if (tempbx & SetPALMTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003399 /* set to NTSC if PAL-M */
3400 tempbx &= ~SetPALTV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303401 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003402 tempbx &= (SetCHTVOverScan |
3403 SetNTSCJ |
3404 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303405 /*
3406 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003407 //PAL-M/PAL-N Info
3408 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3409 //00:PAL, 01:PAL-M, 10:PAL-N
3410 temp2 = (index1 & 0xC0) >> 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303411 tempbx |= temp2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003412 if (temp2 & 0x02) //PAL-M
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303413 tempbx &= (~SetPALTV);
3414 }
3415 */
3416 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303418 if (pVBInfo->IF_DEF_LVDS == 0) {
3419 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3420 tempbx |= SetPALTV;
3421 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303423 if (pVBInfo->IF_DEF_YPbPr == 1) {
3424 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003425 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303426 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003427
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303428 if (index1 == YPbPrMode525i)
3429 tempbx |= SetYPbPrMode525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003430
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303431 if (index1 == YPbPrMode525p)
3432 tempbx = tempbx | SetYPbPrMode525p;
3433 if (index1 == YPbPrMode750p)
3434 tempbx = tempbx | SetYPbPrMode750p;
3435 }
3436 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303438 if (pVBInfo->IF_DEF_HiVision == 1) {
3439 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3440 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
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) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003444 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3445 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303446 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003447
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003448 if (!(tempbx & SetPALTV) &&
3449 (modeflag > 13) &&
3450 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303451 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303455 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3456 if (pVBInfo->VBInfo & SetInSlaveMode)
3457 tempbx &= (~RPLLDIV2XO);
3458 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003459 if (tempbx &
3460 (SetYPbPrMode525p | SetYPbPrMode750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303461 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003462 else if (!(pVBInfo->VBType &
3463 (VB_XGI301B |
3464 VB_XGI302B |
3465 VB_XGI301LV |
3466 VB_XGI302LV |
3467 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 if (tempbx & TVSimuMode)
3469 tempbx &= (~RPLLDIV2XO);
3470 }
3471 }
3472 }
3473 }
3474 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003475}
3476
Bill Pemberton108afbf2010-06-17 13:10:47 -04003477unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303478 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003479{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303482 pVBInfo->LCDResInfo = 0;
3483 pVBInfo->LCDTypeInfo = 0;
3484 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303486 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003487 /* si+St_ModeFlag // */
3488 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303489 } else {
3490 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003491 /* si+Ext_ResInfo // */
3492 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003494
Aaro Koskinen58839b02011-03-13 12:26:23 +02003495 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303498 if (tempbx == 0)
3499 tempbx = Panel1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303501 /* LCD75 [2003/8/22] Vicent */
3502 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3503 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003504 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303505 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3506 tempax &= 0x0F;
3507 else
3508 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003509
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303510 if ((resinfo == 6) || (resinfo == 9)) {
3511 if (tempax >= 3)
3512 tempbx |= PanelRef75Hz;
3513 } else if ((resinfo == 7) || (resinfo == 8)) {
3514 if (tempax >= 4)
3515 tempbx |= PanelRef75Hz;
3516 }
3517 }
3518 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303520 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303524 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
3525 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303527 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003528
Aaro Koskinen58839b02011-03-13 12:26:23 +02003529 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303531 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003532
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303533 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003534
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303535 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003536
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303537 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003538
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303539 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3540 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3541 & VB_XGI301C)) && (tempax & LCDDualLink)) {
3542 tempbx |= SetLCDDualLink;
3543 }
3544 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003545
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303546 if (pVBInfo->IF_DEF_LVDS == 0) {
3547 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
3548 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3549 == 9) && (!(tempbx & EnableScalingLCD)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003550 /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3551 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303552 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303554 /*
3555 if (tempax & LCDBToA) {
3556 tempbx |= SetLCDBToA;
3557 }
3558 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303560 if (pVBInfo->IF_DEF_ExpLink == 1) {
3561 if (modeflag & HalfDCLK) {
3562 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
3563 if (!(tempbx & SetLCDtoNonExpanding)) {
3564 tempbx |= EnableLVDSDDA;
3565 } else {
3566 if (ModeNo > 0x13) {
3567 if (pVBInfo->LCDResInfo
3568 == Panel1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003569 if (resinfo == 4) {/* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303570 tempbx |= EnableLVDSDDA;
3571 }
3572 }
3573 }
3574 }
3575 }
3576 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303578 if (pVBInfo->VBInfo & SetInSlaveMode) {
3579 if (pVBInfo->VBInfo & SetNotSimuMode)
3580 tempbx |= LCDVESATiming;
3581 } else {
3582 tempbx |= LCDVESATiming;
3583 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303585 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303587 if (pVBInfo->IF_DEF_LVDS == 0) {
3588 if (tempax & (LockLCDBToA | StLCDBToA)) {
3589 if (pVBInfo->VBInfo & SetInSlaveMode) {
3590 if (!(tempax & LockLCDBToA)) {
3591 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003592 pVBInfo->VBInfo &=
3593 ~(SetSimuScanMode |
3594 SetInSlaveMode |
3595 SetCRT2ToLCD);
3596 pVBInfo->VBInfo |=
3597 SetCRT2ToLCDA |
3598 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303599 }
3600 }
3601 }
3602 }
3603 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303605 /*
3606 if (pVBInfo->IF_DEF_LVDS == 0) {
3607 if (tempax & (LockLCDBToA | StLCDBToA)) {
3608 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003609 if (!((!(tempax & LockLCDBToA)) &&
3610 (ModeNo > 0x13))) {
3611 pVBInfo->VBInfo &=
3612 ~(SetSimuScanMode |
3613 SetInSlaveMode |
3614 SetCRT2ToLCD);
3615 pVBInfo->VBInfo |=
3616 SetCRT2ToLCDA |
3617 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303618 }
3619 }
3620 }
3621 }
3622 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003623
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303624 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003625}
3626
Bill Pemberton108afbf2010-06-17 13:10:47 -04003627unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303628 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003629{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303630 if (ModeNo <= 5)
3631 ModeNo |= 1;
3632 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003633 /* for (*ModeIdIndex=0;
3634 *ModeIdIndex < sizeof(pVBInfo->SModeIDTable)
3635 / sizeof(struct XGI_StStruct);
3636 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303637 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003638 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3639 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303640 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003641 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3642 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303643 return 0;
3644 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303646 if (ModeNo == 0x07)
3647 (*ModeIdIndex)++; /* 400 lines */
3648 if (ModeNo <= 3)
3649 (*ModeIdIndex) += 2; /* 400 lines */
3650 /* else 350 lines */
3651 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003652 /* for (*ModeIdIndex=0;
3653 *ModeIdIndex < sizeof(pVBInfo->EModeIDTable)
3654 / sizeof(struct XGI_ExtStruct);
3655 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303656 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003657 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3658 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303659 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003660 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3661 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303662 return 0;
3663 }
3664 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303666 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003667}
3668
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003669static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3670{
3671 unsigned char ujRet = 0;
3672 unsigned char i = 0;
3673
3674 for (i = 0; i < 8; i++) {
3675 ujRet = ujRet << 1;
3676 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
3677 ujRet |= (ujDate >> i) & 1;
3678 }
3679
3680 return ujRet;
3681}
3682
3683/*----------------------------------------------------------------------------*/
3684/* output */
3685/* bl[5] : LVDS signal */
3686/* bl[1] : LVDS backlight */
3687/* bl[0] : LVDS VDD */
3688/*----------------------------------------------------------------------------*/
3689static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3690{
3691 unsigned char CR4A, temp;
3692
Aaro Koskinen58839b02011-03-13 12:26:23 +02003693 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003694 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003695
Aaro Koskinen58839b02011-03-13 12:26:23 +02003696 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003697
3698 temp = XG21GPIODataTransfer(temp);
3699 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003700 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003701 return temp;
3702}
3703
3704/*----------------------------------------------------------------------------*/
3705/* output */
3706/* bl[5] : LVDS signal */
3707/* bl[1] : LVDS backlight */
3708/* bl[0] : LVDS VDD */
3709/*----------------------------------------------------------------------------*/
3710static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3711{
3712 unsigned char CR4A, CRB4, temp;
3713
Aaro Koskinen58839b02011-03-13 12:26:23 +02003714 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003715 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003716
Aaro Koskinen58839b02011-03-13 12:26:23 +02003717 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003718
3719 temp &= 0x0C;
3720 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003721 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003722 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003723 temp |= ((CRB4 & 0x04) << 3);
3724 return temp;
3725}
3726
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303727void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
3728 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003729{
3730
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003731 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303732 if (pXGIHWDE->jChipType == XG21) {
3733 if (pVBInfo->IF_DEF_LVDS == 1) {
3734 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003735 /* LVDS VDD on */
3736 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303737 XGI_XG21SetPanelDelay(2, pVBInfo);
3738 }
3739 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003740 /* LVDS signal on */
3741 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303742 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003743 /* LVDS backlight on */
3744 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303745 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003746 /* DVO/DVI signal on */
3747 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003749
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 (pXGIHWDE->jChipType == XG27) {
3753 if (pVBInfo->IF_DEF_LVDS == 1) {
3754 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003755 /* LVDS VDD on */
3756 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303757 XGI_XG21SetPanelDelay(2, pVBInfo);
3758 }
3759 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003760 /* LVDS signal on */
3761 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303762 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003763 /* LVDS backlight on */
3764 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303765 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003766 /* DVO/DVI signal on */
3767 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303768 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003771}
3772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303773void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
3774 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003775{
3776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303777 if (pXGIHWDE->jChipType == XG21) {
3778 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003779 /* LVDS backlight off */
3780 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303781 XGI_XG21SetPanelDelay(3, pVBInfo);
3782 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003783 /* DVO/DVI signal off */
3784 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303785 }
3786 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303788 if (pXGIHWDE->jChipType == XG27) {
3789 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003790 /* LVDS backlight off */
3791 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303792 XGI_XG21SetPanelDelay(3, pVBInfo);
3793 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303795 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003796 /* DVO/DVI signal off */
3797 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303798 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003799
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003800 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003801}
3802
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003803static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003804{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003805 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303806 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003807
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003808 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003810}
3811
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003812static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003813{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003814 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003815}
3816
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003817static void XGI_SaveCRT2Info(unsigned short ModeNo,
3818 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003819{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303820 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003821
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003822 /* reserve CR34 for CRT1 Mode No */
3823 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303824 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3825 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003826 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003827}
3828
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003829static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3830 unsigned short ModeIdIndex,
3831 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003832{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303833 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303835 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
3836 if (ModeNo <= 0x13) {
3837 xres = pVBInfo->StResInfo[resindex].HTotal;
3838 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003839 /* si+St_ResInfo */
3840 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 } else {
3842 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3843 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003844 /* si+St_ModeFlag */
3845 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303847 /*
3848 if (pVBInfo->IF_DEF_FSTN) {
3849 xres *= 2;
3850 yres *= 2;
3851 } else {
3852 */
3853 if (modeflag & HalfDCLK)
3854 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303856 if (modeflag & DoubleScanMode)
3857 yres *= 2;
3858 /* } */
3859 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303861 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
3862 if (pVBInfo->IF_DEF_LVDS == 0) {
3863 if (pVBInfo->LCDResInfo == Panel1600x1200) {
3864 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
3865 if (yres == 1024)
3866 yres = 1056;
3867 }
3868 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303870 if (pVBInfo->LCDResInfo == Panel1280x1024) {
3871 if (yres == 400)
3872 yres = 405;
3873 else if (yres == 350)
3874 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303876 if (pVBInfo->LCDInfo & LCDVESATiming) {
3877 if (yres == 360)
3878 yres = 375;
3879 }
3880 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303882 if (pVBInfo->LCDResInfo == Panel1024x768) {
3883 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
3884 if (!(pVBInfo->LCDInfo
3885 & LCDNonExpanding)) {
3886 if (yres == 350)
3887 yres = 357;
3888 else if (yres == 400)
3889 yres = 420;
3890 else if (yres == 480)
3891 yres = 525;
3892 }
3893 }
3894 }
3895 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303897 if (xres == 720)
3898 xres = 640;
3899 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303901 pVBInfo->VGAHDE = xres;
3902 pVBInfo->HDE = xres;
3903 pVBInfo->VGAVDE = yres;
3904 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003905}
3906
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003907static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003908{
3909
Dan Carpentera65fd092011-01-04 09:02:27 +03003910 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
3911 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303912 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303914 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003915}
3916
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003917static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3918 unsigned short ModeIdIndex,
3919 unsigned short RefreshRateTableIndex,
3920 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003921{
3922 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
3923 StandTableIndex, CRT1Index;
3924
3925 pVBInfo->RVBHCMAX = 1;
3926 pVBInfo->RVBHCFACT = 1;
3927
3928 if (ModeNo <= 0x13) {
3929 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3930 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
3931 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
3932 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
3933 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
3934 } else {
3935 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003936 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
3937 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003938 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003939 temp1 = (unsigned short) pVBInfo->
3940 XGINEWUB_CRT1Table[CRT1Index].CR[0];
3941 temp2 = (unsigned short) pVBInfo->
3942 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003943 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003944 tempbx = (unsigned short) pVBInfo->
3945 XGINEWUB_CRT1Table[CRT1Index].CR[8];
3946 tempcx = (unsigned short) pVBInfo->
3947 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003948 tempcx &= 0x0100;
3949 tempcx = tempcx << 2;
3950 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003951 temp1 = (unsigned short) pVBInfo->
3952 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003953 }
3954
3955 if (temp1 & 0x01)
3956 tempbx |= 0x0100;
3957
3958 if (temp1 & 0x20)
3959 tempbx |= 0x0200;
3960 tempax += 5;
3961
3962 if (modeflag & Charx8Dot)
3963 tempax *= 8;
3964 else
3965 tempax *= 9;
3966
3967 pVBInfo->VGAHT = tempax;
3968 pVBInfo->HT = tempax;
3969 tempbx++;
3970 pVBInfo->VGAVT = tempbx;
3971 pVBInfo->VT = tempbx;
3972}
3973
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003974static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303975 unsigned short RefreshRateTableIndex,
3976 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003977{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303978 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003979
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303980 struct XGI_LCDDataStruct *LCDPtr = NULL;
3981 struct XGI_TVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303983 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003984 /* si+St_ResInfo */
3985 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303986 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
3987 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003988 /* si+Ext_ResInfo */
3989 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303990 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3991 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303993 pVBInfo->NewFlickerMode = 0;
3994 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303996 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3997 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3998 pVBInfo);
3999 return;
4000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304002 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4005 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4006 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4007 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4010 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4011 pVBInfo->VGAHT = LCDPtr->VGAHT;
4012 pVBInfo->VGAVT = LCDPtr->VGAVT;
4013 pVBInfo->HT = LCDPtr->LCDHT;
4014 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 if (pVBInfo->LCDResInfo == Panel1024x768) {
4017 tempax = 1024;
4018 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304020 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4021 if (pVBInfo->VGAVDE == 357)
4022 tempbx = 527;
4023 else if (pVBInfo->VGAVDE == 420)
4024 tempbx = 620;
4025 else if (pVBInfo->VGAVDE == 525)
4026 tempbx = 775;
4027 else if (pVBInfo->VGAVDE == 600)
4028 tempbx = 775;
4029 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4030 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4031 else
4032 tempbx = 768;
4033 } else
4034 tempbx = 768;
4035 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4036 tempax = 1024;
4037 tempbx = 768;
4038 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4039 tempax = 1280;
4040 if (pVBInfo->VGAVDE == 360)
4041 tempbx = 768;
4042 else if (pVBInfo->VGAVDE == 375)
4043 tempbx = 800;
4044 else if (pVBInfo->VGAVDE == 405)
4045 tempbx = 864;
4046 else
4047 tempbx = 1024;
4048 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4049 tempax = 1280;
4050 tempbx = 1024;
4051 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4052 tempax = 1280;
4053 if (pVBInfo->VGAVDE == 350)
4054 tempbx = 700;
4055 else if (pVBInfo->VGAVDE == 400)
4056 tempbx = 800;
4057 else if (pVBInfo->VGAVDE == 1024)
4058 tempbx = 960;
4059 else
4060 tempbx = 960;
4061 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4062 tempax = 1400;
4063 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304065 if (pVBInfo->VGAVDE == 1024) {
4066 tempax = 1280;
4067 tempbx = 1024;
4068 }
4069 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4070 tempax = 1600;
4071 tempbx = 1200; /* alan 10/14/2003 */
4072 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4073 if (pVBInfo->VGAVDE == 350)
4074 tempbx = 875;
4075 else if (pVBInfo->VGAVDE == 400)
4076 tempbx = 1000;
4077 }
4078 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304080 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4081 tempax = pVBInfo->VGAHDE;
4082 tempbx = pVBInfo->VGAVDE;
4083 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304085 pVBInfo->HDE = tempax;
4086 pVBInfo->VDE = tempbx;
4087 return;
4088 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004089
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4091 tempbx = 4;
4092 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4093 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4094 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304096 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4097 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4098 pVBInfo->VGAHT = TVPtr->VGAHT;
4099 pVBInfo->VGAVT = TVPtr->VGAVT;
4100 pVBInfo->HDE = TVPtr->TVHDE;
4101 pVBInfo->VDE = TVPtr->TVVDE;
4102 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4103 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304105 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4106 if (resinfo == 0x08)
4107 pVBInfo->NewFlickerMode = 0x40;
4108 else if (resinfo == 0x09)
4109 pVBInfo->NewFlickerMode = 0x40;
4110 else if (resinfo == 0x12)
4111 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004112
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304113 if (pVBInfo->VGAVDE == 350)
4114 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004115
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304116 tempax = ExtHiTVHT;
4117 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304119 if (pVBInfo->VBInfo & SetInSlaveMode) {
4120 if (pVBInfo->TVInfo & TVSimuMode) {
4121 tempax = StHiTVHT;
4122 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004123
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304124 if (!(modeflag & Charx8Dot)) {
4125 tempax = StHiTextTVHT;
4126 tempbx = StHiTextTVVT;
4127 }
4128 }
4129 }
4130 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4131 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4132 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4133 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4134 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304136 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4137 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4138 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4139 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4140 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4141 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4142 if (pVBInfo->TVInfo & NTSC1024x768)
4143 tempax = NTSC1024x768HT;
4144 }
4145 } else {
4146 tempax = PALHT;
4147 tempbx = PALVT;
4148 if (!(pVBInfo->TVInfo & SetPALTV)) {
4149 tempax = NTSCHT;
4150 tempbx = NTSCVT;
4151 if (pVBInfo->TVInfo & NTSC1024x768)
4152 tempax = NTSC1024x768HT;
4153 }
4154 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304156 pVBInfo->HT = tempax;
4157 pVBInfo->VT = tempbx;
4158 return;
4159 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004160}
4161
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004162static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304163 unsigned short RefreshRateTableIndex,
4164 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004165{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004166 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004167
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304168 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4169 pVBInfo);
4170 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4171 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304173 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4174 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004175 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4176 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4177 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304178 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004179 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4180 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004182
Aaro Koskinen8104e322011-03-13 12:26:22 +02004183 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304185 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004186 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304187 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004188 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004189}
4190
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004191static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4192 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004193{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004194 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4195 short index;
4196 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197
4198 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004199 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304200 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004201 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304202
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004203 index = (modeflag & ModeInfoFlag) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304204
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004205 if (index < 0)
4206 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304207
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004208 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304209}
4210
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004211static unsigned short XGI_GetOffset(unsigned short ModeNo,
4212 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304213 unsigned short RefreshRateTableIndex,
4214 struct xgi_hw_device_info *HwDeviceExtension,
4215 struct vb_device_info *pVBInfo)
4216{
4217 unsigned short temp, colordepth, modeinfo, index, infoflag,
4218 ColorDepth[] = { 0x01, 0x02, 0x04 };
4219
4220 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4221 if (ModeNo <= 0x14)
4222 infoflag = 0;
4223 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004224 infoflag = pVBInfo->
4225 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304226
4227 index = (modeinfo >> 8) & 0xFF;
4228
4229 temp = pVBInfo->ScreenOffset[index];
4230
4231 if (infoflag & InterlaceMode)
4232 temp = temp << 1;
4233
4234 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4235
4236 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4237 temp = ModeNo - 0x7C;
4238 colordepth = ColorDepth[temp];
4239 temp = 0x6B;
4240 if (infoflag & InterlaceMode)
4241 temp = temp << 1;
4242 return temp * colordepth;
4243 } else {
4244 return temp * colordepth;
4245 }
4246}
4247
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004248static void XGI_SetCRT2Offset(unsigned short ModeNo,
4249 unsigned short ModeIdIndex,
4250 unsigned short RefreshRateTableIndex,
4251 struct xgi_hw_device_info *HwDeviceExtension,
4252 struct vb_device_info *pVBInfo)
4253{
4254 unsigned short offset;
4255 unsigned char temp;
4256
4257 if (pVBInfo->VBInfo & SetInSlaveMode)
4258 return;
4259
4260 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4261 HwDeviceExtension, pVBInfo);
4262 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004263 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004264 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004265 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004266 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004267 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004268}
4269
Randy Dunlap89229672010-08-10 08:46:44 -07004270static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004271{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004272 /* threshold high ,disable auto threshold */
4273 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4274 /* threshold low default 04h */
4275 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004276}
4277
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004278static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304279 struct xgi_hw_device_info *HwDeviceExtension,
4280 unsigned short RefreshRateTableIndex,
4281 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004282{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304283 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304285 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004286 CRT1Index = pVBInfo->
4287 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304288 CRT1Index &= IndexMask;
4289 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4290 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004291
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4293 HwDeviceExtension, pVBInfo);
4294 XGI_SetCRT2FIFO(pVBInfo);
4295 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304297 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004298 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004299
Aaro Koskinen8104e322011-03-13 12:26:22 +02004300 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4301 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004302}
4303
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004304static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304305 struct xgi_hw_device_info *HwDeviceExtension,
4306 unsigned short RefreshRateTableIndex,
4307 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004308{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304309 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4310 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304312 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004313 CRT1Index = pVBInfo->
4314 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304315 CRT1Index &= IndexMask;
4316 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004317 }
4318
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304319 if (ModeNo <= 0x13)
4320 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4321 else
4322 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304324 /* bainy change table name */
4325 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004326 /* BTVGA2HT 0x08,0x09 */
4327 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004328 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004330 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004331 /* BTVGA2HDEE 0x0A,0x0C */
4332 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004333 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4335 pushbx = pVBInfo->VGAHDE / 2 + 16;
4336 tempcx = tempcx >> 1;
4337 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4338 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304340 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4341 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004342 tempbx |= ((pVBInfo->
4343 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4344 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304345 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4346 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4347 tempcx &= 0x1F;
4348 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4349 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4350 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4351 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304353 tempbx += 4;
4354 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304356 if (tempcx > (pVBInfo->VGAHT / 2))
4357 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004358
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304359 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004360
Aaro Koskinen8104e322011-03-13 12:26:22 +02004361 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304362 } else {
4363 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004364 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304365 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004366 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004367 /* BTVGA2HDEE 0x0A,0x0C */
4368 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004369 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4371 pushbx = pVBInfo->VGAHDE + 16;
4372 tempcx = tempcx >> 1;
4373 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4374 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304376 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4377 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004378 tempbx |= ((pVBInfo->
4379 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4380 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304381 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4382 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4383 tempcx &= 0x1F;
4384 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4385 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4386 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4387 tempbx += 16;
4388 tempcx += 16;
4389 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304391 if (tempcx > pVBInfo->VGAHT)
4392 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004395 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304396 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304398 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4399 tempbx = pushbx;
4400 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4401 tempax |= (tempbx & 0xFF00);
4402 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004403 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304404 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004405 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304406 tempcx = (pVBInfo->VGAVT - 1);
4407 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004408
Aaro Koskinen8104e322011-03-13 12:26:22 +02004409 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304410 tempbx = pVBInfo->VGAVDE - 1;
4411 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004412 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304413 temp = ((tempbx & 0xFF00) << 3) >> 8;
4414 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004415 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304417 tempax = pVBInfo->VGAVDE;
4418 tempbx = pVBInfo->VGAVDE;
4419 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004420 /* BTVGA2VRS 0x10,0x11 */
4421 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4422 /* BTVGA2VRE 0x11 */
4423 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304425 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4426 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4427 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004428
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304429 if (temp & 0x04)
4430 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304432 if (temp & 0x080)
4433 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304435 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004436
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304437 if (temp & 0x08)
4438 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304440 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4441 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4442 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304444 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004445 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304446 temp = ((tempbx & 0xFF00) >> 8) << 4;
4447 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004448 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304449 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304451 if (modeflag & DoubleScanMode)
4452 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004453
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304454 if (modeflag & HalfDCLK)
4455 tempax |= 0x40;
4456
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004457 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004458}
4459
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004460static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4461{
4462 unsigned long tempax, tempbx;
4463
4464 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4465 & 0xFFFF;
4466 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4467 tempax = (tempax * pVBInfo->HT) / tempbx;
4468
4469 return (unsigned short) tempax;
4470}
4471
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004472static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304473 struct xgi_hw_device_info *HwDeviceExtension,
4474 unsigned short RefreshRateTableIndex,
4475 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004476{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304477 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4478 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304480 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004481 /* si+St_ResInfo */
4482 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304483 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4484 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004485 /* si+Ext_ResInfo */
4486 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304487 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004488 CRT1Index = pVBInfo->
4489 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304490 CRT1Index &= IndexMask;
4491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304493 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4494 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304496 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004497 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304498 /* if (modeflag & Charx8Dot) */
4499 /* tempcx = 0x08; */
4500 /* else */
4501 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304503 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4504 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304506 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 if (modeflag & HalfDCLK)
4509 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004510
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304511 tempax = (tempax / tempcx) - 1;
4512 tempbx |= ((tempax & 0x00FF) << 8);
4513 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004514 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004515
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304516 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004517
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304518 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4519 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4520 | VB_XGI302LV | VB_XGI301C)))
4521 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004522
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304523 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4524 if (pVBInfo->VBType & VB_XGI301LV) {
4525 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4526 if (resinfo == 7)
4527 temp -= 2;
4528 }
4529 } else if (resinfo == 7) {
4530 temp -= 2;
4531 }
4532 }
4533 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004534
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004535 /* 0x05 Horizontal Display Start */
4536 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
4537 /* 0x06 Horizontal Blank end */
4538 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304540 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4541 if (pVBInfo->VBInfo & SetCRT2ToTV)
4542 tempax = pVBInfo->VGAHT;
4543 else
4544 tempax = XGI_GetVGAHT2(pVBInfo);
4545 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004546
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304547 if (tempax >= pVBInfo->VGAHT)
4548 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004549
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304550 if (modeflag & HalfDCLK)
4551 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 tempax = (tempax / tempcx) - 5;
4554 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
4555 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4556 temp = (tempbx & 0x00FF) - 1;
4557 if (!(modeflag & HalfDCLK)) {
4558 temp -= 6;
4559 if (pVBInfo->TVInfo & TVSimuMode) {
4560 temp -= 4;
4561 if (ModeNo > 0x13)
4562 temp -= 10;
4563 }
4564 }
4565 } else {
4566 /* tempcx = tempbx & 0x00FF ; */
4567 tempbx = (tempbx & 0xFF00) >> 8;
4568 tempcx = (tempcx + tempbx) >> 1;
4569 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304571 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4572 temp -= 1;
4573 if (!(modeflag & HalfDCLK)) {
4574 if ((modeflag & Charx8Dot)) {
4575 temp += 4;
4576 if (pVBInfo->VGAHDE >= 800)
4577 temp -= 6;
4578 }
4579 }
4580 } else {
4581 if (!(modeflag & HalfDCLK)) {
4582 temp -= 4;
4583 if (pVBInfo->LCDResInfo != Panel1280x960) {
4584 if (pVBInfo->VGAHDE >= 800) {
4585 temp -= 7;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004586 if (pVBInfo->ModeType ==
4587 ModeEGA) {
4588 if (pVBInfo->VGAVDE ==
4589 1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304590 temp += 15;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004591 if (pVBInfo->LCDResInfo != Panel1280x1024) {
4592 temp +=
4593 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304594 }
4595 }
4596 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304598 if (pVBInfo->VGAHDE >= 1280) {
4599 if (pVBInfo->LCDResInfo
4600 != Panel1280x960) {
4601 if (pVBInfo->LCDInfo
4602 & LCDNonExpanding) {
4603 temp
4604 += 28;
4605 }
4606 }
4607 }
4608 }
4609 }
4610 }
4611 }
4612 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004613
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004614 /* 0x07 Horizontal Retrace Start */
4615 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4616 /* 0x08 Horizontal Retrace End */
4617 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004618
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304619 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4620 if (pVBInfo->TVInfo & TVSimuMode) {
4621 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4622 == 0x11) || (ModeNo == 0x13) || (ModeNo
4623 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004624 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
4625 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304628 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
4629 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004630 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304631 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004632 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304633 0x08, 0x61);
4634 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004635 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304636 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004637 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304638 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004639 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 0x0C, 0xF0);
4641 }
4642 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304644 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
4645 == 0x07)) {
4646 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004647 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304648 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004649 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304650 0x08, 0x00);
4651 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004652 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304653 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004654 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304655 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004656 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304657 0x0C, 0xF0);
4658 }
4659 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004660
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
4662 == 0x0D) || (ModeNo == 0x50)) {
4663 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004664 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304665 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004666 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304667 0x08, 0x03);
4668 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004669 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304670 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004671 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304672 0x08, 0x02);
4673 }
4674 }
4675 }
4676 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004677
Aaro Koskinen8104e322011-03-13 12:26:22 +02004678 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004679 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004680 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304682 tempbx = pVBInfo->VGAVT;
4683 push1 = tempbx;
4684 tempcx = 0x121;
4685 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304687 if (tempbx == 357)
4688 tempbx = 350;
4689 if (tempbx == 360)
4690 tempbx = 350;
4691 if (tempbx == 375)
4692 tempbx = 350;
4693 if (tempbx == 405)
4694 tempbx = 400;
4695 if (tempbx == 525)
4696 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004697
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304698 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304700 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4701 if (pVBInfo->LCDResInfo == Panel1024x768) {
4702 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4703 if (tempbx == 350)
4704 tempbx += 5;
4705 if (tempbx == 480)
4706 tempbx += 5;
4707 }
4708 }
4709 }
4710 tempbx--;
4711 temp = tempbx & 0x00FF;
4712 tempbx--;
4713 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004714 /* 0x10 vertical Blank Start */
4715 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 tempbx = push2;
4717 tempbx--;
4718 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004719 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304721 if (tempbx & 0x0100)
4722 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004723
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304724 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304726 if (modeflag & DoubleScanMode)
4727 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004728
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304729 if (tempbx & 0x0200)
4730 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304732 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004733 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304735 if (tempbx & 0x0400)
4736 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004737
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004738 /* 0x11 Vertival Blank End */
4739 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304740
4741 tempax = push1;
4742 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4743 tempax = tempax >> 2;
4744 push1 = tempax; /* push ax */
4745
4746 if (resinfo != 0x09) {
4747 tempax = tempax << 1;
4748 tempbx += tempax;
4749 }
4750
4751 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4752 if (pVBInfo->VBType & VB_XGI301LV) {
4753 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
4754 tempbx -= 10;
4755 } else {
4756 if (pVBInfo->TVInfo & TVSimuMode) {
4757 if (pVBInfo->TVInfo & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004758 if (pVBInfo->VBType &
4759 VB_XGI301LV) {
4760 if (!(pVBInfo->TVInfo &
4761 (SetYPbPrMode525p |
4762 SetYPbPrMode750p |
4763 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304764 tempbx += 40;
4765 } else {
4766 tempbx += 40;
4767 }
4768 }
4769 }
4770 }
4771 } else {
4772 tempbx -= 10;
4773 }
4774 } else {
4775 if (pVBInfo->TVInfo & TVSimuMode) {
4776 if (pVBInfo->TVInfo & SetPALTV) {
4777 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004778 if (!(pVBInfo->TVInfo &
4779 (SetYPbPrMode525p |
4780 SetYPbPrMode750p |
4781 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 tempbx += 40;
4783 } else {
4784 tempbx += 40;
4785 }
4786 }
4787 }
4788 }
4789 tempax = push1;
4790 tempax = tempax >> 2;
4791 tempax++;
4792 tempax += tempbx;
4793 push1 = tempax; /* push ax */
4794
4795 if ((pVBInfo->TVInfo & SetPALTV)) {
4796 if (tempbx <= 513) {
4797 if (tempax >= 513)
4798 tempbx = 513;
4799 }
4800 }
4801
4802 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004803 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304804 tempbx--;
4805 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004806 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807
4808 if (tempbx & 0x0100)
4809 tempcx |= 0x0008;
4810
4811 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004812 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304813
4814 tempbx++;
4815
4816 if (tempbx & 0x0100)
4817 tempcx |= 0x0004;
4818
4819 if (tempbx & 0x0200)
4820 tempcx |= 0x0080;
4821
4822 if (tempbx & 0x0400)
4823 tempcx |= 0x0C00;
4824
4825 tempbx = push1; /* pop ax */
4826 temp = tempbx & 0x00FF;
4827 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004828 /* 0x0D vertical Retrace End */
4829 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304830
4831 if (tempbx & 0x0010)
4832 tempcx |= 0x2000;
4833
4834 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004835 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304836 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004837 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304838 tempax = modeflag;
4839 temp = (tempax & 0xFF00) >> 8;
4840
4841 temp = (temp >> 1) & 0x09;
4842
4843 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4844 temp |= 0x01;
4845
Aaro Koskinen8104e322011-03-13 12:26:22 +02004846 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4847 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4848 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304849
4850 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4851 temp = 0x80;
4852 else
4853 temp = 0x00;
4854
Aaro Koskinen8104e322011-03-13 12:26:22 +02004855 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304856
4857 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004858}
4859
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004860static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304861 unsigned short RefreshRateTableIndex,
4862 struct xgi_hw_device_info *HwDeviceExtension,
4863 struct vb_device_info *pVBInfo)
4864{
4865 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4866 modeflag, resinfo, crt2crtc;
4867 unsigned char *TimingPoint;
4868
4869 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4870
4871 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004872 /* si+St_ResInfo */
4873 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304874 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4875 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
4876 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004877 /* si+Ext_ResInfo */
4878 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304879 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004880 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
4881 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304882 }
4883
4884 tempax = 0;
4885
4886 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4887 tempax |= 0x0800;
4888
4889 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4890 tempax |= 0x0400;
4891
4892 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4893 tempax |= 0x0200;
4894
4895 if (!(pVBInfo->TVInfo & SetPALTV))
4896 tempax |= 0x1000;
4897
4898 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
4899 tempax |= 0x0100;
4900
4901 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
4902 tempax &= 0xfe00;
4903
4904 tempax = (tempax & 0xff00) >> 8;
4905
Aaro Koskinen8104e322011-03-13 12:26:22 +02004906 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304907 TimingPoint = pVBInfo->NTSCTiming;
4908
4909 if (pVBInfo->TVInfo & SetPALTV)
4910 TimingPoint = pVBInfo->PALTiming;
4911
4912 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4913 TimingPoint = pVBInfo->HiTVExtTiming;
4914
4915 if (pVBInfo->VBInfo & SetInSlaveMode)
4916 TimingPoint = pVBInfo->HiTVSt2Timing;
4917
4918 if (pVBInfo->SetFlag & TVSimuMode)
4919 TimingPoint = pVBInfo->HiTVSt1Timing;
4920
4921 if (!(modeflag & Charx8Dot))
4922 TimingPoint = pVBInfo->HiTVTextTiming;
4923 }
4924
4925 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4926 if (pVBInfo->TVInfo & SetYPbPrMode525i)
4927 TimingPoint = pVBInfo->YPbPr525iTiming;
4928
4929 if (pVBInfo->TVInfo & SetYPbPrMode525p)
4930 TimingPoint = pVBInfo->YPbPr525pTiming;
4931
4932 if (pVBInfo->TVInfo & SetYPbPrMode750p)
4933 TimingPoint = pVBInfo->YPbPr750pTiming;
4934 }
4935
4936 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004937 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304938
4939 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004940 /* di->temp2[j] */
4941 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304942
4943 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004944 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304945
4946 temp = pVBInfo->NewFlickerMode;
4947 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004948 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304949
4950 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
4951 tempax = 950;
4952
4953 if (pVBInfo->TVInfo & SetPALTV)
4954 tempax = 520;
4955 else
4956 tempax = 440;
4957
4958 if (pVBInfo->VDE <= tempax) {
4959 tempax -= pVBInfo->VDE;
4960 tempax = tempax >> 2;
4961 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4962 push1 = tempax;
4963 temp = (tempax & 0xFF00) >> 8;
4964 temp += (unsigned short) TimingPoint[0];
4965
4966 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4967 | VB_XGI302LV | VB_XGI301C)) {
4968 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4969 | SetCRT2ToSVIDEO | SetCRT2ToSCART
4970 | SetCRT2ToYPbPr)) {
4971 tempcx = pVBInfo->VGAHDE;
4972 if (tempcx >= 1024) {
4973 temp = 0x17; /* NTSC */
4974 if (pVBInfo->TVInfo & SetPALTV)
4975 temp = 0x19; /* PAL */
4976 }
4977 }
4978 }
4979
Aaro Koskinen8104e322011-03-13 12:26:22 +02004980 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304981 tempax = push1;
4982 temp = (tempax & 0xFF00) >> 8;
4983 temp += TimingPoint[1];
4984
4985 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4986 | VB_XGI302LV | VB_XGI301C)) {
4987 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4988 | SetCRT2ToSVIDEO | SetCRT2ToSCART
4989 | SetCRT2ToYPbPr))) {
4990 tempcx = pVBInfo->VGAHDE;
4991 if (tempcx >= 1024) {
4992 temp = 0x1D; /* NTSC */
4993 if (pVBInfo->TVInfo & SetPALTV)
4994 temp = 0x52; /* PAL */
4995 }
4996 }
4997 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004998 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304999 }
5000
5001 /* 301b */
5002 tempcx = pVBInfo->HT;
5003
5004 if (XGI_IsLCDDualLink(pVBInfo))
5005 tempcx = tempcx >> 1;
5006
5007 tempcx -= 2;
5008 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005009 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305010
5011 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005012 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305013
5014 tempcx = pVBInfo->HT >> 1;
5015 push1 = tempcx; /* push cx */
5016 tempcx += 7;
5017
5018 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5019 tempcx -= 4;
5020
5021 temp = tempcx & 0x00FF;
5022 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005023 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305024
5025 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5026 tempbx += tempcx;
5027 push2 = tempbx;
5028 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005029 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305030 temp = (tempbx & 0xFF00) >> 8;
5031 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005032 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305033
5034 tempbx = push2;
5035 tempbx = tempbx + 8;
5036 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5037 tempbx = tempbx - 4;
5038 tempcx = tempbx;
5039 }
5040
5041 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005042 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043
5044 j += 2;
5045 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5046 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005047 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305048 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005049 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305050
5051 tempcx += 8;
5052 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5053 tempcx -= 4;
5054
5055 temp = tempcx & 0xFF;
5056 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005057 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305058
5059 tempcx = push1; /* pop cx */
5060 j += 2;
5061 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5062 tempcx -= temp;
5063 temp = tempcx & 0x00FF;
5064 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005065 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305066
5067 tempcx -= 11;
5068
5069 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5070 tempax = XGI_GetVGAHT2(pVBInfo);
5071 tempcx = tempax - 1;
5072 }
5073 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005074 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305075
5076 tempbx = pVBInfo->VDE;
5077
5078 if (pVBInfo->VGAVDE == 360)
5079 tempbx = 746;
5080 if (pVBInfo->VGAVDE == 375)
5081 tempbx = 746;
5082 if (pVBInfo->VGAVDE == 405)
5083 tempbx = 853;
5084
5085 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005086 if (pVBInfo->VBType &
5087 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5088 if (!(pVBInfo->TVInfo &
5089 (SetYPbPrMode525p | SetYPbPrMode750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305090 tempbx = tempbx >> 1;
5091 } else
5092 tempbx = tempbx >> 1;
5093 }
5094
5095 tempbx -= 2;
5096 temp = tempbx & 0x00FF;
5097
5098 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5099 if (pVBInfo->VBType & VB_XGI301LV) {
5100 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5101 if (pVBInfo->VBInfo & SetInSlaveMode) {
5102 if (ModeNo == 0x2f)
5103 temp += 1;
5104 }
5105 }
5106 } else {
5107 if (pVBInfo->VBInfo & SetInSlaveMode) {
5108 if (ModeNo == 0x2f)
5109 temp += 1;
5110 }
5111 }
5112 }
5113
Aaro Koskinen8104e322011-03-13 12:26:22 +02005114 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305115
5116 temp = (tempcx & 0xFF00) >> 8;
5117 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5118
5119 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5120 if (pVBInfo->VBType & VB_XGI301LV) {
5121 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5122 temp |= 0x10;
5123
5124 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5125 temp |= 0x20;
5126 }
5127 } else {
5128 temp |= 0x10;
5129 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5130 temp |= 0x20;
5131 }
5132 }
5133
Aaro Koskinen8104e322011-03-13 12:26:22 +02005134 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305135
5136 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5137 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5138 tempbx = pVBInfo->VDE;
5139 tempcx = tempbx - 2;
5140
5141 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5142 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5143 | SetYPbPrMode750p)))
5144 tempbx = tempbx >> 1;
5145 }
5146
5147 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5148 temp = 0;
5149 if (tempcx & 0x0400)
5150 temp |= 0x20;
5151
5152 if (tempbx & 0x0400)
5153 temp |= 0x40;
5154
Aaro Koskinen8104e322011-03-13 12:26:22 +02005155 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305156 }
5157
5158 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005159 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305160 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005161 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 }
5163
5164 tempbx = tempbx & 0x00FF;
5165
5166 if (!(modeflag & HalfDCLK)) {
5167 tempcx = pVBInfo->VGAHDE;
5168 if (tempcx >= pVBInfo->HDE) {
5169 tempbx |= 0x2000;
5170 tempax &= 0x00FF;
5171 }
5172 }
5173
5174 tempcx = 0x0101;
5175
5176 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5177 if (pVBInfo->VGAHDE >= 1024) {
5178 tempcx = 0x1920;
5179 if (pVBInfo->VGAHDE >= 1280) {
5180 tempcx = 0x1420;
5181 tempbx = tempbx & 0xDFFF;
5182 }
5183 }
5184 }
5185
5186 if (!(tempbx & 0x2000)) {
5187 if (modeflag & HalfDCLK)
5188 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5189
5190 push1 = tempbx;
5191 tempeax = pVBInfo->VGAHDE;
5192 tempebx = (tempcx & 0xFF00) >> 8;
5193 longtemp = tempeax * tempebx;
5194 tempecx = tempcx & 0x00FF;
5195 longtemp = longtemp / tempecx;
5196
5197 /* 301b */
5198 tempecx = 8 * 1024;
5199
5200 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5201 | VB_XGI302LV | VB_XGI301C)) {
5202 tempecx = tempecx * 8;
5203 }
5204
5205 longtemp = longtemp * tempecx;
5206 tempecx = pVBInfo->HDE;
5207 temp2 = longtemp % tempecx;
5208 tempeax = longtemp / tempecx;
5209 if (temp2 != 0)
5210 tempeax += 1;
5211
5212 tempax = (unsigned short) tempeax;
5213
5214 /* 301b */
5215 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5216 | VB_XGI302LV | VB_XGI301C)) {
5217 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5218 }
5219 /* end 301b */
5220
5221 tempbx = push1;
5222 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5223 | (tempbx & 0x00FF));
5224 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5225 | (tempax & 0x00FF));
5226 temp = (tempax & 0xFF00) >> 8;
5227 } else {
5228 temp = (tempax & 0x00FF) >> 8;
5229 }
5230
Aaro Koskinen8104e322011-03-13 12:26:22 +02005231 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305232 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005233 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305234 temp = tempcx & 0x00FF;
5235
5236 if (tempbx & 0x2000)
5237 temp = 0;
5238
5239 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5240 temp |= 0x18;
5241
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005242 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305243 if (pVBInfo->TVInfo & SetPALTV) {
5244 tempbx = 0x0382;
5245 tempcx = 0x007e;
5246 } else {
5247 tempbx = 0x0369;
5248 tempcx = 0x0061;
5249 }
5250
5251 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005252 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305253 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005254 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305255
5256 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5257 temp = temp << 2;
5258 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5259
5260 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5261 temp |= 0x10;
5262
5263 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5264 temp |= 0x20;
5265
5266 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5267 temp |= 0x60;
5268 }
5269
Aaro Koskinen8104e322011-03-13 12:26:22 +02005270 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005271 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005272 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305273
5274 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5275 if (pVBInfo->TVInfo & NTSC1024x768) {
5276 TimingPoint = XGI_NTSC1024AdjTime;
5277 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005278 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305279 TimingPoint[j]);
5280 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005281 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305282 }
5283 }
5284
5285 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5286 if (pVBInfo->VBType & VB_XGI301C) {
5287 if (pVBInfo->TVInfo & SetPALMTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005288 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305289 0x08); /* PALM Mode */
5290 }
5291
5292 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005293 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305294 0x01);
5295 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005296 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305297
5298 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
Aaro Koskinendc505562011-03-13 12:26:26 +02005299 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305300 }
5301
5302 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5303 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005304 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305305 }
5306
5307 if (pVBInfo->VBInfo & SetCRT2ToTV)
5308 return;
5309}
5310
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005311static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312 struct xgi_hw_device_info *HwDeviceExtension,
5313 unsigned short RefreshRateTableIndex,
5314 struct vb_device_info *pVBInfo)
5315{
5316 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5317 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5318
5319 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5320
5321 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005322 /* si+St_ResInfo */
5323 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305324 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5325 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005326 /* si+Ext_ResInfo */
5327 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305328 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005329 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5330 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305331 CRT1Index &= IndexMask;
5332 }
5333
5334 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5335 return;
5336
5337 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5338
5339 if (XGI_IsLCDDualLink(pVBInfo))
5340 tempbx = tempbx >> 1;
5341
5342 tempbx -= 1;
5343 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005344 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305345 temp = (tempbx & 0xFF00) >> 8;
5346 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005347 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305348 temp = 0x01;
5349
5350 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5351 if (pVBInfo->ModeType == ModeEGA) {
5352 if (pVBInfo->VGAHDE >= 1024) {
5353 temp = 0x02;
5354 if (pVBInfo->LCDInfo & LCDVESATiming)
5355 temp = 0x01;
5356 }
5357 }
5358 }
5359
Aaro Koskinen8104e322011-03-13 12:26:22 +02005360 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305361 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5362 push1 = tempbx;
5363 tempbx--;
5364 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005365 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305366 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005367 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305368
5369 tempcx = pVBInfo->VT - 1;
5370 push2 = tempcx + 1;
5371 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005372 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305373 temp = (tempcx & 0xFF00) >> 8;
5374 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005375 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005376 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5377 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5378 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5379 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305380
5381 /* Customized LCDB Des no add */
5382 tempbx = 5;
5383 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5384 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5385 tempah = pVBInfo->LCDResInfo;
5386 tempah &= PanelResInfo;
5387
5388 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
5389 tempbx = 1024;
5390 tempcx = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005391 } else if ((tempah == Panel1280x1024) ||
5392 (tempah == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305393 tempbx = 1280;
5394 tempcx = 1024;
5395 } else if (tempah == Panel1400x1050) {
5396 tempbx = 1400;
5397 tempcx = 1050;
5398 } else {
5399 tempbx = 1600;
5400 tempcx = 1200;
5401 }
5402
5403 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5404 tempbx = pVBInfo->HDE;
5405 tempcx = pVBInfo->VDE;
5406 }
5407
5408 pushbx = tempbx;
5409 tempax = pVBInfo->VT;
5410 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5411 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5412 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5413 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5414 tempbx = pVBInfo->LCDVDES;
5415 tempcx += tempbx;
5416
5417 if (tempcx >= tempax)
5418 tempcx -= tempax; /* lcdvdes */
5419
5420 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005421 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305422 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005423 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305424 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5425 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5426 tempah = tempch;
5427 tempah = tempah << 3;
5428 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005429 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305430
5431 /* getlcdsync() */
5432 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5433 tempcx = tempbx;
5434 tempax = pVBInfo->VT;
5435 tempbx = pVBInfo->LCDVRS;
5436
5437 /* if (SetLCD_Info & EnableScalingLCD) */
5438 tempcx += tempbx;
5439 if (tempcx >= tempax)
5440 tempcx -= tempax;
5441
5442 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005443 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305444 temp = (tempbx & 0xFF00) >> 8;
5445 temp = temp << 4;
5446 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005447 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305448 tempcx = pushbx;
5449 tempax = pVBInfo->HT;
5450 tempbx = pVBInfo->LCDHDES;
5451 tempbx &= 0x0FFF;
5452
5453 if (XGI_IsLCDDualLink(pVBInfo)) {
5454 tempax = tempax >> 1;
5455 tempbx = tempbx >> 1;
5456 tempcx = tempcx >> 1;
5457 }
5458
5459 if (pVBInfo->VBType & VB_XGI302LV)
5460 tempbx += 1;
5461
5462 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5463 tempbx += 1;
5464
5465 tempcx += tempbx;
5466
5467 if (tempcx >= tempax)
5468 tempcx -= tempax;
5469
5470 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005471 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305472 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005473 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305474 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005475 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305476 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005477 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305478
5479 /* getlcdsync() */
5480 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5481 tempcx = tempax;
5482 tempax = pVBInfo->HT;
5483 tempbx = pVBInfo->LCDHRS;
5484 /* if ( SetLCD_Info & EnableScalingLCD) */
5485 if (XGI_IsLCDDualLink(pVBInfo)) {
5486 tempax = tempax >> 1;
5487 tempbx = tempbx >> 1;
5488 tempcx = tempcx >> 1;
5489 }
5490
5491 if (pVBInfo->VBType & VB_XGI302LV)
5492 tempbx += 1;
5493
5494 tempcx += tempbx;
5495
5496 if (tempcx >= tempax)
5497 tempcx -= tempax;
5498
5499 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005500 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305501
5502 temp = (tempbx & 0xFF00) >> 8;
5503 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005504 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305505 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005506 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305507
5508 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5509 if (pVBInfo->VGAVDE == 525) {
5510 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5511 | VB_XGI301LV | VB_XGI302LV
5512 | VB_XGI301C)) {
5513 temp = 0xC6;
5514 } else
5515 temp = 0xC4;
5516
Aaro Koskinen8104e322011-03-13 12:26:22 +02005517 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5518 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305519 }
5520
5521 if (pVBInfo->VGAVDE == 420) {
5522 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5523 | VB_XGI301LV | VB_XGI302LV
5524 | VB_XGI301C)) {
5525 temp = 0x4F;
5526 } else
5527 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005528 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305529 }
5530 }
5531}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005532
5533/* --------------------------------------------------------------------- */
5534/* Function : XGI_GetTap4Ptr */
5535/* Input : */
5536/* Output : di -> Tap4 Reg. Setting Pointer */
5537/* Description : */
5538/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005539static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305540 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005541{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305542 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005543
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305544 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005545
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305546 if (tempcx == 0) {
5547 tempax = pVBInfo->VGAHDE;
5548 tempbx = pVBInfo->HDE;
5549 } else {
5550 tempax = pVBInfo->VGAVDE;
5551 tempbx = pVBInfo->VDE;
5552 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005553
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005554 if (tempax <= tempbx)
5555 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305556 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005557 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005558
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305559 if (pVBInfo->TVInfo & SetPALTV)
5560 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305562 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005563 if ((pVBInfo->TVInfo & SetYPbPrMode525i) ||
5564 (pVBInfo->TVInfo & SetYPbPrMode525p))
5565 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305566 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5567 Tap4TimingPtr = YPbPr750pTap4Timing;
5568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305570 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005571 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005572
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305573 i = 0;
5574 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5575 if (Tap4TimingPtr[i].DE == tempax)
5576 break;
5577 i++;
5578 }
5579 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005580}
5581
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005582static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005583{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305584 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005585
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305586 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305588 if (!(pVBInfo->VBType & VB_XGI301C))
5589 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305591 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5592 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005593 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005594
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005595 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5596 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
5597 /* Set Vertical Scaling */
5598 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305599 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005600 xgifb_reg_set(pVBInfo->Part2Port,
5601 i,
5602 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305603 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005604
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005605 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5606 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
5607 /* Enable V.Scaling */
5608 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305609 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005610 /* Enable H.Scaling */
5611 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005612}
5613
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005614static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305615 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005616{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305617 unsigned short i;
5618 unsigned char *tempdi;
5619 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005620
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305621 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005622 /* si+St_ResInfo */
5623 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305624 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005625 /* si+Ext_ResInfo */
5626 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005627
Aaro Koskinen8104e322011-03-13 12:26:22 +02005628 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305629 if (pVBInfo->TVInfo & SetPALTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005630 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5631 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305632 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005633 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5634 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305637 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5638 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005639
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305640 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005641 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5642 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
5643 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305644 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305646 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
5647 & SetCRT2ToYPbPr)) {
5648 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5649 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305651 tempdi = pVBInfo->HiTVGroup3Data;
5652 if (pVBInfo->SetFlag & TVSimuMode) {
5653 tempdi = pVBInfo->HiTVGroup3Simu;
5654 if (!(modeflag & Charx8Dot))
5655 tempdi = pVBInfo->HiTVGroup3Text;
5656 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305658 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5659 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005660
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305661 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5662 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305664 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005665 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305667 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
5668 if (pVBInfo->TVInfo & SetYPbPrMode525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005669 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305670 }
5671 }
5672 return;
5673} /* {end of XGI_SetGroup3} */
5674
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005675static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305676 unsigned short RefreshRateTableIndex,
5677 struct xgi_hw_device_info *HwDeviceExtension,
5678 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005679{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305680 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305682 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305684 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005685 /* si+St_ResInfo */
5686 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305687 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005688 /* si+Ext_ResInfo */
5689 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005690
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305691 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005692 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305694 tempbx = pVBInfo->RVBHCMAX;
5695 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005696 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305697 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
5698 tempcx = pVBInfo->VGAHT - 1;
5699 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005700 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305702 temp = ((tempcx & 0xFF00) >> 8) << 3;
5703 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305705 tempcx = pVBInfo->VGAVT - 1;
5706 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5707 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005708
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305709 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005710 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305711 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005712 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005713 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305714 tempcx = pVBInfo->VBInfo;
5715 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005716
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305717 if (modeflag & HalfDCLK)
5718 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305720 if (XGI_IsLCDDualLink(pVBInfo))
5721 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305723 if (tempcx & SetCRT2ToHiVisionTV) {
5724 temp = 0;
5725 if (tempbx <= 1024)
5726 temp = 0xA0;
5727 if (tempbx == 1280)
5728 temp = 0xC0;
5729 } else if (tempcx & SetCRT2ToTV) {
5730 temp = 0xA0;
5731 if (tempbx <= 800)
5732 temp = 0x80;
5733 } else {
5734 temp = 0x80;
5735 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5736 temp = 0;
5737 if (tempbx > 800)
5738 temp = 0x60;
5739 }
5740 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
5743 temp = 0x00;
5744 if (pVBInfo->VGAHDE == 1280)
5745 temp = 0x40;
5746 if (pVBInfo->VGAHDE == 1024)
5747 temp = 0x20;
5748 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005749 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005750
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305751 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305753 if (tempcx & SetCRT2ToHiVisionTV) {
5754 if (!(temp & 0xE000))
5755 tempbx = tempbx >> 1;
5756 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005757
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305758 tempcx = pVBInfo->RVBHRS;
5759 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005760 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305762 tempeax = pVBInfo->VGAVDE;
5763 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305765 if (tempeax <= tempebx) {
5766 tempcx = (tempcx & (~0x4000));
5767 tempeax = pVBInfo->VGAVDE;
5768 } else {
5769 tempeax -= tempebx;
5770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305772 templong = (tempeax * 256 * 1024) % tempebx;
5773 tempeax = (tempeax * 256 * 1024) / tempebx;
5774 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305776 if (templong != 0)
5777 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305779 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005780 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305782 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005783 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305784 tempbx = (unsigned short) (tempebx >> 16);
5785 temp = tempbx & 0x00FF;
5786 temp = temp << 4;
5787 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005788 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305790 /* 301b */
5791 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5792 | VB_XGI302LV | VB_XGI301C)) {
5793 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005794 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305795 tempax = pVBInfo->VGAHDE;
5796 if (modeflag & HalfDCLK)
5797 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305799 if (XGI_IsLCDDualLink(pVBInfo))
5800 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005801
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005802 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD)) ||
5803 ((pVBInfo->TVInfo&SetYPbPrMode525p) ||
5804 (pVBInfo->TVInfo&SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305805 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5806 if (tempax > 800)
5807 tempax -= 800;
5808 } else {
5809 if (pVBInfo->VGAHDE > 800) {
5810 if (pVBInfo->VGAHDE == 1024)
5811 tempax = (tempax * 25 / 32) - 1;
5812 else
5813 tempax = (tempax * 20 / 32) - 1;
5814 }
5815 }
5816 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305818 /*
5819 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
5820 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005821 if (!(pVBInfo->TVInfo &
5822 (SetYPbPrMode525p |
5823 SetYPbPrMode750p |
5824 SetYPbPrMode1080i))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305825 if (pVBInfo->VGAHDE > 800) {
5826 if (pVBInfo->VGAHDE == 1024)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005827 tempax =(tempax * 25 /
5828 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305829 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005830 tempax = (tempax * 20 /
5831 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305832 }
5833 }
5834 } else {
5835 if (pVBInfo->VGAHDE > 800) {
5836 if (pVBInfo->VGAHDE == 1024)
5837 tempax = (tempax * 25 / 32) - 1;
5838 else
5839 tempax = (tempax * 20 / 32) - 1;
5840 }
5841 }
5842 }
5843 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305845 temp = (tempax & 0xFF00) >> 8;
5846 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005847 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005849 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305851 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
5852 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005853 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305855 }
5856 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305858 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5859 if (!(pVBInfo->TVInfo & (NTSC1024x768
5860 | SetYPbPrMode525p | SetYPbPrMode750p
5861 | SetYPbPrMode1080i))) {
5862 temp |= 0x0001;
5863 if ((pVBInfo->VBInfo & SetInSlaveMode)
5864 && (!(pVBInfo->TVInfo
5865 & TVSimuMode)))
5866 temp &= (~0x0001);
5867 }
5868 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005869
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005870 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305871 tempbx = pVBInfo->HT;
5872 if (XGI_IsLCDDualLink(pVBInfo))
5873 tempbx = tempbx >> 1;
5874 tempbx = (tempbx >> 1) - 2;
5875 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005876 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305877 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005878 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305879 }
5880 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305882 if (pVBInfo->ISXPDOS == 0)
5883 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5884 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005885}
5886
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005887static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5888{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005889 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005890}
5891
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005892static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305893 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005894{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305895 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305897 Pindex = pVBInfo->Part5Port;
5898 Pdata = pVBInfo->Part5Port + 1;
5899 if (pVBInfo->ModeType == ModeVGA) {
5900 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
5901 | CRT2DisplayFlag))) {
5902 XGINew_EnableCRT2(pVBInfo);
5903 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
5904 }
5905 }
5906 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005907}
5908
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005909static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305910 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005911{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005912 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005913}
5914
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005915static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305916 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005917{
5918
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005919 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005920}
5921
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005922/*----------------------------------------------------------------------------*/
5923/* input */
5924/* bl[5] : 1;LVDS signal on */
5925/* bl[1] : 1;LVDS backlight on */
5926/* bl[0] : 1:LVDS VDD on */
5927/* bh: 100000b : clear bit 5, to set bit5 */
5928/* 000010b : clear bit 1, to set bit1 */
5929/* 000001b : clear bit 0, to set bit0 */
5930/*----------------------------------------------------------------------------*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305931void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
5932 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005933{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305934 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005935
Aaro Koskinen58839b02011-03-13 12:26:23 +02005936 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305937 tempbh &= 0x23;
5938 tempbl &= 0x23;
Aaro Koskinendc505562011-03-13 12:26:26 +02005939 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005940
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305941 if (tempbh & 0x20) {
5942 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005943
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005944 /* CR B4[1] */
5945 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005946
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305947 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005948
Aaro Koskinen58839b02011-03-13 12:26:23 +02005949 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305951 temp = XG21GPIODataTransfer(temp);
5952 temp &= ~tempbh;
5953 temp |= tempbl;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005954 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005955}
5956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305957void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
5958 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005959{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305960 unsigned char CR4A, temp;
5961 unsigned short tempbh0, tempbl0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305963 tempbh0 = tempbh;
5964 tempbl0 = tempbl;
5965 tempbh0 &= 0x20;
5966 tempbl0 &= 0x20;
5967 tempbh0 >>= 3;
5968 tempbl0 >>= 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305970 if (tempbh & 0x20) {
5971 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005972
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005973 /* CR B4[1] */
5974 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305976 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005977 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005978
Aaro Koskinen58839b02011-03-13 12:26:23 +02005979 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305980 tempbh &= 0x03;
5981 tempbl &= 0x03;
5982 tempbh <<= 2;
5983 tempbl <<= 2; /* GPIOC,GPIOD */
Aaro Koskinendc505562011-03-13 12:26:26 +02005984 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005985 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005986}
5987
5988/* --------------------------------------------------------------------- */
Bill Pemberton80adad82010-06-17 13:10:51 -04005989unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005990{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305991 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Aaro Koskinen58839b02011-03-13 12:26:23 +02005993 index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305994 if (index < sizeof(XGI21_LCDCapList)
5995 / sizeof(struct XGI21_LVDSCapStruct))
5996 return index;
5997 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005998}
5999
6000/* --------------------------------------------------------------------- */
6001/* Function : XGI_XG21SetPanelDelay */
6002/* Input : */
6003/* Output : */
6004/* Description : */
6005/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6006/* : bl : 2 ; T2 : the duration signal on and Vdd on */
6007/* : bl : 3 ; T3 : the duration between CPL off and signal off */
6008/* : bl : 4 ; T4 : the duration signal off and Vdd off */
6009/* --------------------------------------------------------------------- */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306010void XGI_XG21SetPanelDelay(unsigned short tempbl,
6011 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006012{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306013 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006014
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306015 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6016 if (tempbl == 1)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006017 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006018
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306019 if (tempbl == 2)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006020 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006021
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306022 if (tempbl == 3)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006023 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006024
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306025 if (tempbl == 4)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006026 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006027}
6028
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006029unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306030 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006031{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306032 unsigned short xres, yres, colordepth, modeflag, resindex,
6033 lvdstableindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006034
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306035 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6036 if (ModeNo <= 0x13) {
6037 xres = pVBInfo->StResInfo[resindex].HTotal;
6038 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006039 /* si+St_ResInfo */
6040 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306041 } else {
6042 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6043 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006044 /* si+St_ModeFlag */
6045 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306046 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306048 if (!(modeflag & Charx8Dot)) {
6049 xres /= 9;
6050 xres *= 8;
6051 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006052
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306053 if (ModeNo > 0x13) {
6054 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6055 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306057 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6058 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306060 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306062 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6063 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6064 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04006065
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306066 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6067 return 0;
6068
6069 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006070 if ((xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6071 LVDSHDE)) ||
6072 (yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6073 LVDSVDE))) {
6074 colordepth = XGI_GetColorDepth(ModeNo,
6075 ModeIdIndex,
6076 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306077 if (colordepth > 2)
6078 return 0;
6079
6080 }
6081 }
6082 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006083}
6084
Bill Pemberton80adad82010-06-17 13:10:51 -04006085void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006086{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306087 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006088
Aaro Koskinen58839b02011-03-13 12:26:23 +02006089 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306090 temp = (temp & 1) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006091 /* SR06[6] 18bit Dither */
6092 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
6093 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
6094 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006095
6096}
6097
Bill Pemberton80adad82010-06-17 13:10:51 -04006098void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006099{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306100 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006101
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006102 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
6103 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306104 temp = (temp & 3) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006105 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
6106 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
6107 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
6108 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006109
6110}
6111
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006112static void xgifb_set_lvds(int chip_id,
6113 unsigned short ModeNo,
6114 unsigned short ModeIdIndex,
6115 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006116{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306117 unsigned char temp, Miscdata;
6118 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6119 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6120 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6121 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306123 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006124 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6125 LVDS_Capability &
6126 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306127 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006128 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006129
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006130 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006131
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006132 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6133 LVDS_Capability & LCDPolarity);
6134 /* SR35[7] FP VSync polarity */
6135 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6136 /* SR30[5] FP HSync polarity */
6137 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006138
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006139 if (chip_id == XG27)
6140 XGI_SetXG27FPBits(pVBInfo);
6141 else
6142 XGI_SetXG21FPBits(pVBInfo);
6143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306144 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6145 if (ModeNo <= 0x13) {
6146 xres = pVBInfo->StResInfo[resindex].HTotal;
6147 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006148 /* si+St_ResInfo */
6149 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306150 } else {
6151 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6152 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006153 /* si+St_ModeFlag */
6154 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306155 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006156
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306157 if (!(modeflag & Charx8Dot))
6158 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306160 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306162 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6163 - xres) / 2;
6164 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6165 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306167 if (LVDSHBS > LVDSHT)
6168 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006169
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306170 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6171 if (LVDSHRS > LVDSHT)
6172 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006173
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306174 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6175 if (LVDSHRE > LVDSHT)
6176 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306178 LVDSHBE = LVDSHBS + LVDSHT
6179 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306181 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306183 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6184 - yres) / 2;
6185 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6186 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306188 if (LVDSVBS > LVDSVT)
6189 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006190
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306191 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6192 if (LVDSVRS > LVDSVT)
6193 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006194
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006195 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].
6196 LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306197 if (LVDSVRE > LVDSVT)
6198 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306200 LVDSVBE = LVDSVBS + LVDSVT
6201 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006202
Aaro Koskinen58839b02011-03-13 12:26:23 +02006203 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006204 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006205
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306206 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006207 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306209 /* HT SR0B[1:0] CR00 */
6210 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006211 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006212 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306214 /* HBS SR0B[5:4] CR02 */
6215 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006216 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006217 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306219 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6220 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006221 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6222 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6223 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006224
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306225 /* HRS SR0B[7:6] CR04 */
6226 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006227 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006228 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306230 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6231 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006232 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006233 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306235 /* HRE SR0C[2] CR05[4:0] */
6236 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006237 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6238 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306240 /* Panel HRE SR2F[7:2] */
6241 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006242 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006243
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306244 /* VT SR0A[0] CR07[5][0] CR06 */
6245 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006246 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6247 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6248 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006249 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306251 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6252 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006253 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6254 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6255 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006256 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006257
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306258 /* VBE SR0A[4] CR16 */
6259 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006260 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006261 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306263 /* VRS SR0A[3] CR7[7][2] CR10 */
6264 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006265 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6266 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6267 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006268 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006269
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006270 if (chip_id == XG27) {
6271 /* Panel VRS SR35[2:0] SR34[7:0] */
6272 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
6273 (value & 0x700) >> 8);
6274 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
6275 } else {
6276 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6277 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
6278 (value & 0x600) >> 9);
6279 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
6280 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
6281 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006282
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306283 /* VRE SR0A[5] CR11[3:0] */
6284 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006285 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6286 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006287
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306288 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006289 if (chip_id == XG27)
6290 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6291 (value << 2) & 0xFC);
6292 else
6293 /* SR3F[7] has to be 0, h/w bug */
6294 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6295 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306297 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006298
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006299 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006300 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006301 0x2B,
6302 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6303 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006304 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006305 0x2C,
6306 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6307 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306308 value += 0x10;
6309 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006310
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306311 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006312 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006313 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006314 /* set data, panning = 0, shift left 1 dot*/
6315 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006316
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006317 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006318 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306319
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006320 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306321 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006322
6323}
6324
6325/* --------------------------------------------------------------------- */
6326/* Function : XGI_IsLCDON */
6327/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006328/* Output : 0 : Skip PSC Control */
6329/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006330/* Description : */
6331/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006332static unsigned char XGI_IsLCDON(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 tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306336 tempax = pVBInfo->VBInfo;
6337 if (tempax & SetCRT2ToDualEdge)
6338 return 0;
6339 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
6340 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306342 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006343}
6344
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006345/* --------------------------------------------------------------------- */
6346/* Function : XGI_DisableChISLCD */
6347/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006348/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006349/* Description : */
6350/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006351static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006352{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306353 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306355 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006356 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006357
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306358 if (tempbx & (EnableChA | DisableChA)) {
6359 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6360 return 0;
6361 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306363 if (!(tempbx & (EnableChB | DisableChB)))
6364 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306366 if (tempah & 0x01) /* Chk LCDB Mode */
6367 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306369 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006370}
6371
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006372/* --------------------------------------------------------------------- */
6373/* Function : XGI_EnableChISLCD */
6374/* Input : */
6375/* Output : 0 -> Not LCD mode */
6376/* Description : */
6377/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006378static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006379{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306380 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006381
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306382 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006383 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006384
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306385 if (tempbx & (EnableChA | DisableChA)) {
6386 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6387 return 0;
6388 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306390 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006391 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306393 if (tempah & 0x01) /* Chk LCDB Mode */
6394 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306396 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006397}
6398
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306399void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
6400 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006401{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006402 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306404 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6405 | VB_XGI302LV | VB_XGI301C)) {
6406 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006407 if (!(pVBInfo->VBInfo &
6408 (DisableCRT2Display | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306409 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6410 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6411 tempah = 0x7F; /* Disable Channel A */
6412 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006413 /* Disable Channel B */
6414 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006415
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306416 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006417 /* force to disable Cahnnel */
6418 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006419
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306420 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006421 /* Force to disable Channel B */
6422 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306423 }
6424 }
6425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006426
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006427 /* disable part4_1f */
6428 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006429
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306430 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6431 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
6432 || (XGI_DisableChISLCD(pVBInfo))
6433 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006434 /* LVDS Driver power down */
6435 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306436 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306438 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6439 & (DisableCRT2Display | SetCRT2ToLCDA
6440 | SetSimuScanMode))) {
6441 if (pVBInfo->SetFlag & GatingCRT)
6442 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
6443 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6444 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006445
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306446 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6447 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6448 & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006449 /* Power down */
6450 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306451 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006452
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006453 /* disable TV as primary VGA swap */
6454 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306456 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02006457 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006458
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006459 if ((pVBInfo->SetFlag & DisableChB) ||
6460 (pVBInfo->VBInfo &
6461 (DisableCRT2Display | SetSimuScanMode)) ||
6462 ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) &&
6463 (pVBInfo->VBInfo &
6464 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
6465 /* BScreenOff=1 */
6466 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006467
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006468 if ((pVBInfo->SetFlag & DisableChB) ||
6469 (pVBInfo->VBInfo &
6470 (DisableCRT2Display | SetSimuScanMode)) ||
6471 (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) ||
6472 (pVBInfo->VBInfo &
6473 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
6474 /* save Part1 index 0 */
6475 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
6476 /* BTDAC = 1, avoid VB reset */
6477 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
6478 /* disable CRT2 */
6479 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6480 /* restore Part1 index 0 */
6481 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306482 }
6483 } else { /* {301} */
6484 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006485 /* BScreenOff=1 */
6486 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
6487 /* Disable CRT2 */
6488 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6489 /* Disable TV asPrimary VGA swap */
6490 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306493 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
6494 | SetSimuScanMode))
6495 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6496 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006497}
6498
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006499/* --------------------------------------------------------------------- */
6500/* Function : XGI_GetTVPtrIndex */
6501/* Input : */
6502/* Output : */
6503/* Description : bx 0 : ExtNTSC */
6504/* 1 : StNTSC */
6505/* 2 : ExtPAL */
6506/* 3 : StPAL */
6507/* 4 : ExtHiTV */
6508/* 5 : StHiTV */
6509/* 6 : Ext525i */
6510/* 7 : St525i */
6511/* 8 : Ext525p */
6512/* 9 : St525p */
6513/* A : Ext750p */
6514/* B : St750p */
6515/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006516static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006517{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306518 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306520 if (pVBInfo->TVInfo & SetPALTV)
6521 tempbx = 2;
6522 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
6523 tempbx = 4;
6524 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6525 tempbx = 6;
6526 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6527 tempbx = 8;
6528 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6529 tempbx = 10;
6530 if (pVBInfo->TVInfo & TVSimuMode)
6531 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006532
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306533 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006534}
6535
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006536/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006537/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006538/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006539/* Output : bx 0 : NTSC */
6540/* 1 : PAL */
6541/* 2 : PALM */
6542/* 3 : PALN */
6543/* 4 : NTSC1024x768 */
6544/* 5 : PAL-M 1024x768 */
6545/* 6-7: reserved */
6546/* cl 0 : YFilter1 */
6547/* 1 : YFilter2 */
6548/* ch 0 : 301A */
6549/* 1 : 301B/302B/301LV/302LV */
6550/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006551/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006552static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
6553 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006554{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006555 *tempbx = 0;
6556 *tempcl = 0;
6557 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006558
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006559 if (pVBInfo->TVInfo & SetPALTV)
6560 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006561
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006562 if (pVBInfo->TVInfo & SetPALMTV)
6563 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006564
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006565 if (pVBInfo->TVInfo & SetPALNTV)
6566 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006567
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006568 if (pVBInfo->TVInfo & NTSC1024x768) {
6569 *tempbx = 4;
6570 if (pVBInfo->TVInfo & SetPALMTV)
6571 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306572 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006573
6574 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6575 | VB_XGI302LV | VB_XGI301C)) {
6576 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
6577 & TVSimuMode)) {
6578 *tempbx += 8;
6579 *tempcl += 1;
6580 }
6581 }
6582
6583 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6584 | VB_XGI302LV | VB_XGI301C))
6585 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006586}
6587
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006588static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006589{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306590 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006591
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306592 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306594 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6595 | VB_XGI302LV | VB_XGI301C)) {
6596 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
6597 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
6598 tempbl = 0;
6599 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306601 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
6602 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306604 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
6605 | VB_XGI301LV | VB_XGI302LV
6606 | VB_XGI301C))
6607 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006608
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306609 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6610 tempbl = tempbl >> 4;
6611 /*
6612 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
6613 tempbl = CRT2Delay1; // Get CRT2 Delay
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006614 if (pVBInfo->VBType &
6615 (VB_XGI301B |
6616 VB_XGI302B |
6617 VB_XGI301LV |
6618 VB_XGI302LV |
6619 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306620 tempbl = CRT2Delay2;
6621 */
6622 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006623 /* Get LCD Delay */
6624 index = XGI_GetLCDCapPtr(pVBInfo);
6625 tempbh = pVBInfo->LCDCapList[index].
6626 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306628 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
6629 tempbl = tempbh;
6630 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306632 tempbl &= 0x0F;
6633 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02006634 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306636 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
6637 | SetCRT2ToTV)) { /* Channel B */
6638 tempah &= 0xF0;
6639 tempah |= tempbl;
6640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306642 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
6643 tempah &= 0x0F;
6644 tempah |= tempbh;
6645 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006646 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306647 }
6648 } else if (pVBInfo->IF_DEF_LVDS == 1) {
6649 tempbl = 0;
6650 tempbh = 0;
6651 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006652 /* / Get LCD Delay */
6653 tempah = pVBInfo->LCDCapList[
6654 XGI_GetLCDCapPtr(pVBInfo)].
6655 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306656 tempah &= 0x0f;
6657 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006658 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306659 tempah);
6660 }
6661 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006662}
6663
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006664static void XGI_SetLCDCap_A(unsigned short tempcx,
6665 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006666{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306667 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006668
Aaro Koskinen58839b02011-03-13 12:26:23 +02006669 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306671 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006672 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006673 /* Enable Dither */
6674 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006675 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306676 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006677 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306678 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006679 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306680 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306682 /*
6683 if (tempcx & EnableLCD24bpp) { // 24bits
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006684 xgifb_reg_and_or(pVBInfo->Part1Port,
6685 0x19,
6686 0x0F,
6687 (unsigned short)(0x30 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006688 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306689 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006690 xgifb_reg_and_or(pVBInfo->Part1Port,
6691 0x19,
6692 0x0F,
6693 // Enable Dither
6694 (unsigned short)(0x20 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006695 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306696 }
6697 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006698}
6699
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006700/* --------------------------------------------------------------------- */
6701/* Function : XGI_SetLCDCap_B */
6702/* Input : cx -> LCD Capability */
6703/* Output : */
6704/* Description : */
6705/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006706static void XGI_SetLCDCap_B(unsigned short tempcx,
6707 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006708{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306709 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006710 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306711 (unsigned short) (((tempcx & 0x00ff) >> 6)
6712 | 0x0c));
6713 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006714 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306715 (unsigned short) (((tempcx & 0x00ff) >> 6)
6716 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006717}
6718
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006719static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006720{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306721 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306723 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006724
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006725 /* disable down spectrum D[4] */
6726 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306727 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006728 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306729 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006730
Aaro Koskinen8104e322011-03-13 12:26:22 +02006731 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306732 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006733 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306734 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006735 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306736 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006737 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306738 pVBInfo->LCDCapList[index].Spectrum_34);
6739 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006740 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006741}
6742
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006743static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
6744{
6745 unsigned short tempcx;
6746
6747 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
6748
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006749 if (pVBInfo->VBType &
6750 (VB_XGI301B |
6751 VB_XGI302B |
6752 VB_XGI301LV |
6753 VB_XGI302LV |
6754 VB_XGI301C)) { /* 301LV/302LV only */
6755 if (pVBInfo->VBType &
6756 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006757 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006758 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006759 (unsigned char) (tempcx & 0x1F));
6760 }
6761 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006762 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006763 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
6764 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
6765 | EnablePLLSPLOW)) >> 8));
6766 }
6767
6768 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6769 | VB_XGI302LV | VB_XGI301C)) {
6770 if (pVBInfo->VBInfo & SetCRT2ToLCD)
6771 XGI_SetLCDCap_B(tempcx, pVBInfo);
6772 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
6773 XGI_SetLCDCap_A(tempcx, pVBInfo);
6774
6775 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6776 if (tempcx & EnableSpectrum)
6777 SetSpectrum(pVBInfo);
6778 }
6779 } else {
6780 /* LVDS,CH7017 */
6781 XGI_SetLCDCap_A(tempcx, pVBInfo);
6782 }
6783}
6784
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006785/* --------------------------------------------------------------------- */
6786/* Function : XGI_SetAntiFlicker */
6787/* Input : */
6788/* Output : */
6789/* Description : Set TV Customized Param. */
6790/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006791static void XGI_SetAntiFlicker(unsigned short ModeNo,
6792 unsigned short ModeIdIndex,
6793 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006794{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306795 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306797 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306799 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
6800 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306802 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6803 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306805 if (ModeNo <= 0x13)
6806 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
6807 else
6808 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306810 tempbx += index;
6811 tempah = TVAntiFlickList[tempbx];
6812 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006813
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006814 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006815}
6816
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006817static void XGI_SetEdgeEnhance(unsigned short ModeNo,
6818 unsigned short ModeIdIndex,
6819 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006820{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306821 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306823 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006824
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306825 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6826 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006827
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306828 if (ModeNo <= 0x13)
6829 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
6830 else
6831 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306833 tempbx += index;
6834 tempah = TVEdgeList[tempbx];
6835 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006836
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006837 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006838}
6839
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006840static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006841{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306842 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306844 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306846 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006847
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306848 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
6849 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006850
Aaro Koskinen8104e322011-03-13 12:26:22 +02006851 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306852 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006853 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306854 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006855 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306856 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006857 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306858 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006859}
6860
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006861static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306862 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006863{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306864 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006865
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306866 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306868 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306870 switch (tempbx) {
6871 case 0x00:
6872 case 0x04:
6873 filterPtr = NTSCYFilter1;
6874 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306876 case 0x01:
6877 filterPtr = PALYFilter1;
6878 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006879
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306880 case 0x02:
6881 case 0x05:
6882 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306883 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03006884 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306885 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306887 case 0x08:
6888 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306889 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306890 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306891 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03006892 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306893 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006894
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306895 default:
6896 return;
6897 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306899 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006900 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
6901 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306902 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006903 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
6904 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306906 if (tempcl == 0)
6907 index = tempal * 4;
6908 else
6909 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306911 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006912 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
6913 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
6914 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
6915 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306916 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006917 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
6918 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
6919 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
6920 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306921 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306923 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6924 | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006925 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
6926 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
6927 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306928 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006929}
6930
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006931/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006932/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006933/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006934/* Output : */
6935/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006936/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006937static void XGI_OEM310Setting(unsigned short ModeNo,
6938 unsigned short ModeIdIndex,
6939 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006940{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006941 /* GetPart1IO(); */
6942 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006943
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006944 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
6945 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006946
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006947 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6948 /* GetPart2IO() */
6949 XGI_SetPhaseIncr(pVBInfo);
6950 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
6951 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006952
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006953 if (pVBInfo->VBType & VB_XGI301)
6954 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306955 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006956}
6957
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006958/* --------------------------------------------------------------------- */
6959/* Function : XGI_SetCRT2ModeRegs */
6960/* Input : */
6961/* Output : */
6962/* Description : Origin code for crt2group */
6963/* --------------------------------------------------------------------- */
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006964void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306965 struct xgi_hw_device_info *HwDeviceExtension,
6966 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006967{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306968 unsigned short tempbl;
6969 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006970
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306971 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006972
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006973 /* // fix write part1 index 0 BTDRAM bit Bug
6974 * xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306975 tempah = 0;
6976 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006977 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306978 tempah &= ~0x10; /* BTRAMDAC */
6979 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306981 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
6982 | SetCRT2ToLCD)) {
6983 tempah = 0x40; /* BTDRAM */
6984 if (ModeNo > 0x13) {
6985 tempcl = pVBInfo->ModeType;
6986 tempcl -= ModeVGA;
6987 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006988 /* BT Color */
6989 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306990 if (tempah == 0)
6991 tempah = 1;
6992 tempah |= 0x040;
6993 }
6994 }
6995 if (pVBInfo->VBInfo & SetInSlaveMode)
6996 tempah ^= 0x50; /* BTDAC */
6997 }
6998 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307000 /* 0210 shampoo
7001 if (pVBInfo->VBInfo & DisableCRT2Display) {
7002 tempah = 0;
7003 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007004
Aaro Koskinen8104e322011-03-13 12:26:22 +02007005 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307006 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7007 tempcl = pVBInfo->ModeType;
7008 if (ModeNo > 0x13) {
7009 tempcl -= ModeVGA;
7010 if ((tempcl > 0) || (tempcl == 0)) {
7011 tempah=(0x008>>tempcl) ;
7012 if (tempah == 0)
7013 tempah = 1;
7014 tempah |= 0x040;
7015 }
7016 } else {
7017 tempah = 0x040;
7018 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307020 if (pVBInfo->VBInfo & SetInSlaveMode) {
7021 tempah = (tempah ^ 0x050);
7022 }
7023 }
7024 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007025
Aaro Koskinen8104e322011-03-13 12:26:22 +02007026 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307027 tempah = 0x08;
7028 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007029
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307030 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007031 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307032 } else {
7033 tempah = 0x00;
7034 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307036 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7037 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007038 if ((pVBInfo->VBInfo & SetCRT2ToLCDA) &&
7039 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307040 tempbl &= 0xf7;
7041 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007042 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307043 tempbl, tempah);
7044 } else {
7045 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7046 tempbl &= 0xf7;
7047 tempah |= 0x01;
7048 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007049
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007050 if (pVBInfo->VBInfo &
7051 (SetCRT2ToRAMDAC |
7052 SetCRT2ToTV |
7053 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307054 tempbl &= 0xf8;
7055 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307057 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7058 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007059
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007060 if (!(pVBInfo->VBInfo &
7061 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307062 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007063 if (!(pVBInfo->VBInfo &
7064 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307065 tempah = tempah ^ 0x01;
7066 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007067
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007068 if (!(pVBInfo->VBInfo &
7069 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307070 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007071 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307072 0x2e, tempbl, tempah);
7073 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007074 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307075 0x2e, tempbl, tempah);
7076 }
7077 }
7078 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007079 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307080 tempah);
7081 }
7082 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307084 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7085 | SetCRT2ToLCDA)) {
7086 tempah &= (~0x08);
7087 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7088 & SetInSlaveMode))) {
7089 tempah |= 0x010;
7090 }
7091 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307093 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007094 /* if (!(pVBInfo->TVInfo &
7095 (SetYPbPrMode525p | SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307096 tempah |= 0x020;
7097 if (ModeNo > 0x13) {
7098 if (pVBInfo->VBInfo & DriverMode)
7099 tempah = tempah ^ 0x20;
7100 }
7101 /* } */
7102 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007103
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007104 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307105 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307107 if (pVBInfo->LCDInfo & SetLCDDualLink)
7108 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307110 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007111 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) &&
7112 (!(pVBInfo->TVInfo &
7113 (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307114 if (pVBInfo->TVInfo & RPLLDIV2XO)
7115 tempah |= 0x40;
7116 /* } */
7117 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307119 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7120 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7121 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307123 if (pVBInfo->LCDResInfo == Panel1280x960)
7124 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007125
Aaro Koskinen8104e322011-03-13 12:26:22 +02007126 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307127 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307129 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7130 | VB_XGI302LV | VB_XGI301C)) {
7131 tempah = 0;
7132 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307134 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7135 tempbl = 0xff;
7136 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7137 tempah |= 0x04; /* shampoo 0129 */
7138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007139
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007140 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307141 tempah = 0x00;
7142 tempbl = 0xcf;
7143 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7144 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7145 tempah |= 0x30;
7146 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007147
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007148 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307149 tempah = 0;
7150 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307152 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7153 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7154 tempah |= 0xc0;
7155 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007156 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307159 tempah = 0;
7160 tempbl = 0x7f;
7161 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
7162 tempbl = 0xff;
7163 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
7164 tempah |= 0x80;
7165 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007166
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007167 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307169 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7170 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007171 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
7172 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307173 }
7174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007175}
7176
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007177static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307178 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007179{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307180 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007181
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307182 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307184 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7185 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007186
7187}
7188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307189void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7190 struct vb_device_info *pVBInfo)
7191{
7192
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007193 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007194
7195}
7196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307197void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7198 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007199{
7200
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007201 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007202
7203}
7204
Bill Pemberton80adad82010-06-17 13:10:51 -04007205unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007206{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307207 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307209 if (pVBInfo->IF_DEF_LVDS == 1) {
7210 return 1;
7211 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007212 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307213 if ((flag == 1) || (flag == 2))
7214 return 1; /* 301b */
7215 else
7216 return 0;
7217 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007218}
7219
Bill Pemberton80adad82010-06-17 13:10:51 -04007220void XGI_LongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007221{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307222 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007223
Aaro Koskinen58839b02011-03-13 12:26:23 +02007224 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007225
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307226 if (!(i & 0xC0)) {
7227 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007228 if (!(inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307229 break;
7230 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307232 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007233 if ((inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307234 break;
7235 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007237}
7238
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007239static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007240{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307241 unsigned short tempal, temp, i, j;
7242 return;
7243 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
7244 temp = 0;
7245 for (i = 0; i < 3; i++) {
7246 for (j = 0; j < 100; j++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007247 tempal = inb(pVBInfo->P3da);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307248 if (temp & 0x01) { /* VBWaitMode2 */
7249 if ((tempal & 0x08))
7250 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007251
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307252 if (!(tempal & 0x08))
7253 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007254
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307255 } else { /* VBWaitMode1 */
7256 if (!(tempal & 0x08))
7257 continue;
7258
7259 if ((tempal & 0x08))
7260 break;
7261 }
7262 }
7263 temp = temp ^ 0x01;
7264 }
7265 } else {
7266 XGI_LongWait(pVBInfo);
7267 }
7268 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007269}
7270
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007271unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
7272 unsigned short ModeNo, unsigned short ModeIdIndex,
7273 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007274{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007275 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
7276 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
7277 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007278
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007279 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007280
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007281 if (ModeNo <= 0x13)
7282 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7283 else
7284 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7285
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007286 if (ModeNo < 0x14)
7287 return 0xFFFF;
7288
Aaro Koskinen58839b02011-03-13 12:26:23 +02007289 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007290 index = index >> pVBInfo->SelectCRT2Rate;
7291 index &= 0x0F;
7292
7293 if (pVBInfo->LCDInfo & LCDNonExpanding)
7294 index = 0;
7295
7296 if (index > 0)
7297 index--;
7298
7299 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007300 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7301 if (pVBInfo->IF_DEF_LVDS == 0) {
7302 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7303 | VB_XGI301LV | VB_XGI302LV
7304 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007305 /* 301b */
7306 temp = LCDARefreshIndex[
7307 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007308 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007309 temp = LCDRefreshIndex[
7310 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007311
7312 if (index > temp)
7313 index = temp;
7314 } else {
7315 index = 0;
7316 }
7317 }
7318 }
7319
7320 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
7321 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
7322 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
7323 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007324 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag &
7325 XG2xNotSupport) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007326 index++;
7327 }
7328 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007329 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
7330 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007331 index++;
7332 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007333 /* Alan 10/19/2007;
7334 * do the similar adjustment like XGISearchCRT1Rate() */
7335 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
7336 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007337 index++;
7338 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007339 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
7340 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007341 index++;
7342 }
7343 }
7344
7345 i = 0;
7346 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007347 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
7348 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007349 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007350 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
7351 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007352 temp &= ModeInfoFlag;
7353 if (temp < pVBInfo->ModeType)
7354 break;
7355 i++;
7356 index--;
7357
7358 } while (index != 0xFFFF);
7359 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7360 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007361 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
7362 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007363 if (temp & InterlaceMode)
7364 i++;
7365 }
7366 }
7367 i--;
7368 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7369 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7370 RefreshRateTableIndex, &i, pVBInfo);
7371 }
7372 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007373}
7374
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007375static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307376 struct xgi_hw_device_info *HwDeviceExtension,
7377 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007378{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007379 unsigned short RefreshRateTableIndex;
7380 /* unsigned short temp ; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007381
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007382 /* pVBInfo->SelectCRT2Rate = 0; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007383
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007384 pVBInfo->SetFlag |= ProgrammingCRT2;
7385 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7386 ModeIdIndex, pVBInfo);
7387 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7388 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7389 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7390 HwDeviceExtension, pVBInfo);
7391 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7392 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007393}
7394
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007395unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
7396 struct xgi_hw_device_info *HwDeviceExtension,
7397 struct vb_device_info *pVBInfo)
7398{
7399 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7400
7401 tempbx = pVBInfo->VBInfo;
7402 pVBInfo->SetFlag |= ProgrammingCRT2;
7403 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7404 pVBInfo->SelectCRT2Rate = 4;
7405 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7406 ModeIdIndex, pVBInfo);
7407 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7408 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7409 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7410 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7411 RefreshRateTableIndex, pVBInfo);
7412 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7413 RefreshRateTableIndex, pVBInfo);
7414 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7415 RefreshRateTableIndex, pVBInfo);
7416 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7417 HwDeviceExtension, pVBInfo);
7418 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7419 RefreshRateTableIndex, pVBInfo);
7420 XGI_SetTap4Regs(pVBInfo);
7421 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7422 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7423 HwDeviceExtension, pVBInfo);
7424 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7425 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7426 XGI_AutoThreshold(pVBInfo);
7427 return 1;
7428}
7429
7430void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7431{
7432 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7433 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7434 0x05, 0x00 };
7435
7436 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7437
7438 unsigned char CR17, CR63, SR31;
7439 unsigned short temp;
7440 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7441
7442 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007443 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007444
7445 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007446 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007447 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007448 pVBInfo->P3d4, 0x53) | 0x02));
7449
Aaro Koskinen58839b02011-03-13 12:26:23 +02007450 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
7451 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
7452 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007453
Aaro Koskinen8104e322011-03-13 12:26:22 +02007454 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7455 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007456
Aaro Koskinen58839b02011-03-13 12:26:23 +02007457 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007458 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007459
Aaro Koskinen58839b02011-03-13 12:26:23 +02007460 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007461 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007462
Aaro Koskinen58839b02011-03-13 12:26:23 +02007463 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007464 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02007465 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007466 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007467
Aaro Koskinen8104e322011-03-13 12:26:22 +02007468 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007469
7470 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007471 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007472
7473 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007474 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007475 CRTCData[i]);
7476
7477 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007478 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007479 CRTCData[i]);
7480
7481 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007482 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007483 CRTCData[i]);
7484
Aaro Koskinen8104e322011-03-13 12:26:22 +02007485 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007486 & 0xE0));
7487
Aaro Koskinen8104e322011-03-13 12:26:22 +02007488 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7489 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7490 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007491
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007492 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007493
7494 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007495 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
7496 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
7497 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007498 }
7499
7500 XGI_VBLongWait(pVBInfo);
7501 XGI_VBLongWait(pVBInfo);
7502 XGI_VBLongWait(pVBInfo);
7503
7504 mdelay(1);
7505
7506 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007507 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007508
7509 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007510 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007511 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007512 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007513
7514 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007515 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007516
7517 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007518 outb(0, (pVBInfo->P3c8 + 1));
7519 outb(0, (pVBInfo->P3c8 + 1));
7520 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007521 }
7522
Aaro Koskinen8104e322011-03-13 12:26:22 +02007523 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
7524 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
7525 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007526
7527 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02007528 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007529 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007530 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007531}
7532
7533void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
7534 struct vb_device_info *pVBInfo)
7535{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02007536 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007537
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007538 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7539 | VB_XGI302LV | VB_XGI301C)) {
7540 if (!(pVBInfo->SetFlag & DisableChA)) {
7541 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007542 /* Power on */
7543 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007544 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007545 /* SetCRT2ToLCDA ) */
7546 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7547 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007548 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007549 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007550 }
7551 }
7552 }
7553
7554 if (!(pVBInfo->SetFlag & DisableChB)) {
7555 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
7556 & (SetCRT2ToLCD | SetCRT2ToTV
7557 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007558 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007559 pVBInfo->P3c4, 0x32);
7560 tempah &= 0xDF;
7561 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007562 if (!(pVBInfo->VBInfo &
7563 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007564 tempah |= 0x20;
7565 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007566 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007567 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007568
Aaro Koskinen58839b02011-03-13 12:26:23 +02007569 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007570 pVBInfo->Part1Port, 0x2E);
7571
7572 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007573 /* BVBDOENABLE = 1 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007574 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007575 0x2E, 0x80);
7576 /* BScreenOFF = 0 */
7577 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007578 }
7579 }
7580
7581 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
7582 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007583 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007584 0x20); /* shampoo 0129 */
7585 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7586 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007587 if (XGI_EnableChISLCD(pVBInfo) ||
7588 (pVBInfo->VBInfo &
7589 (SetCRT2ToLCD | SetCRT2ToLCDA)))
7590 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02007591 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007592 pVBInfo->Part4Port,
7593 0x2A,
7594 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007595 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007596 /* LVDS Driver power on */
7597 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007598 }
7599 }
7600
7601 tempah = 0x00;
7602
7603 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7604 tempah = 0xc0;
7605
7606 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
7607 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007608 if (pVBInfo->VBInfo &
7609 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007610 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007611 if (pVBInfo->VBInfo &
7612 SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007613 tempah = tempah ^ 0xC0;
7614
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007615 if (pVBInfo->SetFlag &
7616 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007617 tempah &= 0xBF;
7618
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007619 if (pVBInfo->SetFlag &
7620 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007621 tempah &= 0x7F;
7622
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007623 if (pVBInfo->SetFlag &
7624 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007625 tempah |= 0x40;
7626
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007627 if (pVBInfo->SetFlag &
7628 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007629 tempah |= 0x80;
7630 }
7631 }
7632 }
7633 }
7634
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007635 /* EnablePart4_1F */
7636 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007637
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007638 if (!(pVBInfo->SetFlag & DisableChA)) {
7639 XGI_VBLongWait(pVBInfo);
7640 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007641 XGI_DisableGatingCRT(HwDeviceExtension,
7642 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007643 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7644 XGI_VBLongWait(pVBInfo);
7645 }
7646 }
7647 } /* 301 */
7648 else { /* LVDS */
7649 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
7650 | SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007651 /* enable CRT2 */
7652 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007653
Aaro Koskinen58839b02011-03-13 12:26:23 +02007654 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007655 0x2E);
7656 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007657 /* BVBDOENABLE = 1 */
7658 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007659
Aaro Koskinendc505562011-03-13 12:26:26 +02007660 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007661 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7662 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007663}
7664
7665static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
7666 unsigned short ModeNo, unsigned short ModeIdIndex,
7667 struct vb_device_info *pVBInfo)
7668{
7669 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
7670
7671 unsigned short XGINew_P3cc = pVBInfo->P3cc;
7672
7673 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
7674 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
7675 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
7676 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
7677 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7678 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
7679 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
7680 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7681 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
7682 XGI_ClearExt1Regs(pVBInfo);
7683
7684 /* if (pVBInfo->IF_DEF_ExpLink) */
7685 if (HwDeviceExtension->jChipType == XG27) {
7686 if (pVBInfo->IF_DEF_LVDS == 0)
7687 XGI_SetDefaultVCLK(pVBInfo);
7688 }
7689
7690 temp = ~ProgrammingCRT2;
7691 pVBInfo->SetFlag &= temp;
7692 pVBInfo->SelectCRT2Rate = 0;
7693
7694 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7695 | VB_XGI302LV | VB_XGI301C)) {
7696 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
7697 | SetInSlaveMode)) {
7698 pVBInfo->SetFlag |= ProgrammingCRT2;
7699 }
7700 }
7701
7702 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7703 ModeIdIndex, pVBInfo);
7704 if (RefreshRateTableIndex != 0xFFFF) {
7705 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
7706 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7707 pVBInfo, HwDeviceExtension);
7708 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
7709 RefreshRateTableIndex, pVBInfo);
7710 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7711 HwDeviceExtension, pVBInfo);
7712 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
7713 RefreshRateTableIndex, pVBInfo);
7714 }
7715
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007716 if ((HwDeviceExtension->jChipType >= XG20) &&
7717 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007718 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007719 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
7720 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007721 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007722 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007723 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
7724 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007725 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7726 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007727 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007728 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007729 }
7730 }
7731
7732 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007733 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007734 if (temp & 0xA0) {
7735
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007736 /* Enable write GPIOF */
7737 /* xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); */
7738 /* P. DWN */
7739 /* xgifb_reg_and(pVBInfo->P3d4, 0x48, ~0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007740 /* XG21 CRT1 Timing */
7741 if (HwDeviceExtension->jChipType == XG27)
7742 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
7743 RefreshRateTableIndex, pVBInfo);
7744 else
7745 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
7746 RefreshRateTableIndex, pVBInfo);
7747
7748 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
7749 RefreshRateTableIndex);
7750
Aaro Koskinen105d8d02011-08-31 21:46:00 +03007751 xgifb_set_lcd(HwDeviceExtension->jChipType,
7752 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007753
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007754 if (pVBInfo->IF_DEF_LVDS == 1)
7755 xgifb_set_lvds(HwDeviceExtension->jChipType,
7756 ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007757 /* P. ON */
7758 /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007759 }
7760 }
7761
7762 pVBInfo->SetFlag &= (~ProgrammingCRT2);
7763 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
7764 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
7765 RefreshRateTableIndex, pVBInfo);
7766
7767 /* XGI_LoadCharacter(); //dif ifdef TVFont */
7768
7769 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
7770 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
7771}
7772
7773unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
7774 unsigned short ModeNo)
7775{
7776 unsigned short ModeIdIndex;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007777 /* unsigned char *pVBInfo->FBAddr =
7778 HwDeviceExtension->pjVideoMemoryAddress; */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007779 struct vb_device_info VBINF;
7780 struct vb_device_info *pVBInfo = &VBINF;
7781 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
7782 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
7783 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007784 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007785
7786 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
7787 pVBInfo->IF_DEF_YPbPr = 0;
7788 pVBInfo->IF_DEF_HiVision = 0;
7789 pVBInfo->IF_DEF_CRT2Monitor = 0;
7790 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007791 } else {
7792 pVBInfo->IF_DEF_YPbPr = 1;
7793 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02007794 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007795 }
7796
7797 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
7798 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
7799 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
7800 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
7801 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
7802 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
7803 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
7804 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
7805 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
7806 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
7807 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
7808 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
7809 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
7810 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
7811 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
7812 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
7813 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
7814 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
7815
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007816 /* for x86 Linux, XG21 LVDS */
7817 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007818 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007819 pVBInfo->IF_DEF_LVDS = 1;
7820 }
7821 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007822 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
7823 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007824 pVBInfo->IF_DEF_LVDS = 1;
7825 }
7826 }
7827
7828 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
7829 XGI_GetVBType(pVBInfo);
7830
7831 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
7832 if (ModeNo & 0x80) {
7833 ModeNo = ModeNo & 0x7F;
7834 /* XGINew_flag_clearbuffer = 0; */
7835 }
7836 /* else {
7837 XGINew_flag_clearbuffer = 1;
7838 }
7839 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007840 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007841
7842 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
7843 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
7844
7845 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7846
7847 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
7848
7849 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7850 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
7851 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
7852 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
7853 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007854
7855 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
7856 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
7857 ModeIdIndex, pVBInfo);
7858
7859 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7860 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7861 HwDeviceExtension, pVBInfo);
7862 }
7863 } else {
7864 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
7865 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
7866 ModeIdIndex, pVBInfo);
7867 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7868 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7869 HwDeviceExtension,
7870 pVBInfo);
7871 }
7872 }
7873 }
7874
7875 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
7876 switch (HwDeviceExtension->ujVBChipID) {
7877 case VB_CHIP_301:
7878 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7879 pVBInfo); /*add for CRT2 */
7880 break;
7881
7882 case VB_CHIP_302:
7883 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7884 pVBInfo); /*add for CRT2 */
7885 break;
7886
7887 default:
7888 break;
7889 }
7890 }
7891
7892 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
7893 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
7894 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
7895 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
7896 } /* !XG20 */
7897 else {
7898 if (pVBInfo->IF_DEF_LVDS == 1)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007899 if (!XGI_XG21CheckLVDSMode(ModeNo,
7900 ModeIdIndex,
7901 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007902 return 0;
7903
7904 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007905 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
7906 St_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007907 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007908 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
7909 Ext_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007910 }
7911
7912 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03007913 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007914
7915 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7916
7917 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
7918 pVBInfo);
7919
7920 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7921 /*
7922 if (HwDeviceExtension->jChipType == XG21)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007923 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007924 */
7925 }
7926
7927 /*
7928 if (ModeNo <= 0x13) {
7929 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7930 } else {
7931 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7932 }
7933 pVBInfo->ModeType = modeflag&ModeInfoFlag;
7934 pVBInfo->SetFlag = 0x00;
7935 pVBInfo->VBInfo = DisableCRT2Display;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007936 temp = XGINew_CheckMemorySize(HwDeviceExtension,
7937 ModeNo,
7938 ModeIdIndex,
7939 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007940
7941 if (temp == 0)
7942 return (0);
7943
7944 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
7945 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
7946 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7947 */
7948
7949 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
7950
7951 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7952 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
7953 }
7954
7955 return 1;
7956}