blob: 259474f2584639ae679dde52aa27a62677a2d67c [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002#include <linux/io.h>
Aaro Koskinend80aaa02011-02-17 23:29:14 +02003#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include <linux/types.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
8#include "vb_def.h"
9#include "vgatypes.h"
10#include "vb_struct.h"
Aaro Koskinen09d1cad2011-09-13 22:49:34 +030011#include "vb_init.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020012#include "vb_util.h"
13#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020014#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020015
16
17#define IndexMask 0xff
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020018
Aaro Koskinen624554d2011-10-11 21:47:35 +030019static const unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
22 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
23 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
25 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
26 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
27 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020028
Aaro Koskinen624554d2011-10-11 21:47:35 +030029static const unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040030 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
31 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
32 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
33 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
34 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
35 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
36 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
37 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020038
Aaro Koskinen624554d2011-10-11 21:47:35 +030039static const unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040040 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
41 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
42 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
43 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
44 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
45 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
46 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
47 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020048
Aaro Koskinen624554d2011-10-11 21:47:35 +030049static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040050 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
51 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
52 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
53 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
54 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
55 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
56 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
57 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
58 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
59 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020060
Bill Pemberton80adad82010-06-17 13:10:51 -040061void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020062{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053063 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
64 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
65 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
66 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
67 pVBInfo->XGINEWUB_CRT1Table
68 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020069
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053070 /* add for new UNIVGABIOS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +080071 /* XGINew_UBLCDDataTable =
72 * (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053073 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020074
Aaro Koskinen06587332011-03-13 12:26:10 +020075 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
76 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053077 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
78 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
79 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
80 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
81 pVBInfo->ModeResInfo
82 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053084 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
85 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
86 pVBInfo->pSR07 = &XGI330_SR07;
87 pVBInfo->LCDResInfo = 0;
88 pVBInfo->LCDTypeInfo = 0;
89 pVBInfo->LCDInfo = 0;
90 pVBInfo->VBInfo = 0;
91 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053093 pVBInfo->SR15 = XGI340_SR13;
94 pVBInfo->CR40 = XGI340_cr41;
95 pVBInfo->SR25 = XGI330_sr25;
96 pVBInfo->pSR31 = &XGI330_sr31;
97 pVBInfo->pSR32 = &XGI330_sr32;
98 pVBInfo->CR6B = XGI340_CR6B;
99 pVBInfo->CR6E = XGI340_CR6E;
100 pVBInfo->CR6F = XGI340_CR6F;
101 pVBInfo->CR89 = XGI340_CR89;
102 pVBInfo->AGPReg = XGI340_AGPReg;
103 pVBInfo->SR16 = XGI340_SR16;
104 pVBInfo->pCRCF = &XG40_CRCF;
105 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530107 pVBInfo->CR49 = XGI330_CR49;
108 pVBInfo->pSR1F = &XGI330_SR1F;
109 pVBInfo->pSR21 = &XGI330_SR21;
110 pVBInfo->pSR22 = &XGI330_SR22;
111 pVBInfo->pSR23 = &XGI330_SR23;
112 pVBInfo->pSR24 = &XGI330_SR24;
113 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530115 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
116 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
117 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
118 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
119 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
120 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
121 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
122 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
123 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
124 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
127 pVBInfo->PALTiming = XGI330_PALTiming;
128 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
129 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
130 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
131 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
132 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
133 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
134 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
135 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
136 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
137 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
138 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
139 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530141 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
142 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
143 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530145 /* 310 customization related */
146 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
147 pVBInfo->LCDCapList = XGI_LCDDLCapList;
148 else
149 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530151 if ((ChipType == XG21) || (ChipType == XG27))
152 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200153
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530154 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
155 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200156
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530157 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530159 if (ChipType >= XG20)
160 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530162 if (ChipType == XG27) {
163 pVBInfo->MCLKData
164 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
165 pVBInfo->CR40 = XGI27_cr41;
166 pVBInfo->pXGINew_CR97 = &XG27_CR97;
167 pVBInfo->pSR36 = &XG27_SR36;
168 pVBInfo->pCR8F = &XG27_CR8F;
169 pVBInfo->pCRD0 = XG27_CRD0;
170 pVBInfo->pCRDE = XG27_CRDE;
171 pVBInfo->pSR40 = &XG27_SR40;
172 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200173
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530176 if (ChipType >= XG20) {
177 pVBInfo->pDVOSetting = &XG21_DVOSetting;
178 pVBInfo->pCR2E = &XG21_CR2E;
179 pVBInfo->pCR2F = &XG21_CR2F;
180 pVBInfo->pCR46 = &XG21_CR46;
181 pVBInfo->pCR47 = &XG21_CR47;
182 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200183
184}
185
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800186static unsigned char XGI_GetModePtr(unsigned short ModeNo,
187 unsigned short ModeIdIndex,
188 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200189{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530190 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530192 if (ModeNo <= 0x13)
193 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
194 else {
195 if (pVBInfo->ModeType <= 0x02)
196 index = 0x1B; /* 02 -> ModeEGA */
197 else
198 index = 0x0F;
199 }
200 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200201}
202
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800203static void XGI_SetSeqRegs(unsigned short ModeNo,
204 unsigned short StandTableIndex,
205 unsigned short ModeIdIndex,
206 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530209 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530211 if (ModeNo <= 0x13)
212 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
213 else
214 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200215
Aaro Koskinen8104e322011-03-13 12:26:22 +0200216 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530217 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530219 i = SetCRT2ToLCDA;
220 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
221 tempah |= 0x01;
222 } else {
223 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
224 if (pVBInfo->VBInfo & SetInSlaveMode)
225 tempah |= 0x01;
226 }
227 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200228
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530229 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200230 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530232 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800233 /* Get SR2,3,4 from file */
234 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200235 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200237}
238
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200239static void XGI_SetMiscRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800240 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200241{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530242 unsigned char Miscdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200243
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800244 /* Get Misc from file */
245 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530246 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800247 if (pVBInfo->VBType & (VB_XGI301B |
248 VB_XGI302B |
249 VB_XGI301LV |
250 VB_XGI302LV |
251 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530252 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
253 Miscdata |= 0x0C;
254 }
255 }
256 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200257
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200258 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200259}
260
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200261static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800262 unsigned short StandTableIndex,
263 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200264{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530265 unsigned char CRTCdata;
266 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200267
Aaro Koskinen58839b02011-03-13 12:26:23 +0200268 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530269 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200270 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200271
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530272 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800273 /* Get CRTC from file */
274 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200275 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530276 }
277 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800278 if ((HwDeviceExtension->jChipType == XGI_630) &&
279 (HwDeviceExtension->jChipRevision == 0x30)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530280 if (pVBInfo->VBInfo & SetInSlaveMode) {
281 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200282 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530283 }
284 }
285 }
286 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200287}
288
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800289static void XGI_SetATTRegs(unsigned short ModeNo,
290 unsigned short StandTableIndex,
291 unsigned short ModeIdIndex,
292 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200293{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530294 unsigned char ARdata;
295 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530297 if (ModeNo <= 0x13)
298 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
299 else
300 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530302 for (i = 0; i <= 0x13; i++) {
303 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
304 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
305 if (i == 0x13) {
306 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
307 ARdata = 0;
308 } else {
309 if (pVBInfo->VBInfo & (SetCRT2ToTV
310 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800311 if (pVBInfo->VBInfo &
312 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530313 ARdata = 0;
314 }
315 }
316 }
317 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200318
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200319 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200320 outb(i, pVBInfo->P3c0); /* set index */
321 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530322 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200324 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200325 outb(0x14, pVBInfo->P3c0); /* set index */
326 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200327 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200328 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200329}
330
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200331static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800332 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 unsigned char GRdata;
335 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800338 /* Get GR from file */
339 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200340 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530341 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200342
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530343 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200344 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200346 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530347 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200348}
349
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200350static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200351{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530352 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530354 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200355 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200356}
357
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200358static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200359{
360
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200361 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200362 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
363 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200364
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200365 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200366 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
367 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Aaro Koskinendc505562011-03-13 12:26:26 +0200369 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530370 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200371}
372
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200373static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530374 unsigned short ModeIdIndex,
375 unsigned short RefreshRateTableIndex, unsigned short *i,
376 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200377{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530378 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530380 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800381 /* si+St_ModeFlag */
382 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530383 else
384 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
387 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
388 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 if (pVBInfo->IF_DEF_LVDS == 0) {
391 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
392 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530394 if (pVBInfo->VBType & VB_XGI301C)
395 tempax |= SupportCRT2in301C;
396 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200397
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800398 /* 301b */
399 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200401
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530402 if (pVBInfo->LCDResInfo != Panel1280x1024) {
403 if (pVBInfo->LCDResInfo != Panel1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800404 if (pVBInfo->LCDInfo &
405 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 if (resinfo >= 9) {
407 tempax = 0;
408 return 0;
409 }
410 }
411 }
412 }
413 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200414
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530415 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800416 if ((pVBInfo->VBType & VB_XGI301LV) &&
417 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530418 tempax |= SupportYPbPr;
419 if (pVBInfo->VBInfo & SetInSlaveMode) {
420 if (resinfo == 4)
421 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530423 if (resinfo == 3)
424 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530426 if (resinfo > 7)
427 return 0;
428 }
429 } else {
430 tempax |= SupportHiVisionTV;
431 if (pVBInfo->VBInfo & SetInSlaveMode) {
432 if (resinfo == 4)
433 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530435 if (resinfo == 3) {
436 if (pVBInfo->SetFlag
437 & TVSimuMode)
438 return 0;
439 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530441 if (resinfo > 7)
442 return 0;
443 }
444 }
445 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800446 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
447 SetCRT2ToSVIDEO |
448 SetCRT2ToSCART |
449 SetCRT2ToYPbPr |
450 SetCRT2ToHiVisionTV)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530451 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530453 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
454 | VB_XGI301LV | VB_XGI302LV
455 | VB_XGI301C)) {
456 tempax |= SupportTV1024;
457 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200458
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530459 if (!(pVBInfo->VBInfo & SetPALTV)) {
460 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800461 if (pVBInfo->VBInfo &
462 SetInSlaveMode) {
463 if (!(pVBInfo->VBInfo &
464 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530465 return 0;
466 }
467 }
468 }
469 }
470 }
471 }
472 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530473 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
474 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200475
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530476 if (resinfo > 0x08)
477 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200478
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530479 if (pVBInfo->LCDResInfo < Panel1024x768) {
480 if (resinfo > 0x07)
481 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200482
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530483 if (resinfo == 0x04)
484 return 0; /* 512x384 */
485 }
486 }
487 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200488
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800489 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
490 tempbx; (*i)--) {
491 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
492 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530493 if (infoflag & tempax)
494 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530496 if ((*i) == 0)
497 break;
498 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200499
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530500 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800501 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
502 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530503 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
504 != tempbx) {
505 return 0;
506 }
507
508 if (infoflag & tempax)
509 return 1;
510 }
511 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200512}
513
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200514static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530515 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200516{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530517 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200518
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800519 /* di+0x00 */
520 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530521 sync &= 0xC0;
522 temp = 0x2F;
523 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200524 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200525}
526
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200527static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530528 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200529{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530530 unsigned char data, data1, pushax;
531 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200532
Aaro Koskinen8104e322011-03-13 12:26:22 +0200533 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
534 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200535 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200536
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800537 /* unlock cr0-7 */
538 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530539 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200540 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200541
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530542 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200543 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530545 for (i = 0x01; i <= 0x04; i++) {
546 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200547 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530548 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200549
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530550 for (i = 0x05; i <= 0x06; i++) {
551 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200552 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530553 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200554
Aaro Koskinen58839b02011-03-13 12:26:23 +0200555 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530556 j &= 0x1F;
557 data = pVBInfo->TimingH[0].data[7];
558 data &= 0xE0;
559 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200560 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530562 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200563 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530564 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200565 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200566 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530567 data1 = data;
568 data1 &= 0xE0;
569 data &= 0x1F;
570 if (data == 0) {
571 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200572 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530573 0x0c);
574 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200575 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530576 data = pushax;
577 }
578 data = data - 1;
579 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200580 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200581 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530582 data = data >> 5;
583 data = data + 3;
584 if (data > 7)
585 data = data - 7;
586 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200587 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530588 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200589}
590
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800591static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
592 unsigned short ModeNo,
593 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200594{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530595 unsigned char data;
596 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200597
Aaro Koskinen8104e322011-03-13 12:26:22 +0200598 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
599 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200600 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530602 for (i = 0x00; i <= 0x01; i++) {
603 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200604 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530605 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530607 for (i = 0x02; i <= 0x03; i++) {
608 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200609 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530610 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200611
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530612 for (i = 0x04; i <= 0x05; i++) {
613 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200614 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530615 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200616
Aaro Koskinen58839b02011-03-13 12:26:23 +0200617 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530618 j &= 0xC0;
619 data = pVBInfo->TimingV[0].data[6];
620 data &= 0x3F;
621 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200622 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200623
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530624 data = pVBInfo->TimingV[0].data[6];
625 data &= 0x80;
626 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530628 if (ModeNo <= 0x13)
629 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
630 else
631 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530633 i &= DoubleScanMode;
634 if (i)
635 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200636
Aaro Koskinen58839b02011-03-13 12:26:23 +0200637 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530638 j &= 0x5F;
639 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200640 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200641}
642
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200643static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
644 unsigned short RefreshRateTableIndex,
645 struct vb_device_info *pVBInfo,
646 struct xgi_hw_device_info *HwDeviceExtension)
647{
648 unsigned char index, data;
649 unsigned short i;
650
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800651 /* Get index */
652 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200653 index = index & IndexMask;
654
Aaro Koskinen58839b02011-03-13 12:26:23 +0200655 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200656 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200657 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200658
659 for (i = 0; i < 8; i++)
660 pVBInfo->TimingH[0].data[i]
661 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
662
663 for (i = 0; i < 7; i++)
664 pVBInfo->TimingV[0].data[i]
665 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
666
667 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
668
669 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
670
671 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200672 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200673}
674
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200675/* --------------------------------------------------------------------- */
676/* Function : XGI_SetXG21CRTC */
677/* Input : Stand or enhance CRTC table */
678/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
679/* Description : Set LCD timing */
680/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200681static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530682 unsigned short RefreshRateTableIndex,
683 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200684{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530685 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
686 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530688 if (ModeNo <= 0x13) {
689 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800690 /* CR04 HRS */
691 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
692 /* SR2E [7:0]->HRS */
693 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
694 /* Tempbx: CR05 HRE */
695 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530696 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
697 Tempcx = Tempax;
698 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
699 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
700 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
701 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
702 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800703 /* SR2F [7:2]->HRE */
704 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200705 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200706
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800707 /* Tempax: CR16 VRS */
708 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530709 Tempbx = Tempax; /* Tempbx=Tempax */
710 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200711 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800712
713 /* Tempax: CR7 VRS */
714 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530715 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
716 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
717 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
718 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800719 /* SR34[7:0]: VRS[8:1] */
720 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200721
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800722 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
723 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530724 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
725 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
726 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
727 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200728
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800729 /* CR16 VRE */
730 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530731 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
732 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
733 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
734 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
735 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
736 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
737 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
738 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
739 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
740 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
741 Temp1 >>= 9; /* [10:9]->[1:0] */
742 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
743 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
744 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800745 /* SR3F D[7:2]->VRE D[1:0]->VRS */
746 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530747 } else {
748 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800749 /* Tempax: CR4 HRS */
750 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530751 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800752 /* SR2E[7:0]->HRS */
753 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530755 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
756 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
757 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
758 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
759 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200760
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530761 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
762 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530764 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
765 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
766 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
767 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200768
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530769 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
770 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
773 if (Tempax < Tempcx) /* HRE < HRS */
774 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530776 Temp2 &= 0xFF;
777 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
778 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
779 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
780 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800781 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
782 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200783 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200784
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800785 /* CR10 VRS */
786 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530787 Tempbx = Tempax; /* Tempbx: VRS */
788 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200789 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800790 /* CR7[2][7] VRE */
791 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530792 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
793 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
794 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
795 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200796 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530798 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
799 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
800 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
801 Tempax &= 0x80;
802 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
803 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800804 /* Tempax: SRA */
805 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530806 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
807 Temp2 = Tempax;
808 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
809 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200810
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800811 /* Tempax: CR11 VRE */
812 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530813 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800814 /* Tempbx: SRA */
815 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530816 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
817 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
818 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
819 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
820 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530822 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
823 if (Tempax < Temp3) /* VRE < VRS */
824 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530826 Temp2 &= 0xFF;
827 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
828 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
829 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
830 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
831 Tempbx = (unsigned char) Temp1;
832 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
833 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800834 /* SR3F D[7:2]->VRE D[1:0]->VRS */
835 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530836 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200837}
838
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800839static void XGI_SetXG27CRTC(unsigned short ModeNo,
840 unsigned short ModeIdIndex,
841 unsigned short RefreshRateTableIndex,
842 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200843{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400844 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530846 if (ModeNo <= 0x13) {
847 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800848 /* CR04 HRS */
849 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
850 /* SR2E [7:0]->HRS */
851 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
852 /* Tempbx: CR05 HRE */
853 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530854 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
855 Tempcx = Tempax;
856 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
857 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
858 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
859 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
860 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800861 /* SR2F [7:2]->HRE */
862 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200863 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200864
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800865 /* Tempax: CR10 VRS */
866 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200867 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530868 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800869 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
870 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530871 Tempbx = Tempax; /* Tempbx=CR07 */
872 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
873 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800874 /* SR35 D[0]->VRS D[8] */
875 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530876 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
877 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200878
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800879 /* CR11 VRE */
880 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530881 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
882 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
883 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
884 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
885 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
886 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800887 /* Tempax[7:0]: VRE[7:0] */
888 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530889 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
890 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800891 /* SR3F D[7:2]->VRE D[5:0] */
892 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
893 /* SR35 D[2:1]->VRS[10:9] */
894 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530895 } else {
896 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800897 /* Tempax: CR4 HRS */
898 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530899 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800900 /* SR2E[7:0]->HRS */
901 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200902
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800903 /* SR0B */
904 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530905 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
906 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530908 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
909 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
910 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530912 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
913 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
914 Tempax <<= 3; /* Tempax[5]: HRE[5] */
915 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530917 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
918 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200919
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800920 /* Tempax: CR4 HRS */
921 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530922 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
923 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
924 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530926 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
927 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
928 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
929 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800930 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
931 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200932 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200933
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800934 /* CR10 VRS */
935 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
936 /* SR34[7:0]->VRS[7:0] */
937 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530939 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800940 /* CR7[7][2] VRS[9][8] */
941 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530942 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
943 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
944 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800945 /* SR35[0]: VRS[8] */
946 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530947 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
948 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800949 /* Tempax: SR0A */
950 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530951 Tempax &= 0x08; /* SR0A[3] VRS[10] */
952 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200953
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800954 /* Tempax: CR11 VRE */
955 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530956 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800957 /* Tempbx: SR0A */
958 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530959 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
960 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
961 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
962 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
963 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
964 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200965
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530966 if (Tempbx <= Tempcx) /* VRE <= VRS */
967 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200968
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800969 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
970 Tempax = (Tempbx << 2) & 0xFF;
971 /* SR3F[7:2]:VRE[5:0] */
972 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530973 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800974 /* SR35[2:0]:VRS[10:8] */
975 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530976 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200977}
978
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200979static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
980{
981 unsigned char temp;
982
983 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
984 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
985 temp = (temp & 3) << 6;
986 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
987 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
988 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
989 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
990
991}
992
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300993static void xgifb_set_lcd(int chip_id,
994 struct vb_device_info *pVBInfo,
995 unsigned short RefreshRateTableIndex,
996 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200997{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400998 unsigned short Data, Temp, b3CC;
999 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301001 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001002
Aaro Koskinen8104e322011-03-13 12:26:22 +02001003 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1004 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1005 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1006 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001007
1008 if (chip_id == XG27) {
1009 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1010 if ((Temp & 0x03) == 0) { /* dual 12 */
1011 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
1012 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
1013 }
1014 }
1015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301016 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001017 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1018 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1019 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1020 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301021 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001022
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001023 if (chip_id == XG27) {
1024 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301025 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001026 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1027 if (Temp & 0x01) {
1028 /* 18 bits FP */
1029 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
1030 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
1031 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301032 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001033
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001034 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001035
Aaro Koskinendc505562011-03-13 12:26:26 +02001036 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1037 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001038
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001040 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301041 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001042 /* Hsync polarity */
1043 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301044 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001045 /* Vsync polarity */
1046 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301047 } else {
1048 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1049 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001050 /* Hsync polarity */
1051 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301052 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001053 /* Vsync polarity */
1054 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301055 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001056}
1057
1058/* --------------------------------------------------------------------- */
1059/* Function : XGI_UpdateXG21CRTC */
1060/* Input : */
1061/* Output : CRT1 CRTC */
1062/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1063/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001064static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1065 struct vb_device_info *pVBInfo,
1066 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001067{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301068 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001069
Aaro Koskinendc505562011-03-13 12:26:26 +02001070 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301071 if (ModeNo <= 0x13) {
1072 for (i = 0; i < 12; i++) {
1073 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1074 index = i;
1075 }
1076 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001077 if (ModeNo == 0x2E &&
1078 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1079 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301080 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001081 else if (ModeNo == 0x2E &&
1082 (pVBInfo->RefIndex[RefreshRateTableIndex].
1083 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301084 index = 13;
1085 else if (ModeNo == 0x2F)
1086 index = 14;
1087 else if (ModeNo == 0x50)
1088 index = 15;
1089 else if (ModeNo == 0x59)
1090 index = 16;
1091 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301093 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001094 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301095 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001096 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301097 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001098 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001100 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301101 pVBInfo->UpdateCRT1[index].CR16);
1102 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001103}
1104
Aaro Koskinen06465962011-11-27 23:03:06 +02001105static unsigned short XGI_GetResInfo(unsigned short ModeNo,
1106 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
1107{
1108 unsigned short resindex;
1109
1110 if (ModeNo <= 0x13)
1111 /* si+St_ResInfo */
1112 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1113 else
1114 /* si+Ext_ResInfo */
1115 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1116 return resindex;
1117}
1118
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001119static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301120 unsigned short ModeNo, unsigned short ModeIdIndex,
1121 unsigned short RefreshRateTableIndex,
1122 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001123{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001124 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301126 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301128 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001129
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301130 if (ModeNo <= 0x13) {
1131 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1132 tempax = pVBInfo->StResInfo[resindex].HTotal;
1133 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1134 } else {
1135 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1136 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1137 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301140 if (modeflag & HalfDCLK)
1141 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301143 if (ModeNo > 0x13) {
1144 if (modeflag & HalfDCLK)
1145 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301147 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301149 if (temp & InterlaceMode)
1150 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301152 if (modeflag & DoubleScanMode)
1153 tempbx = tempbx << 1;
1154 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301158 /* if (!(modeflag & Charx8Dot)) */
1159 /* tempcx = 9; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 tempax /= tempcx;
1162 tempax -= 1;
1163 tempbx -= 1;
1164 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001165 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1166 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301167 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001168 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1169 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001170 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001172 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301173 tempax = 0;
1174 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301176 if (tempbx & 0x01)
1177 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301179 if (tempbx & 0x02)
1180 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001181
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001182 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001183 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301184 data &= 0xFF;
1185 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001186
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301187 if (tempbx & 0x04)
1188 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001189
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001190 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001191 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001192}
1193
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001194static void XGI_SetCRT1Offset(unsigned short ModeNo,
1195 unsigned short ModeIdIndex,
1196 unsigned short RefreshRateTableIndex,
1197 struct xgi_hw_device_info *HwDeviceExtension,
1198 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001199{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301200 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301202 /* GetOffset */
1203 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1204 temp = temp >> 8;
1205 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001206
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301207 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1208 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301210 if (temp2)
1211 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001212
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301213 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301215 switch (temp2) {
1216 case 0:
1217 temp2 = 1;
1218 break;
1219 case 1:
1220 temp2 = 2;
1221 break;
1222 case 2:
1223 temp2 = 4;
1224 break;
1225 case 3:
1226 temp2 = 4;
1227 break;
1228 case 4:
1229 temp2 = 6;
1230 break;
1231 case 5:
1232 temp2 = 8;
1233 break;
1234 default:
1235 break;
1236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301238 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1239 temp = temp * temp2 + temp2 / 2;
1240 else
1241 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001242
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301243 /* SetOffset */
1244 DisplayUnit = temp;
1245 temp2 = temp;
1246 temp = temp >> 8; /* ah */
1247 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001248 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301249 i &= 0xF0;
1250 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001251 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301253 temp = (unsigned char) temp2;
1254 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001255 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301257 /* SetDisplayUnit */
1258 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1259 temp2 &= InterlaceMode;
1260 if (temp2)
1261 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301263 DisplayUnit = DisplayUnit << 5;
1264 ah = (DisplayUnit & 0xff00) >> 8;
1265 al = DisplayUnit & 0x00ff;
1266 if (al == 0)
1267 ah += 1;
1268 else
1269 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301271 if (HwDeviceExtension->jChipType >= XG20)
1272 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1273 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001274
Aaro Koskinen8104e322011-03-13 12:26:22 +02001275 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001276}
1277
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001278static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1279 unsigned short ModeIdIndex,
1280 unsigned short RefreshRateTableIndex,
1281 struct xgi_hw_device_info *HwDeviceExtension,
1282 struct vb_device_info *pVBInfo)
1283{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001284 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2,
1285 VCLK65 + 2,
1286 VCLK65 + 2,
1287 VCLK65 + 2 };
1288 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5,
1289 VCLK108_2 + 5,
1290 VCLK108_2 + 5,
1291 VCLK108_2 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001292 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001293 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2,
1294 VCLK65 + 2,
1295 VCLK65 + 2,
1296 VCLK65 + 2 };
1297 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2,
1298 VCLK65 + 2,
1299 VCLK65 + 2,
1300 VCLK65 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001301
1302 unsigned short CRT2Index, VCLKIndex;
1303 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001304
1305 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001306 /* si+St_ResInfo */
1307 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001308 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1309 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1310 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001311 /* si+Ext_ResInfo */
1312 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001313 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001314 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1315 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001316 }
1317
1318 if (pVBInfo->IF_DEF_LVDS == 0) {
1319 CRT2Index = CRT2Index >> 6; /* for LCD */
1320 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1321 if (pVBInfo->LCDResInfo != Panel1024x768)
1322 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1323 else
1324 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1325 } else { /* for TV */
1326 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1327 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1328 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1329 VCLKIndex = HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001330 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001331 } else {
1332 VCLKIndex = HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001333 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001334 }
1335
1336 if (pVBInfo->SetFlag & TVSimuMode) {
1337 if (modeflag & Charx8Dot) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001338 VCLKIndex =
1339 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001340 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001341 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001342 VCLKIndex =
1343 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001344 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001345 }
1346 }
1347
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001348 /* 301lv */
1349 if (pVBInfo->VBType & VB_XGI301LV) {
1350 if (!(pVBInfo->VBExtInfo ==
1351 VB_YPbPr1080i)) {
1352 VCLKIndex =
1353 YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001354 if (!(pVBInfo->VBExtInfo
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001355 ==
1356 VB_YPbPr750p)) {
1357 VCLKIndex =
1358 YPbPr525pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001359 if (!(pVBInfo->VBExtInfo
1360 == VB_YPbPr525p)) {
1361 VCLKIndex
1362 = YPbPr525iVCLK_2;
1363 if (!(pVBInfo->SetFlag
1364 & RPLLDIV2XO))
1365 VCLKIndex
1366 = YPbPr525iVCLK;
1367 }
1368 }
1369 }
1370 }
1371 } else {
1372 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001373 if (pVBInfo->SetFlag &
1374 RPLLDIV2XO) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001375 VCLKIndex = TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001376 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001377 } else {
1378 VCLKIndex = TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001379 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001380 }
1381 }
1382 }
1383 } else { /* for CRT2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001384 /* Port 3cch */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001385 VCLKIndex = (unsigned char) inb(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001386 (pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001387 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1388 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001389 /* di+Ext_CRTVCLK */
1390 VCLKIndex =
1391 pVBInfo->RefIndex[
1392 RefreshRateTableIndex].
1393 Ext_CRTVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001394 VCLKIndex &= IndexMask;
1395 }
1396 }
1397 }
1398 } else { /* LVDS */
1399 if (ModeNo <= 0x13)
1400 VCLKIndex = CRT2Index;
1401 else
1402 VCLKIndex = CRT2Index;
1403
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001404 VCLKIndex = VCLKIndex >> 6;
1405 if ((pVBInfo->LCDResInfo == Panel800x600) ||
1406 (pVBInfo->LCDResInfo == Panel320x480))
1407 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
1408 else if ((pVBInfo->LCDResInfo == Panel1024x768) ||
1409 (pVBInfo->LCDResInfo == Panel1024x768x75))
1410 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1411 else
1412 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001413 }
1414 /* VCLKIndex = VCLKIndex&IndexMask; */
1415
1416 return VCLKIndex;
1417}
1418
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001419static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1420 unsigned short ModeIdIndex,
1421 struct xgi_hw_device_info *HwDeviceExtension,
1422 unsigned short RefreshRateTableIndex,
1423 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001424{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001425 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301426 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001427
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301428 if (pVBInfo->IF_DEF_LVDS == 1) {
1429 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001430 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001431 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1432 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301433 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001434 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301435 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001436 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301437 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1438 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1439 & SetCRT2ToLCDA)) {
1440 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1441 RefreshRateTableIndex, HwDeviceExtension,
1442 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001443 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001444 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301445 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001446 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301447 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001448 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1449 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301450 } else {
1451 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001452 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001453 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1454 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301455 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001456 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301457 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001458 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301459 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301461 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001462 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1463 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001464 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001465 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001466 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301467 index = data;
1468 index &= 0xE0;
1469 data &= 0x1F;
1470 data = data << 1;
1471 data += 1;
1472 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001473 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301474 }
1475 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001476}
1477
Aaro Koskinene85f2032011-11-27 23:03:07 +02001478static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1479{
1480 unsigned char temp;
1481
1482 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1483 temp = (temp & 1) << 6;
1484 /* SR06[6] 18bit Dither */
1485 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1486 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1487 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1488
1489}
1490
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001491static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301492 struct xgi_hw_device_info *HwDeviceExtension,
1493 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001494{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301495 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001496
Aaro Koskinen58839b02011-03-13 12:26:23 +02001497 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301498 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001499 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301501 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001502 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001503 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301504 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001505 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001506 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301507 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001508 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301509 } else {
1510 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001511 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001512 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301513 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001514 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301515 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001516 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001517 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301518 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001519 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301520 }
1521 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001522
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301523 if (HwDeviceExtension->jChipType == XG21)
1524 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001525}
1526
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001527static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1528 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1529 struct vb_device_info *pVBInfo)
1530{
1531 unsigned short data, data2 = 0;
1532 short VCLK;
1533
1534 unsigned char index;
1535
1536 if (ModeNo <= 0x13)
1537 VCLK = 0;
1538 else {
1539 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1540 index &= IndexMask;
1541 VCLK = pVBInfo->VCLKData[index].CLOCK;
1542 }
1543
Aaro Koskinen58839b02011-03-13 12:26:23 +02001544 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001545 data &= 0xf3;
1546 if (VCLK >= 200)
1547 data |= 0x0c; /* VCLK > 200 */
1548
1549 if (HwDeviceExtension->jChipType >= XG20)
1550 data &= ~0x04; /* 2 pixel mode */
1551
Aaro Koskinen8104e322011-03-13 12:26:22 +02001552 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001553
1554 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001555 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001556 data &= 0xE7;
1557 if (VCLK < 200)
1558 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001559 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001560 }
1561
1562 /* Jong for Adavantech LCD ripple issue
1563 if ((VCLK >= 0) && (VCLK < 135))
1564 data2 = 0x03;
1565 else if ((VCLK >= 135) && (VCLK < 160))
1566 data2 = 0x02;
1567 else if ((VCLK >= 160) && (VCLK < 260))
1568 data2 = 0x01;
1569 else if (VCLK > 260)
1570 data2 = 0x00;
1571 */
1572 data2 = 0x00;
1573
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001574 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001575 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001576 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001577
1578}
1579
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001580static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301581 unsigned short ModeNo, unsigned short ModeIdIndex,
1582 unsigned short RefreshRateTableIndex,
1583 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001584{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301585 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1586 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301588 if (ModeNo > 0x13) {
1589 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001590 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1591 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301592 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001593 /* si+St_ModeFlag */
1594 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001595
Aaro Koskinen58839b02011-03-13 12:26:23 +02001596 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001597 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001598
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301599 if (ModeNo > 0x13)
1600 data = infoflag;
1601 else
1602 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301604 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301606 if (ModeNo > 0x13) {
1607 if (pVBInfo->ModeType > 0x02) {
1608 data2 |= 0x02;
1609 data3 = pVBInfo->ModeType - ModeVGA;
1610 data3 = data3 << 2;
1611 data2 |= data3;
1612 }
1613 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301615 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001616
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301617 if (data)
1618 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001619
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001620 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001621 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301622 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1623 if (ModeNo <= 0x13)
1624 xres = pVBInfo->StResInfo[resindex].HTotal;
1625 else
1626 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301628 data = 0x0000;
1629 if (infoflag & InterlaceMode) {
1630 if (xres == 1024)
1631 data = 0x0035;
1632 else if (xres == 1280)
1633 data = 0x0048;
1634 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301636 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001637 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301638 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001639 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301641 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001642 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301644 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301646 if (modeflag & LineCompareOff)
1647 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301649 if (ModeNo > 0x13) {
1650 if (pVBInfo->ModeType == ModeEGA)
1651 data2 |= 0x40;
1652 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001653
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001654 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301655 data = 0x60;
1656 if (pVBInfo->ModeType != ModeText) {
1657 data = data ^ 0x60;
1658 if (pVBInfo->ModeType != ModeEGA)
1659 data = data ^ 0xA0;
1660 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001661 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001662
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301663 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1664 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301666 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1667 /* if (XGINew_IF_DEF_NEW_LOWRES) */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001668 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex);
1669 * //030305 fix lowresolution bug */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001670
Aaro Koskinen58839b02011-03-13 12:26:23 +02001671 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001672
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301673 if (HwDeviceExtension->jChipType == XG27) {
1674 if (data & 0x40)
1675 data = 0x2c;
1676 else
1677 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001678 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001679 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301680 } else if (HwDeviceExtension->jChipType >= XG20) {
1681 if (data & 0x40)
1682 data = 0x33;
1683 else
1684 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001685 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1686 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301687 } else {
1688 if (data & 0x40)
1689 data = 0x2c;
1690 else
1691 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001692 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001694
1695}
1696
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001697static void XGI_WriteDAC(unsigned short dl,
1698 unsigned short ah,
1699 unsigned short al,
1700 unsigned short dh,
1701 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001702{
1703 unsigned short temp, bh, bl;
1704
1705 bh = ah;
1706 bl = al;
1707
1708 if (dl != 0) {
1709 temp = bh;
1710 bh = dh;
1711 dh = temp;
1712 if (dl == 1) {
1713 temp = bl;
1714 bl = dh;
1715 dh = temp;
1716 } else {
1717 temp = bl;
1718 bl = bh;
1719 bh = temp;
1720 }
1721 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001722 outb((unsigned short) dh, pVBInfo->P3c9);
1723 outb((unsigned short) bh, pVBInfo->P3c9);
1724 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001725}
1726
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001727static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301728 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001729{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301730 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
Aaro Koskinen624554d2011-10-11 21:47:35 +03001731 ah, dh;
1732 const unsigned short *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301734 if (ModeNo <= 0x13)
1735 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1736 else
1737 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301739 data &= DACInfoFlag;
1740 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301742 if (data == 0x00)
1743 table = XGINew_MDA_DAC;
1744 else if (data == 0x08)
1745 table = XGINew_CGA_DAC;
1746 else if (data == 0x10)
1747 table = XGINew_EGA_DAC;
1748 else if (data == 0x18) {
1749 time = 256;
1750 table = XGINew_VGA_DAC;
1751 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301753 if (time == 256)
1754 j = 16;
1755 else
1756 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001757
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001758 outb(0xFF, pVBInfo->P3c6);
1759 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001760
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301761 for (i = 0; i < j; i++) {
1762 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301764 for (k = 0; k < 3; k++) {
1765 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301767 if (data & 0x01)
1768 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301770 if (data & 0x02)
1771 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001772
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001773 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301774 data = data >> 2;
1775 }
1776 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301778 if (time == 256) {
1779 for (i = 16; i < 32; i++) {
1780 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301782 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001783 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301784 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301786 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301788 for (m = 0; m < 9; m++) {
1789 di = si;
1790 bx = si + 0x04;
1791 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301793 for (n = 0; n < 3; n++) {
1794 for (o = 0; o < 5; o++) {
1795 dh = table[si];
1796 ah = table[di];
1797 al = table[bx];
1798 si++;
1799 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1800 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301802 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301804 for (o = 0; o < 3; o++) {
1805 dh = table[bx];
1806 ah = table[di];
1807 al = table[si];
1808 si--;
1809 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1810 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001811
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301812 dl++;
1813 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301815 si += 5;
1816 }
1817 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001818}
1819
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001820static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1821 unsigned short ModeIdIndex,
1822 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001823{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301824 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301826 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001827 /* si+St_ResInfo */
1828 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301829 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001830 /* si+Ext_ResInfo */
1831 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301833 /* if (ModeNo > 0x13) */
1834 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1835 /* else */
1836 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301838 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001839 /* si+St_ResInfo */
1840 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301841 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001842 /* si+Ext_ResInfo */
1843 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301845 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301847 if (ModeNo <= 0x13) {
1848 xres = pVBInfo->StResInfo[resindex].HTotal;
1849 yres = pVBInfo->StResInfo[resindex].VTotal;
1850 } else {
1851 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1852 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1853 }
1854 if (ModeNo > 0x13) {
1855 if (modeflag & HalfDCLK)
1856 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301858 if (modeflag & DoubleScanMode)
1859 yres = yres << 1;
1860 }
1861 /* if (modeflag & Charx8Dot) */
1862 /* { */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301864 if (xres == 720)
1865 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301867 /* } */
1868 pVBInfo->VGAHDE = xres;
1869 pVBInfo->HDE = xres;
1870 pVBInfo->VGAVDE = yres;
1871 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001872}
1873
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001874static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1875 unsigned short ModeIdIndex,
1876 unsigned short RefreshRateTableIndex,
1877 struct vb_device_info *pVBInfo)
1878{
1879 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1880
1881 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1882
1883 tempbx = BX;
1884
1885 if (ModeNo <= 0x13) {
1886 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1887 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1888 } else {
1889 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1890 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1891 }
1892
1893 tempal = tempal & 0x0f;
1894
1895 if (tempbx <= 1) { /* ExpLink */
1896 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001897 /* find no Ext_CRT2CRTC2 */
1898 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001899 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001900 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1901 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001902 }
1903
1904 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
1905 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001906 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1907 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001908 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001909 tempal = pVBInfo->RefIndex[
1910 RefreshRateTableIndex].
1911 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001912 }
1913
1914 if (tempbx & 0x01)
1915 tempal = (tempal >> 4);
1916
1917 tempal = (tempal & 0x0f);
1918 }
1919
1920 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
1921
1922 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1923 if ((tempbx == 5) || (tempbx) == 7)
1924 tempcx = LCDDesDataLen2;
1925 else if ((tempbx == 3) || (tempbx == 8))
1926 tempcx = LVDSDesDataLen2;
1927 }
1928 /* mov di, word ptr cs:LCDDataList[bx] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001929 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] |
1930 (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001931
1932 switch (tempbx) {
1933 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001934 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001935 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001936 break;
1937 case 2:
1938 tempdi = XGI_EPLLCDDataPtr;
1939 break;
1940 case 3:
1941 tempdi = XGI_EPLLCDDesDataPtr;
1942 break;
1943 case 4:
1944 tempdi = XGI_LCDDataTable;
1945 break;
1946 case 5:
1947 tempdi = XGI_LCDDesDataTable;
1948 break;
1949 case 6:
1950 tempdi = XGI_EPLCHLCDRegPtr;
1951 break;
1952 case 7:
1953 case 8:
1954 case 9:
1955 tempdi = NULL;
1956 break;
1957 default:
1958 break;
1959 }
1960
1961 if (tempdi == NULL) /* OEMUtil */
1962 return NULL;
1963
1964 table = tempbx;
1965 i = 0;
1966
1967 while (tempdi[i].PANELID != 0xff) {
1968 tempdx = pVBInfo->LCDResInfo;
1969 if (tempbx & 0x0080) { /* OEMUtil */
1970 tempbx &= (~0x0080);
1971 tempdx = pVBInfo->LCDTypeInfo;
1972 }
1973
1974 if (pVBInfo->LCDInfo & EnableScalingLCD)
1975 tempdx &= (~PanelResInfo);
1976
1977 if (tempdi[i].PANELID == tempdx) {
1978 tempbx = tempdi[i].MASK;
1979 tempdx = pVBInfo->LCDInfo;
1980
1981 if (ModeNo <= 0x13) /* alan 09/10/2003 */
1982 tempdx |= SetLCDStdMode;
1983
1984 if (modeflag & HalfDCLK)
1985 tempdx |= SetLCDLowResolution;
1986
1987 tempbx &= tempdx;
1988 if (tempbx == tempdi[i].CAP)
1989 break;
1990 }
1991 i++;
1992 }
1993
1994 if (table == 0) {
1995 switch (tempdi[i].DATAPTR) {
1996 case 0:
1997 return &XGI_LVDSCRT11024x768_1_H[tempal];
1998 break;
1999 case 1:
2000 return &XGI_LVDSCRT11024x768_2_H[tempal];
2001 break;
2002 case 2:
2003 return &XGI_LVDSCRT11280x1024_1_H[tempal];
2004 break;
2005 case 3:
2006 return &XGI_LVDSCRT11280x1024_2_H[tempal];
2007 break;
2008 case 4:
2009 return &XGI_LVDSCRT11400x1050_1_H[tempal];
2010 break;
2011 case 5:
2012 return &XGI_LVDSCRT11400x1050_2_H[tempal];
2013 break;
2014 case 6:
2015 return &XGI_LVDSCRT11600x1200_1_H[tempal];
2016 break;
2017 case 7:
2018 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
2019 break;
2020 case 8:
2021 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
2022 break;
2023 case 9:
2024 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
2025 break;
2026 case 10:
2027 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
2028 break;
2029 default:
2030 break;
2031 }
2032 } else if (table == 1) {
2033 switch (tempdi[i].DATAPTR) {
2034 case 0:
2035 return &XGI_LVDSCRT11024x768_1_V[tempal];
2036 break;
2037 case 1:
2038 return &XGI_LVDSCRT11024x768_2_V[tempal];
2039 break;
2040 case 2:
2041 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2042 break;
2043 case 3:
2044 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2045 break;
2046 case 4:
2047 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2048 break;
2049 case 5:
2050 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2051 break;
2052 case 6:
2053 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2054 break;
2055 case 7:
2056 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2057 break;
2058 case 8:
2059 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2060 break;
2061 case 9:
2062 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2063 break;
2064 case 10:
2065 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2066 break;
2067 default:
2068 break;
2069 }
2070 } else if (table == 2) {
2071 switch (tempdi[i].DATAPTR) {
2072 case 0:
2073 return &XGI_LVDS1024x768Data_1[tempal];
2074 break;
2075 case 1:
2076 return &XGI_LVDS1024x768Data_2[tempal];
2077 break;
2078 case 2:
2079 return &XGI_LVDS1280x1024Data_1[tempal];
2080 break;
2081 case 3:
2082 return &XGI_LVDS1280x1024Data_2[tempal];
2083 break;
2084 case 4:
2085 return &XGI_LVDS1400x1050Data_1[tempal];
2086 break;
2087 case 5:
2088 return &XGI_LVDS1400x1050Data_2[tempal];
2089 break;
2090 case 6:
2091 return &XGI_LVDS1600x1200Data_1[tempal];
2092 break;
2093 case 7:
2094 return &XGI_LVDSNoScalingData[tempal];
2095 break;
2096 case 8:
2097 return &XGI_LVDS1024x768Data_1x75[tempal];
2098 break;
2099 case 9:
2100 return &XGI_LVDS1024x768Data_2x75[tempal];
2101 break;
2102 case 10:
2103 return &XGI_LVDS1280x1024Data_1x75[tempal];
2104 break;
2105 case 11:
2106 return &XGI_LVDS1280x1024Data_2x75[tempal];
2107 break;
2108 case 12:
2109 return &XGI_LVDSNoScalingDatax75[tempal];
2110 break;
2111 default:
2112 break;
2113 }
2114 } else if (table == 3) {
2115 switch (tempdi[i].DATAPTR) {
2116 case 0:
2117 return &XGI_LVDS1024x768Des_1[tempal];
2118 break;
2119 case 1:
2120 return &XGI_LVDS1024x768Des_3[tempal];
2121 break;
2122 case 2:
2123 return &XGI_LVDS1024x768Des_2[tempal];
2124 break;
2125 case 3:
2126 return &XGI_LVDS1280x1024Des_1[tempal];
2127 break;
2128 case 4:
2129 return &XGI_LVDS1280x1024Des_2[tempal];
2130 break;
2131 case 5:
2132 return &XGI_LVDS1400x1050Des_1[tempal];
2133 break;
2134 case 6:
2135 return &XGI_LVDS1400x1050Des_2[tempal];
2136 break;
2137 case 7:
2138 return &XGI_LVDS1600x1200Des_1[tempal];
2139 break;
2140 case 8:
2141 return &XGI_LVDSNoScalingDesData[tempal];
2142 break;
2143 case 9:
2144 return &XGI_LVDS1024x768Des_1x75[tempal];
2145 break;
2146 case 10:
2147 return &XGI_LVDS1024x768Des_3x75[tempal];
2148 break;
2149 case 11:
2150 return &XGI_LVDS1024x768Des_2x75[tempal];
2151 break;
2152 case 12:
2153 return &XGI_LVDS1280x1024Des_1x75[tempal];
2154 break;
2155 case 13:
2156 return &XGI_LVDS1280x1024Des_2x75[tempal];
2157 break;
2158 case 14:
2159 return &XGI_LVDSNoScalingDesDatax75[tempal];
2160 break;
2161 default:
2162 break;
2163 }
2164 } else if (table == 4) {
2165 switch (tempdi[i].DATAPTR) {
2166 case 0:
2167 return &XGI_ExtLCD1024x768Data[tempal];
2168 break;
2169 case 1:
2170 return &XGI_StLCD1024x768Data[tempal];
2171 break;
2172 case 2:
2173 return &XGI_CetLCD1024x768Data[tempal];
2174 break;
2175 case 3:
2176 return &XGI_ExtLCD1280x1024Data[tempal];
2177 break;
2178 case 4:
2179 return &XGI_StLCD1280x1024Data[tempal];
2180 break;
2181 case 5:
2182 return &XGI_CetLCD1280x1024Data[tempal];
2183 break;
2184 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002185 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002186 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002187 break;
2188 case 8:
2189 return &XGI_CetLCD1400x1050Data[tempal];
2190 break;
2191 case 9:
2192 return &XGI_ExtLCD1600x1200Data[tempal];
2193 break;
2194 case 10:
2195 return &XGI_StLCD1600x1200Data[tempal];
2196 break;
2197 case 11:
2198 return &XGI_NoScalingData[tempal];
2199 break;
2200 case 12:
2201 return &XGI_ExtLCD1024x768x75Data[tempal];
2202 break;
2203 case 13:
2204 return &XGI_ExtLCD1024x768x75Data[tempal];
2205 break;
2206 case 14:
2207 return &XGI_CetLCD1024x768x75Data[tempal];
2208 break;
2209 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002210 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002211 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002212 break;
2213 case 17:
2214 return &XGI_CetLCD1280x1024x75Data[tempal];
2215 break;
2216 case 18:
2217 return &XGI_NoScalingDatax75[tempal];
2218 break;
2219 default:
2220 break;
2221 }
2222 } else if (table == 5) {
2223 switch (tempdi[i].DATAPTR) {
2224 case 0:
2225 return &XGI_ExtLCDDes1024x768Data[tempal];
2226 break;
2227 case 1:
2228 return &XGI_StLCDDes1024x768Data[tempal];
2229 break;
2230 case 2:
2231 return &XGI_CetLCDDes1024x768Data[tempal];
2232 break;
2233 case 3:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002234 if ((pVBInfo->VBType & VB_XGI301LV) ||
2235 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002236 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2237 else
2238 return &XGI_ExtLCDDes1280x1024Data[tempal];
2239 break;
2240 case 4:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002241 if ((pVBInfo->VBType & VB_XGI301LV) ||
2242 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002243 return &XGI_StLCDDLDes1280x1024Data[tempal];
2244 else
2245 return &XGI_StLCDDes1280x1024Data[tempal];
2246 break;
2247 case 5:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002248 if ((pVBInfo->VBType & VB_XGI301LV) ||
2249 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002250 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2251 else
2252 return &XGI_CetLCDDes1280x1024Data[tempal];
2253 break;
2254 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002255 case 7:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002256 if ((pVBInfo->VBType & VB_XGI301LV) ||
2257 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002258 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002259 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002260 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002261 break;
2262 case 8:
2263 return &XGI_CetLCDDes1400x1050Data[tempal];
2264 break;
2265 case 9:
2266 return &XGI_CetLCDDes1400x1050Data2[tempal];
2267 break;
2268 case 10:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002269 if ((pVBInfo->VBType & VB_XGI301LV) ||
2270 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002271 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2272 else
2273 return &XGI_ExtLCDDes1600x1200Data[tempal];
2274 break;
2275 case 11:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002276 if ((pVBInfo->VBType & VB_XGI301LV) ||
2277 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002278 return &XGI_StLCDDLDes1600x1200Data[tempal];
2279 else
2280 return &XGI_StLCDDes1600x1200Data[tempal];
2281 break;
2282 case 12:
2283 return &XGI_NoScalingDesData[tempal];
2284 break;
2285 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002286 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002287 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002288 break;
2289 case 15:
2290 return &XGI_CetLCDDes1024x768x75Data[tempal];
2291 break;
2292 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002293 case 17:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002294 if ((pVBInfo->VBType & VB_XGI301LV) ||
2295 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002296 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002297 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03002298 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002299 break;
2300 case 18:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002301 if ((pVBInfo->VBType & VB_XGI301LV) ||
2302 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002303 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2304 else
2305 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2306 break;
2307 case 19:
2308 return &XGI_NoScalingDesDatax75[tempal];
2309 break;
2310 default:
2311 break;
2312 }
2313 } else if (table == 6) {
2314 switch (tempdi[i].DATAPTR) {
2315 case 0:
2316 return &XGI_CH7017LV1024x768[tempal];
2317 break;
2318 case 1:
2319 return &XGI_CH7017LV1400x1050[tempal];
2320 break;
2321 default:
2322 break;
2323 }
2324 }
2325 return NULL;
2326}
2327
2328static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2329 unsigned short ModeIdIndex,
2330 unsigned short RefreshRateTableIndex,
2331 struct vb_device_info *pVBInfo)
2332{
2333 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2334 struct XGI330_TVDataTablStruct *tempdi = NULL;
2335
2336 tempbx = BX;
2337
2338 if (ModeNo <= 0x13) {
2339 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2340 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2341 } else {
2342 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2343 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2344 }
2345
2346 tempal = tempal & 0x3f;
2347 table = tempbx;
2348
2349 switch (tempbx) {
2350 case 0:
2351 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002352 break;
2353 case 1:
2354 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002355 break;
2356 case 2:
Aaro Koskinen0c23b6d2011-08-31 21:46:09 +03002357 case 6:
2358 tempdi = xgifb_chrontel_tv;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002359 break;
2360 case 3:
2361 tempdi = NULL;
2362 break;
2363 case 4:
2364 tempdi = XGI_TVDataTable;
2365 break;
2366 case 5:
2367 tempdi = NULL;
2368 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002369 default:
2370 break;
2371 }
2372
2373 if (tempdi == NULL) /* OEMUtil */
2374 return NULL;
2375
2376 tempdx = pVBInfo->TVInfo;
2377
2378 if (pVBInfo->VBInfo & SetInSlaveMode)
2379 tempdx = tempdx | SetTVLockMode;
2380
2381 if (modeflag & HalfDCLK)
2382 tempdx = tempdx | SetTVLowResolution;
2383
2384 i = 0;
2385
2386 while (tempdi[i].MASK != 0xffff) {
2387 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2388 break;
2389 i++;
2390 }
2391
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002392 /* 07/05/22 */
2393 if (table == 0x00) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002394 } else if (table == 0x01) {
2395 } else if (table == 0x04) {
2396 switch (tempdi[i].DATAPTR) {
2397 case 0:
2398 return &XGI_ExtPALData[tempal];
2399 break;
2400 case 1:
2401 return &XGI_ExtNTSCData[tempal];
2402 break;
2403 case 2:
2404 return &XGI_StPALData[tempal];
2405 break;
2406 case 3:
2407 return &XGI_StNTSCData[tempal];
2408 break;
2409 case 4:
2410 return &XGI_ExtHiTVData[tempal];
2411 break;
2412 case 5:
2413 return &XGI_St2HiTVData[tempal];
2414 break;
2415 case 6:
2416 return &XGI_ExtYPbPr525iData[tempal];
2417 break;
2418 case 7:
2419 return &XGI_ExtYPbPr525pData[tempal];
2420 break;
2421 case 8:
2422 return &XGI_ExtYPbPr750pData[tempal];
2423 break;
2424 case 9:
2425 return &XGI_StYPbPr525iData[tempal];
2426 break;
2427 case 10:
2428 return &XGI_StYPbPr525pData[tempal];
2429 break;
2430 case 11:
2431 return &XGI_StYPbPr750pData[tempal];
2432 break;
2433 case 12: /* avoid system hang */
2434 return &XGI_ExtNTSCData[tempal];
2435 break;
2436 case 13:
2437 return &XGI_St1HiTVData[tempal];
2438 break;
2439 default:
2440 break;
2441 }
2442 } else if (table == 0x02) {
2443 switch (tempdi[i].DATAPTR) {
2444 case 0:
2445 return &XGI_CHTVUNTSCData[tempal];
2446 break;
2447 case 1:
2448 return &XGI_CHTVONTSCData[tempal];
2449 break;
2450 case 2:
2451 return &XGI_CHTVUPALData[tempal];
2452 break;
2453 case 3:
2454 return &XGI_CHTVOPALData[tempal];
2455 break;
2456 default:
2457 break;
2458 }
2459 } else if (table == 0x06) {
2460 }
2461 return NULL;
2462}
2463
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002464static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302465 unsigned short RefreshRateTableIndex,
2466 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002467{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302468 unsigned short tempbx;
2469 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002470
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302471 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002472
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302473 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2474 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2475 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2476 pVBInfo);
2477 pVBInfo->VGAHT = LCDPtr->VGAHT;
2478 pVBInfo->VGAVT = LCDPtr->VGAVT;
2479 pVBInfo->HT = LCDPtr->LCDHT;
2480 pVBInfo->VT = LCDPtr->LCDVT;
2481 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002482
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302483 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2484 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2485 | EnableScalingLCD))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002486 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2487 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302488 pVBInfo->HDE = 1024;
2489 pVBInfo->VDE = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002490 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2491 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302492 pVBInfo->HDE = 1280;
2493 pVBInfo->VDE = 1024;
2494 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2495 pVBInfo->HDE = 1400;
2496 pVBInfo->VDE = 1050;
2497 } else {
2498 pVBInfo->HDE = 1600;
2499 pVBInfo->VDE = 1200;
2500 }
2501 }
2502 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002503}
2504
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002505static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302506 unsigned short RefreshRateTableIndex,
2507 struct xgi_hw_device_info *HwDeviceExtension,
2508 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002509{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302510 unsigned char index;
2511 unsigned short tempbx, i;
2512 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2513 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302515 if (ModeNo <= 0x13)
2516 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2517 else
2518 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302520 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002521
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002522 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002523
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002524 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2525 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2526 XGI_GetLcdPtr(tempbx, ModeNo,
2527 ModeIdIndex,
2528 RefreshRateTableIndex,
2529 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002531 for (i = 0; i < 8; i++)
2532 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302533 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03002534
2535 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
2536
2537 tempbx = 1;
2538
2539 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2540 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2541 XGI_GetLcdPtr(
2542 tempbx,
2543 ModeNo,
2544 ModeIdIndex,
2545 RefreshRateTableIndex,
2546 pVBInfo);
2547 for (i = 0; i < 7; i++)
2548 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2549 }
2550
2551 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002552}
2553
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002554static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2555{
2556 unsigned char tempal, tempah, tempbl, i;
2557
Aaro Koskinen58839b02011-03-13 12:26:23 +02002558 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002559 tempal = tempah & 0x0F;
2560 tempah = tempah & 0xF0;
2561 i = 0;
2562 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2563
2564 while (tempbl != 0xFF) {
2565 if (tempbl & 0x80) { /* OEMUtil */
2566 tempal = tempah;
2567 tempbl = tempbl & ~(0x80);
2568 }
2569
2570 if (tempal == tempbl)
2571 break;
2572
2573 i++;
2574
2575 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2576 }
2577
2578 return i;
2579}
2580
2581static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2582{
2583 unsigned short tempah, tempal, tempbl, i;
2584
2585 tempal = pVBInfo->LCDResInfo;
2586 tempah = pVBInfo->LCDTypeInfo;
2587
2588 i = 0;
2589 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2590
2591 while (tempbl != 0xFF) {
2592 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2593 tempal = tempah;
2594 tempbl &= ~0x80;
2595 }
2596
2597 if (tempal == tempbl)
2598 break;
2599
2600 i++;
2601 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2602 }
2603
2604 if (tempbl == 0xFF) {
2605 pVBInfo->LCDResInfo = Panel1024x768;
2606 pVBInfo->LCDTypeInfo = 0;
2607 i = 0;
2608 }
2609
2610 return i;
2611}
2612
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002613static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2614 unsigned short *VSyncWidth,
2615 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002616{
2617 unsigned short Index;
2618
2619 Index = XGI_GetLCDCapPtr(pVBInfo);
2620 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2621 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2622
2623 return;
2624}
2625
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002626static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302627 unsigned short RefreshRateTableIndex,
2628 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002629{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302630 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2631 unsigned long temp, temp1, temp2, temp3, push3;
2632 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2633 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002634
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302635 if (ModeNo > 0x13)
2636 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2637 else
2638 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002639
Aaro Koskinen66cface2011-08-31 21:46:13 +03002640 tempbx = 3;
2641 if (pVBInfo->LCDInfo & EnableScalingLCD)
2642 LCDPtr1 =
2643 (struct XGI330_LCDDataDesStruct2 *)
2644 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002645 tempbx,
2646 ModeNo,
2647 ModeIdIndex,
2648 RefreshRateTableIndex,
2649 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03002650 else
2651 LCDPtr =
2652 (struct XGI330_LCDDataDesStruct *)
2653 XGI_GetLcdPtr(
2654 tempbx,
2655 ModeNo,
2656 ModeIdIndex,
2657 RefreshRateTableIndex,
2658 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002659
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002660 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2661 push1 = tempbx;
2662 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002663
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002664 /* GetLCDResInfo */
2665 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2666 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
2667 tempax = 1024;
2668 tempbx = 768;
2669 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2670 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
2671 tempax = 1280;
2672 tempbx = 1024;
2673 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2674 tempax = 1400;
2675 tempbx = 1050;
2676 } else {
2677 tempax = 1600;
2678 tempbx = 1200;
2679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002680
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002681 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2682 pVBInfo->HDE = tempax;
2683 pVBInfo->VDE = tempbx;
2684 pVBInfo->VGAHDE = tempax;
2685 pVBInfo->VGAVDE = tempbx;
2686 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002687
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002688 tempax = pVBInfo->HT;
2689
2690 if (pVBInfo->LCDInfo & EnableScalingLCD)
2691 tempbx = LCDPtr1->LCDHDES;
2692 else
2693 tempbx = LCDPtr->LCDHDES;
2694
2695 tempcx = pVBInfo->HDE;
2696 tempbx = tempbx & 0x0fff;
2697 tempcx += tempbx;
2698
2699 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002700 tempcx -= tempax;
2701
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002702 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002703
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002704 tempcx = tempcx >> 3;
2705 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002706
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002707 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2708 (unsigned short) (tempbx & 0xff));
2709 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2710 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002711
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002712 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002713
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002714 if (pVBInfo->LCDInfo & EnableScalingLCD)
2715 tempbx = LCDPtr1->LCDHRS;
2716 else
2717 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002718
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002719 tempcx = push2;
2720
2721 if (pVBInfo->LCDInfo & EnableScalingLCD)
2722 tempcx = LCDPtr1->LCDHSync;
2723
2724 tempcx += tempbx;
2725
2726 if (tempcx >= tempax)
2727 tempcx -= tempax;
2728
2729 tempax = tempbx & 0x07;
2730 tempax = tempax >> 5;
2731 tempcx = tempcx >> 3;
2732 tempbx = tempbx >> 3;
2733
2734 tempcx &= 0x1f;
2735 tempax |= tempcx;
2736
2737 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2738 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2739 (unsigned short) (tempbx & 0xff));
2740
2741 tempax = pVBInfo->VT;
2742 if (pVBInfo->LCDInfo & EnableScalingLCD)
2743 tempbx = LCDPtr1->LCDVDES;
2744 else
2745 tempbx = LCDPtr->LCDVDES;
2746 tempcx = pVBInfo->VDE;
2747
2748 tempbx = tempbx & 0x0fff;
2749 tempcx += tempbx;
2750 if (tempcx >= tempax)
2751 tempcx -= tempax;
2752
2753 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2754 (unsigned short) (tempbx & 0xff));
2755 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2756 (unsigned short) (tempcx & 0xff));
2757
2758 tempbx = (tempbx >> 8) & 0x07;
2759 tempcx = (tempcx >> 8) & 0x07;
2760
2761 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2762 (unsigned short) ((tempcx << 3)
2763 | tempbx));
2764
2765 tempax = pVBInfo->VT;
2766 if (pVBInfo->LCDInfo & EnableScalingLCD)
2767 tempbx = LCDPtr1->LCDVRS;
2768 else
2769 tempbx = LCDPtr->LCDVRS;
2770
2771 /* tempbx = tempbx >> 4; */
2772 tempcx = push1;
2773
2774 if (pVBInfo->LCDInfo & EnableScalingLCD)
2775 tempcx = LCDPtr1->LCDVSync;
2776
2777 tempcx += tempbx;
2778 if (tempcx >= tempax)
2779 tempcx -= tempax;
2780
2781 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2782 (unsigned short) (tempbx & 0xff));
2783 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2784 (unsigned short) (tempcx & 0x0f));
2785
2786 tempax = ((tempbx >> 8) & 0x07) << 3;
2787
2788 tempbx = pVBInfo->VGAVDE;
2789 if (tempbx != pVBInfo->VDE)
2790 tempax |= 0x40;
2791
2792 if (pVBInfo->LCDInfo & EnableLVDSDDA)
2793 tempax |= 0x40;
2794
2795 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2796 tempax);
2797
2798 tempcx = pVBInfo->VGAVT;
2799 tempbx = pVBInfo->VDE;
2800 tempax = pVBInfo->VGAVDE;
2801 tempcx -= tempax;
2802
2803 temp = tempax; /* 0430 ylshieh */
2804 temp1 = (temp << 18) / tempbx;
2805
2806 tempdx = (unsigned short) ((temp << 18) % tempbx);
2807
2808 if (tempdx != 0)
2809 temp1 += 1;
2810
2811 temp2 = temp1;
2812 push3 = temp2;
2813
2814 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2815 (unsigned short) (temp2 & 0xff));
2816 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2817 (unsigned short) ((temp2 >> 8) & 0xff));
2818
2819 tempbx = (unsigned short) (temp2 >> 16);
2820 tempax = tempbx & 0x03;
2821
2822 tempbx = pVBInfo->VGAVDE;
2823 if (tempbx == pVBInfo->VDE)
2824 tempax |= 0x04;
2825
2826 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2827
2828 if (pVBInfo->VBType & VB_XGI301C) {
2829 temp2 = push3;
2830 xgifb_reg_set(pVBInfo->Part4Port,
2831 0x3c,
2832 (unsigned short) (temp2 & 0xff));
2833 xgifb_reg_set(pVBInfo->Part4Port,
2834 0x3b,
2835 (unsigned short) ((temp2 >> 8) &
2836 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002837 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002838 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2839 ~0xc0,
2840 (unsigned short) ((tempbx &
2841 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002842
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002843 tempcx = pVBInfo->VGAVDE;
2844 if (tempcx == pVBInfo->VDE)
2845 xgifb_reg_and_or(pVBInfo->Part4Port,
2846 0x30, ~0x0c, 0x00);
2847 else
2848 xgifb_reg_and_or(pVBInfo->Part4Port,
2849 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302850 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002851
2852 tempcx = pVBInfo->VGAHDE;
2853 tempbx = pVBInfo->HDE;
2854
2855 temp1 = tempcx << 16;
2856
2857 tempax = (unsigned short) (temp1 / tempbx);
2858
2859 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2860 tempax = 65535;
2861
2862 temp3 = tempax;
2863 temp1 = pVBInfo->VGAHDE << 16;
2864
2865 temp1 /= temp3;
2866 temp3 = temp3 << 16;
2867 temp1 -= 1;
2868
2869 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2870
2871 tempax = (unsigned short) (temp3 & 0xff);
2872 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2873
2874 temp1 = pVBInfo->VGAVDE << 18;
2875 temp1 = temp1 / push3;
2876 tempbx = (unsigned short) (temp1 & 0xffff);
2877
2878 if (pVBInfo->LCDResInfo == Panel1024x768)
2879 tempbx -= 1;
2880
2881 tempax = ((tempbx >> 8) & 0xff) << 3;
2882 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2883 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2884 (unsigned short) (tempax & 0xff));
2885 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2886 (unsigned short) (tempbx & 0xff));
2887
2888 temp3 = temp3 >> 16;
2889
2890 if (modeflag & HalfDCLK)
2891 temp3 = temp3 >> 1;
2892
2893 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2894 (unsigned short) ((temp3 >> 8) & 0xff));
2895 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2896 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002897}
2898
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002899/* --------------------------------------------------------------------- */
2900/* Function : XGI_GETLCDVCLKPtr */
2901/* Input : */
2902/* Output : al -> VCLK Index */
2903/* Description : */
2904/* --------------------------------------------------------------------- */
2905static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2906 struct vb_device_info *pVBInfo)
2907{
2908 unsigned short index;
2909
2910 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002911 /* index = XGI_GetLCDCapPtr(pVBInfo); */
2912 index = XGI_GetLCDCapPtr1(pVBInfo);
2913
2914 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2915 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2916 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2917 } else { /* LCDA */
2918 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2919 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2920 }
2921 }
2922 return;
2923}
2924
2925static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2926 unsigned short ModeNo, unsigned short ModeIdIndex,
2927 struct vb_device_info *pVBInfo)
2928{
2929
2930 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002931 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002932
2933 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002934 /* si+St_ResInfo */
2935 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002936 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002937 /* si+Ext_ResInfo */
2938 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002939
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002940 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2941 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002942 index = XGI_GetLCDCapPtr(pVBInfo);
2943 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2944
2945 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
2946 return tempal;
2947
2948 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002949 if (pVBInfo->VBType &
2950 (VB_XGI301B |
2951 VB_XGI302B |
2952 VB_XGI301LV |
2953 VB_XGI302LV |
2954 VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002955 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
2956 tempal = HiTVVCLKDIV2;
2957 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2958 tempal = HiTVVCLK;
2959 if (pVBInfo->TVInfo & TVSimuMode) {
2960 tempal = HiTVSimuVCLK;
2961 if (!(modeflag & Charx8Dot))
2962 tempal = HiTVTextVCLK;
2963
2964 }
2965 return tempal;
2966 }
2967
2968 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
2969 tempal = YPbPr750pVCLK;
2970 return tempal;
2971 }
2972
2973 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
2974 tempal = YPbPr525pVCLK;
2975 return tempal;
2976 }
2977
2978 tempal = NTSC1024VCLK;
2979
2980 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
2981 tempal = TVVCLKDIV2;
2982 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
2983 tempal = TVVCLK;
2984 }
2985
2986 if (pVBInfo->VBInfo & SetCRT2ToTV)
2987 return tempal;
2988 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002989 } /* {End of VB} */
2990
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002991 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002992 tempal = tempal >> 2;
2993 tempal &= 0x03;
2994
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002995 /* for Dot8 Scaling LCD */
2996 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002997 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2998
2999 if (ModeNo <= 0x13)
3000 return tempal;
3001
3002 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
3003 return tempal;
3004}
3005
3006static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
3007 unsigned char *di_1, struct vb_device_info *pVBInfo)
3008{
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003009 if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003010 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
3011 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
3012 & ProgrammingCRT2)) {
3013 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
3014 *di_1 = XGI_VBVCLKData[tempal].SR2C;
3015 }
3016 } else {
3017 *di_0 = XGI_VCLKData[tempal].SR2B;
3018 *di_1 = XGI_VCLKData[tempal].SR2C;
3019 }
3020}
3021
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003022static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303023 unsigned short RefreshRateTableIndex,
3024 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003025{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303026 unsigned char di_0, di_1, tempal;
3027 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303029 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3030 pVBInfo);
3031 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3032 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003033
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303034 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003035 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303036 (unsigned short) (0x10 * i));
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003037 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303038 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003039 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3040 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303041 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003042 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3043 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303044 }
3045 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003046}
3047
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003048static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303049 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003050{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303051 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003052
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303053 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3054 | VB_XGI302LV | VB_XGI301C)) {
3055 tempcl = 0;
3056 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003057 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303059 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003060 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303061 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003062 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303063 if (!(temp & 0x40))
3064 tempcl |= ActiveCRT1;
3065 }
3066 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003067
Aaro Koskinen58839b02011-03-13 12:26:23 +02003068 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303069 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003070
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303071 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003072 /* Check ChannelA by Part1_13 [2003/10/03] */
3073 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303074 if (tempax & 0x04)
3075 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003076
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303077 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003078
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303079 if (!(tempcl & ActiveLCD))
3080 if (temp == 0x01)
3081 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303083 if (temp == 0x04)
3084 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303086 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003087 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 if (!(temp & 0x08))
3090 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303092 if (!(temp & 0x04))
3093 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303095 if (temp & 0x02)
3096 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003097
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303098 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3099 if (temp & 0x01)
3100 tempch |= ActiveHiTV;
3101 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003102
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303103 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003104 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303105 pVBInfo->Part2Port,
3106 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303108 if (temp & 0x10)
3109 tempch |= ActiveYPbPr;
3110 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303112 if (tempch != 0)
3113 tempcl |= ActiveTV;
3114 }
3115 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003116
Aaro Koskinen58839b02011-03-13 12:26:23 +02003117 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303118 if (tempcl & ActiveLCD) {
3119 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3120 if (temp & ActiveTV)
3121 tempcl |= ActiveTV;
3122 }
3123 }
3124 temp = tempcl;
3125 tempbl = ~ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003126 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303128 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003129 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303130 } else {
3131 return;
3132 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003133}
3134
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303135void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3136 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003137{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303138 /*
3139 if ( HwDeviceExtension->jChipType >= XG20 ) {
3140 pVBInfo->Set_VGAType = XG20;
Aaro Koskinen06587332011-03-13 12:26:10 +02003141 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303142 pVBInfo->Set_VGAType = VGA_XGI340;
3143 }
3144 */
3145 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003146}
3147
Bill Pemberton80adad82010-06-17 13:10:51 -04003148void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003149{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303150 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 if (pVBInfo->IF_DEF_LVDS == 0) {
3153 tempbx = VB_XGI302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003154 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303155 if (flag != 0x02) {
3156 tempbx = VB_XGI301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003157 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303158 if (flag >= 0xB0) {
3159 tempbx = VB_XGI301B;
3160 if (flag >= 0xC0) {
3161 tempbx = VB_XGI301C;
3162 if (flag >= 0xD0) {
3163 tempbx = VB_XGI301LV;
3164 if (flag >= 0xE0) {
3165 tempbx = VB_XGI302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003166 tempah = xgifb_reg_get(
3167 pVBInfo->Part4Port,
3168 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303169 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003170 tempbx =
3171 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303172 }
3173 }
3174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003177 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303178 pVBInfo->Part4Port,
3179 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303181 if (!(flag & 0x02))
3182 tempbx = tempbx | VB_NoLCD;
3183 }
3184 }
3185 }
3186 pVBInfo->VBType = tempbx;
3187 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003188}
3189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303190void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3191 struct xgi_hw_device_info *HwDeviceExtension,
3192 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003193{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303194 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003195
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303196 if (ModeNo <= 0x13)
3197 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3198 else
3199 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003200
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303201 pVBInfo->SetFlag = 0;
3202 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3203 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003204
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303205 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003206 /* Check Display Device */
3207 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303208 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003209 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303210 push = temp;
3211 push = push << 8;
3212 tempax = temp << 8;
3213 tempbx = tempbx | tempax;
3214 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3215 | SetInSlaveMode | DisableCRT2Display);
3216 temp = 0xFFFF ^ temp;
3217 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003218
Aaro Koskinen58839b02011-03-13 12:26:23 +02003219 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003220
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303221 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303223 if ((pVBInfo->Set_VGAType >= XG20)
3224 || (pVBInfo->Set_VGAType >= XG40)) {
3225 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003226 /* if ((pVBInfo->VBType & VB_XGI302B)
3227 || (pVBInfo->VBType & VB_XGI301LV)
3228 || (pVBInfo->VBType & VB_XGI302LV)
3229 || (pVBInfo->VBType & VB_XGI301C))
3230 */
3231 if (pVBInfo->VBType &
3232 (VB_XGI302B |
3233 VB_XGI301LV |
3234 VB_XGI302LV |
3235 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303236 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003237 tempbx |=
3238 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303240 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003241 tempbx |=
3242 SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303243 }
3244 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 }
3246 }
3247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003248
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303249 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003250 /* [Billy] 07/05/04 */
3251 if (((pVBInfo->IF_DEF_LVDS == 0) &&
3252 ((pVBInfo->VBType & VB_XGI301LV) ||
3253 (pVBInfo->VBType & VB_XGI302LV) ||
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003254 (pVBInfo->VBType & VB_XGI301C)))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303255 if (temp & SetYPbPr) { /* temp = CR38 */
3256 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003257 /* shampoo add for new
3258 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003259 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303260 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003261 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303262 temp &= YPbPrMode;
3263 tempbx |= SetCRT2ToHiVisionTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303265 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003266 tempbx &=
3267 (~SetCRT2ToHiVisionTV);
3268 tempbx |=
3269 SetCRT2ToYPbPr;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303270 }
3271 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003272
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303273 /* tempbx |= SetCRT2ToYPbPr; */
3274 }
3275 }
3276 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303278 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303280 if (pVBInfo->IF_DEF_LVDS == 0) {
3281 if (pVBInfo->IF_DEF_YPbPr == 1) {
3282 if (pVBInfo->IF_DEF_HiVision == 1)
3283 temp = 0x09FC;
3284 else
3285 temp = 0x097C;
3286 } else {
3287 if (pVBInfo->IF_DEF_HiVision == 1)
3288 temp = 0x01FC;
3289 else
3290 temp = 0x017C;
3291 }
3292 } else { /* 3nd party chip */
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003293 temp = SetCRT2ToLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303294 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003295
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303296 if (!(tempbx & temp)) {
3297 tempax |= DisableCRT2Display;
3298 tempbx = 0;
3299 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303301 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3302 if (!(pVBInfo->VBType & VB_NoLCD)) {
3303 if (tempbx & SetCRT2ToLCDA) {
3304 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003305 tempbx &= (~(SetCRT2ToLCD |
3306 SetCRT2ToRAMDAC |
3307 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303308 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003309 tempbx &= (~(SetCRT2ToLCD |
3310 SetCRT2ToRAMDAC |
3311 SetCRT2ToTV |
3312 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 }
3314 }
3315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003316
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303317 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003318 /* for driver abnormal */
3319 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303320 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3321 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003322 tempbx &= (0xFF00 |
3323 SetCRT2ToRAMDAC |
3324 SwitchToCRT2 |
3325 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303326 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3327 }
3328 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003329 tempbx &= (~(SetCRT2ToRAMDAC |
3330 SetCRT2ToLCD |
3331 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303332 }
3333 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303335 if (!(pVBInfo->VBType & VB_NoLCD)) {
3336 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003337 tempbx &= (0xFF00 |
3338 SetCRT2ToLCD |
3339 SwitchToCRT2 |
3340 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303341 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3342 }
3343 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303345 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003346 tempbx &= (0xFF00 |
3347 SetCRT2ToSCART |
3348 SwitchToCRT2 |
3349 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3351 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303353 if (pVBInfo->IF_DEF_YPbPr == 1) {
3354 if (tempbx & SetCRT2ToYPbPr)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003355 tempbx &= (0xFF00 |
3356 SwitchToCRT2 |
3357 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303358 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303360 if (pVBInfo->IF_DEF_HiVision == 1) {
3361 if (tempbx & SetCRT2ToHiVisionTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003362 tempbx &= (0xFF00 |
3363 SetCRT2ToHiVisionTV |
3364 SwitchToCRT2 |
3365 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303366 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003367
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303368 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3369 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3370 tempbx = DisableCRT2Display;
3371 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303373 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003374 if ((!(tempbx & DriverMode)) ||
3375 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303376 if (pVBInfo->IF_DEF_LCDA == 1) {
3377 if (!(tempbx & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003378 tempbx |= (SetInSlaveMode |
3379 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303380 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303381 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003382
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003383 /* LCD+TV can't support in slave mode
3384 * (Force LCDA+TV->LCDB) */
3385 if ((tempbx & SetInSlaveMode) &&
3386 (tempbx & SetCRT2ToLCDA)) {
3387 tempbx ^= (SetCRT2ToLCD |
3388 SetCRT2ToLCDA |
3389 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303390 pVBInfo->SetFlag |= ReserveTVOption;
3391 }
3392 }
3393 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303395 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003396}
3397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303398void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3399 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003400{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303401 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003402
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303403 tempbx = 0;
3404 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303406 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3407 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003408 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3409 St_ModeFlag; /* si+St_ModeFlag */
3410 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3411 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303412 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003413 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3414 Ext_ModeFlag;
3415 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3416 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303417 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003418
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303419 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003420 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 tempbx = temp;
3422 if (tempbx & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003423 tempbx &= (SetCHTVOverScan |
3424 SetPALMTV |
3425 SetPALNTV |
3426 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303427 if (tempbx & SetPALMTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003428 /* set to NTSC if PAL-M */
3429 tempbx &= ~SetPALTV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303430 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003431 tempbx &= (SetCHTVOverScan |
3432 SetNTSCJ |
3433 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 /*
3435 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003436 //PAL-M/PAL-N Info
3437 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3438 //00:PAL, 01:PAL-M, 10:PAL-N
3439 temp2 = (index1 & 0xC0) >> 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303440 tempbx |= temp2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003441 if (temp2 & 0x02) //PAL-M
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303442 tempbx &= (~SetPALTV);
3443 }
3444 */
3445 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303447 if (pVBInfo->IF_DEF_LVDS == 0) {
3448 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3449 tempbx |= SetPALTV;
3450 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303452 if (pVBInfo->IF_DEF_YPbPr == 1) {
3453 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003454 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303455 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003456
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303457 if (index1 == YPbPrMode525i)
3458 tempbx |= SetYPbPrMode525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 if (index1 == YPbPrMode525p)
3461 tempbx = tempbx | SetYPbPrMode525p;
3462 if (index1 == YPbPrMode750p)
3463 tempbx = tempbx | SetYPbPrMode750p;
3464 }
3465 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303467 if (pVBInfo->IF_DEF_HiVision == 1) {
3468 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3469 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
3470 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303472 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003473 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3474 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303475 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003476
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003477 if (!(tempbx & SetPALTV) &&
3478 (modeflag > 13) &&
3479 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303482 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003483
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303484 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3485 if (pVBInfo->VBInfo & SetInSlaveMode)
3486 tempbx &= (~RPLLDIV2XO);
3487 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003488 if (tempbx &
3489 (SetYPbPrMode525p | SetYPbPrMode750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303490 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003491 else if (!(pVBInfo->VBType &
3492 (VB_XGI301B |
3493 VB_XGI302B |
3494 VB_XGI301LV |
3495 VB_XGI302LV |
3496 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303497 if (tempbx & TVSimuMode)
3498 tempbx &= (~RPLLDIV2XO);
3499 }
3500 }
3501 }
3502 }
3503 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003504}
3505
Bill Pemberton108afbf2010-06-17 13:10:47 -04003506unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003508{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303509 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003510
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303511 pVBInfo->LCDResInfo = 0;
3512 pVBInfo->LCDTypeInfo = 0;
3513 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003516 /* si+St_ModeFlag // */
3517 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303518 } else {
3519 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003520 /* si+Ext_ResInfo // */
3521 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003523
Aaro Koskinen58839b02011-03-13 12:26:23 +02003524 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303525 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303527 if (tempbx == 0)
3528 tempbx = Panel1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003529
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303530 /* LCD75 [2003/8/22] Vicent */
3531 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3532 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003533 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303534 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3535 tempax &= 0x0F;
3536 else
3537 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003538
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303539 if ((resinfo == 6) || (resinfo == 9)) {
3540 if (tempax >= 3)
3541 tempbx |= PanelRef75Hz;
3542 } else if ((resinfo == 7) || (resinfo == 8)) {
3543 if (tempax >= 4)
3544 tempbx |= PanelRef75Hz;
3545 }
3546 }
3547 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303549 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303551 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303553 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
3554 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303556 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003557
Aaro Koskinen58839b02011-03-13 12:26:23 +02003558 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303560 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303562 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003563
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003565
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303566 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303568 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3569 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3570 & VB_XGI301C)) && (tempax & LCDDualLink)) {
3571 tempbx |= SetLCDDualLink;
3572 }
3573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303575 if (pVBInfo->IF_DEF_LVDS == 0) {
3576 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
3577 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3578 == 9) && (!(tempbx & EnableScalingLCD)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003579 /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3580 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303581 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003582
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303583 /*
3584 if (tempax & LCDBToA) {
3585 tempbx |= SetLCDBToA;
3586 }
3587 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303589 if (pVBInfo->IF_DEF_ExpLink == 1) {
3590 if (modeflag & HalfDCLK) {
3591 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
3592 if (!(tempbx & SetLCDtoNonExpanding)) {
3593 tempbx |= EnableLVDSDDA;
3594 } else {
3595 if (ModeNo > 0x13) {
3596 if (pVBInfo->LCDResInfo
3597 == Panel1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003598 if (resinfo == 4) {/* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303599 tempbx |= EnableLVDSDDA;
3600 }
3601 }
3602 }
3603 }
3604 }
3605 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303607 if (pVBInfo->VBInfo & SetInSlaveMode) {
3608 if (pVBInfo->VBInfo & SetNotSimuMode)
3609 tempbx |= LCDVESATiming;
3610 } else {
3611 tempbx |= LCDVESATiming;
3612 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003613
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303614 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003615
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303616 if (pVBInfo->IF_DEF_LVDS == 0) {
3617 if (tempax & (LockLCDBToA | StLCDBToA)) {
3618 if (pVBInfo->VBInfo & SetInSlaveMode) {
3619 if (!(tempax & LockLCDBToA)) {
3620 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003621 pVBInfo->VBInfo &=
3622 ~(SetSimuScanMode |
3623 SetInSlaveMode |
3624 SetCRT2ToLCD);
3625 pVBInfo->VBInfo |=
3626 SetCRT2ToLCDA |
3627 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303628 }
3629 }
3630 }
3631 }
3632 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303634 /*
3635 if (pVBInfo->IF_DEF_LVDS == 0) {
3636 if (tempax & (LockLCDBToA | StLCDBToA)) {
3637 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003638 if (!((!(tempax & LockLCDBToA)) &&
3639 (ModeNo > 0x13))) {
3640 pVBInfo->VBInfo &=
3641 ~(SetSimuScanMode |
3642 SetInSlaveMode |
3643 SetCRT2ToLCD);
3644 pVBInfo->VBInfo |=
3645 SetCRT2ToLCDA |
3646 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303647 }
3648 }
3649 }
3650 }
3651 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303653 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003654}
3655
Bill Pemberton108afbf2010-06-17 13:10:47 -04003656unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303657 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003658{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303659 if (ModeNo <= 5)
3660 ModeNo |= 1;
3661 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003662 /* for (*ModeIdIndex=0;
3663 *ModeIdIndex < sizeof(pVBInfo->SModeIDTable)
3664 / sizeof(struct XGI_StStruct);
3665 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303666 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003667 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3668 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303669 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003670 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3671 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303672 return 0;
3673 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003674
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303675 if (ModeNo == 0x07)
3676 (*ModeIdIndex)++; /* 400 lines */
3677 if (ModeNo <= 3)
3678 (*ModeIdIndex) += 2; /* 400 lines */
3679 /* else 350 lines */
3680 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003681 /* for (*ModeIdIndex=0;
3682 *ModeIdIndex < sizeof(pVBInfo->EModeIDTable)
3683 / sizeof(struct XGI_ExtStruct);
3684 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303685 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003686 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3687 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303688 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003689 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3690 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303691 return 0;
3692 }
3693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303695 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003696}
3697
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003698static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3699{
3700 unsigned char ujRet = 0;
3701 unsigned char i = 0;
3702
3703 for (i = 0; i < 8; i++) {
3704 ujRet = ujRet << 1;
3705 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
3706 ujRet |= (ujDate >> i) & 1;
3707 }
3708
3709 return ujRet;
3710}
3711
3712/*----------------------------------------------------------------------------*/
3713/* output */
3714/* bl[5] : LVDS signal */
3715/* bl[1] : LVDS backlight */
3716/* bl[0] : LVDS VDD */
3717/*----------------------------------------------------------------------------*/
3718static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3719{
3720 unsigned char CR4A, temp;
3721
Aaro Koskinen58839b02011-03-13 12:26:23 +02003722 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003723 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003724
Aaro Koskinen58839b02011-03-13 12:26:23 +02003725 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003726
3727 temp = XG21GPIODataTransfer(temp);
3728 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003729 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003730 return temp;
3731}
3732
3733/*----------------------------------------------------------------------------*/
3734/* output */
3735/* bl[5] : LVDS signal */
3736/* bl[1] : LVDS backlight */
3737/* bl[0] : LVDS VDD */
3738/*----------------------------------------------------------------------------*/
3739static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3740{
3741 unsigned char CR4A, CRB4, temp;
3742
Aaro Koskinen58839b02011-03-13 12:26:23 +02003743 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003744 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003745
Aaro Koskinen58839b02011-03-13 12:26:23 +02003746 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003747
3748 temp &= 0x0C;
3749 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003750 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003751 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003752 temp |= ((CRB4 & 0x04) << 3);
3753 return temp;
3754}
3755
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02003756/*----------------------------------------------------------------------------*/
3757/* input */
3758/* bl[5] : 1;LVDS signal on */
3759/* bl[1] : 1;LVDS backlight on */
3760/* bl[0] : 1:LVDS VDD on */
3761/* bh: 100000b : clear bit 5, to set bit5 */
3762/* 000010b : clear bit 1, to set bit1 */
3763/* 000001b : clear bit 0, to set bit0 */
3764/*----------------------------------------------------------------------------*/
3765static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3766 struct vb_device_info *pVBInfo)
3767{
3768 unsigned char CR4A, temp;
3769
3770 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3771 tempbh &= 0x23;
3772 tempbl &= 0x23;
3773 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3774
3775 if (tempbh & 0x20) {
3776 temp = (tempbl >> 4) & 0x02;
3777
3778 /* CR B4[1] */
3779 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3780
3781 }
3782
3783 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
3784
3785 temp = XG21GPIODataTransfer(temp);
3786 temp &= ~tempbh;
3787 temp |= tempbl;
3788 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
3789}
3790
Aaro Koskinen776115a2011-11-27 23:03:10 +02003791static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
3792 struct vb_device_info *pVBInfo)
3793{
3794 unsigned char CR4A, temp;
3795 unsigned short tempbh0, tempbl0;
3796
3797 tempbh0 = tempbh;
3798 tempbl0 = tempbl;
3799 tempbh0 &= 0x20;
3800 tempbl0 &= 0x20;
3801 tempbh0 >>= 3;
3802 tempbl0 >>= 3;
3803
3804 if (tempbh & 0x20) {
3805 temp = (tempbl >> 4) & 0x02;
3806
3807 /* CR B4[1] */
3808 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
3809
3810 }
3811 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
3812
3813 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
3814 tempbh &= 0x03;
3815 tempbl &= 0x03;
3816 tempbh <<= 2;
3817 tempbl <<= 2; /* GPIOC,GPIOD */
3818 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
3819 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
3820}
3821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303822void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
3823 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003824{
3825
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003826 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303827 if (pXGIHWDE->jChipType == XG21) {
3828 if (pVBInfo->IF_DEF_LVDS == 1) {
3829 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003830 /* LVDS VDD on */
3831 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303832 XGI_XG21SetPanelDelay(2, pVBInfo);
3833 }
3834 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003835 /* LVDS signal on */
3836 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303837 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003838 /* LVDS backlight on */
3839 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303840 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003841 /* DVO/DVI signal on */
3842 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303843 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303845 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303847 if (pXGIHWDE->jChipType == XG27) {
3848 if (pVBInfo->IF_DEF_LVDS == 1) {
3849 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003850 /* LVDS VDD on */
3851 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303852 XGI_XG21SetPanelDelay(2, pVBInfo);
3853 }
3854 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003855 /* LVDS signal on */
3856 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303857 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003858 /* LVDS backlight on */
3859 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003861 /* DVO/DVI signal on */
3862 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303863 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003866}
3867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303868void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
3869 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003870{
3871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303872 if (pXGIHWDE->jChipType == XG21) {
3873 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003874 /* LVDS backlight off */
3875 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303876 XGI_XG21SetPanelDelay(3, pVBInfo);
3877 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003878 /* DVO/DVI signal off */
3879 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303880 }
3881 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303883 if (pXGIHWDE->jChipType == XG27) {
3884 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003885 /* LVDS backlight off */
3886 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303887 XGI_XG21SetPanelDelay(3, pVBInfo);
3888 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003889
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303890 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003891 /* DVO/DVI signal off */
3892 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303893 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003894
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003895 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003896}
3897
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003898static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003899{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003900 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303901 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003902
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003903 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303904 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003905}
3906
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003907static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003908{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003909 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003910}
3911
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003912static void XGI_SaveCRT2Info(unsigned short ModeNo,
3913 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003914{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303915 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003916
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003917 /* reserve CR34 for CRT1 Mode No */
3918 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303919 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3920 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003921 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003922}
3923
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003924static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3925 unsigned short ModeIdIndex,
3926 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003927{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303928 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303930 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
3931 if (ModeNo <= 0x13) {
3932 xres = pVBInfo->StResInfo[resindex].HTotal;
3933 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003934 /* si+St_ResInfo */
3935 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303936 } else {
3937 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3938 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003939 /* si+St_ModeFlag */
3940 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303942 /*
3943 if (pVBInfo->IF_DEF_FSTN) {
3944 xres *= 2;
3945 yres *= 2;
3946 } else {
3947 */
3948 if (modeflag & HalfDCLK)
3949 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303951 if (modeflag & DoubleScanMode)
3952 yres *= 2;
3953 /* } */
3954 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003955
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303956 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
3957 if (pVBInfo->IF_DEF_LVDS == 0) {
3958 if (pVBInfo->LCDResInfo == Panel1600x1200) {
3959 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
3960 if (yres == 1024)
3961 yres = 1056;
3962 }
3963 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003964
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303965 if (pVBInfo->LCDResInfo == Panel1280x1024) {
3966 if (yres == 400)
3967 yres = 405;
3968 else if (yres == 350)
3969 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003970
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971 if (pVBInfo->LCDInfo & LCDVESATiming) {
3972 if (yres == 360)
3973 yres = 375;
3974 }
3975 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977 if (pVBInfo->LCDResInfo == Panel1024x768) {
3978 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
3979 if (!(pVBInfo->LCDInfo
3980 & LCDNonExpanding)) {
3981 if (yres == 350)
3982 yres = 357;
3983 else if (yres == 400)
3984 yres = 420;
3985 else if (yres == 480)
3986 yres = 525;
3987 }
3988 }
3989 }
3990 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303992 if (xres == 720)
3993 xres = 640;
3994 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303996 pVBInfo->VGAHDE = xres;
3997 pVBInfo->HDE = xres;
3998 pVBInfo->VGAVDE = yres;
3999 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004000}
4001
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004002static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004003{
4004
Dan Carpentera65fd092011-01-04 09:02:27 +03004005 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
4006 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304007 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004010}
4011
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004012static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
4013 unsigned short ModeIdIndex,
4014 unsigned short RefreshRateTableIndex,
4015 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004016{
4017 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
4018 StandTableIndex, CRT1Index;
4019
4020 pVBInfo->RVBHCMAX = 1;
4021 pVBInfo->RVBHCFACT = 1;
4022
4023 if (ModeNo <= 0x13) {
4024 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4025 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
4026 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
4027 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
4028 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
4029 } else {
4030 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004031 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
4032 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004033 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004034 temp1 = (unsigned short) pVBInfo->
4035 XGINEWUB_CRT1Table[CRT1Index].CR[0];
4036 temp2 = (unsigned short) pVBInfo->
4037 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004038 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004039 tempbx = (unsigned short) pVBInfo->
4040 XGINEWUB_CRT1Table[CRT1Index].CR[8];
4041 tempcx = (unsigned short) pVBInfo->
4042 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004043 tempcx &= 0x0100;
4044 tempcx = tempcx << 2;
4045 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004046 temp1 = (unsigned short) pVBInfo->
4047 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004048 }
4049
4050 if (temp1 & 0x01)
4051 tempbx |= 0x0100;
4052
4053 if (temp1 & 0x20)
4054 tempbx |= 0x0200;
4055 tempax += 5;
4056
4057 if (modeflag & Charx8Dot)
4058 tempax *= 8;
4059 else
4060 tempax *= 9;
4061
4062 pVBInfo->VGAHT = tempax;
4063 pVBInfo->HT = tempax;
4064 tempbx++;
4065 pVBInfo->VGAVT = tempbx;
4066 pVBInfo->VT = tempbx;
4067}
4068
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004069static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304070 unsigned short RefreshRateTableIndex,
4071 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004072{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304073 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304075 struct XGI_LCDDataStruct *LCDPtr = NULL;
4076 struct XGI_TVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304078 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004079 /* si+St_ResInfo */
4080 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304081 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4082 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004083 /* si+Ext_ResInfo */
4084 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304085 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4086 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004087
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304088 pVBInfo->NewFlickerMode = 0;
4089 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304091 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4092 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4093 pVBInfo);
4094 return;
4095 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004096
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304097 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304099 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4100 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4101 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4102 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304104 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4105 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4106 pVBInfo->VGAHT = LCDPtr->VGAHT;
4107 pVBInfo->VGAVT = LCDPtr->VGAVT;
4108 pVBInfo->HT = LCDPtr->LCDHT;
4109 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304111 if (pVBInfo->LCDResInfo == Panel1024x768) {
4112 tempax = 1024;
4113 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304115 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4116 if (pVBInfo->VGAVDE == 357)
4117 tempbx = 527;
4118 else if (pVBInfo->VGAVDE == 420)
4119 tempbx = 620;
4120 else if (pVBInfo->VGAVDE == 525)
4121 tempbx = 775;
4122 else if (pVBInfo->VGAVDE == 600)
4123 tempbx = 775;
4124 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4125 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4126 else
4127 tempbx = 768;
4128 } else
4129 tempbx = 768;
4130 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4131 tempax = 1024;
4132 tempbx = 768;
4133 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4134 tempax = 1280;
4135 if (pVBInfo->VGAVDE == 360)
4136 tempbx = 768;
4137 else if (pVBInfo->VGAVDE == 375)
4138 tempbx = 800;
4139 else if (pVBInfo->VGAVDE == 405)
4140 tempbx = 864;
4141 else
4142 tempbx = 1024;
4143 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4144 tempax = 1280;
4145 tempbx = 1024;
4146 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4147 tempax = 1280;
4148 if (pVBInfo->VGAVDE == 350)
4149 tempbx = 700;
4150 else if (pVBInfo->VGAVDE == 400)
4151 tempbx = 800;
4152 else if (pVBInfo->VGAVDE == 1024)
4153 tempbx = 960;
4154 else
4155 tempbx = 960;
4156 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4157 tempax = 1400;
4158 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304160 if (pVBInfo->VGAVDE == 1024) {
4161 tempax = 1280;
4162 tempbx = 1024;
4163 }
4164 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4165 tempax = 1600;
4166 tempbx = 1200; /* alan 10/14/2003 */
4167 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4168 if (pVBInfo->VGAVDE == 350)
4169 tempbx = 875;
4170 else if (pVBInfo->VGAVDE == 400)
4171 tempbx = 1000;
4172 }
4173 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304175 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4176 tempax = pVBInfo->VGAHDE;
4177 tempbx = pVBInfo->VGAVDE;
4178 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304180 pVBInfo->HDE = tempax;
4181 pVBInfo->VDE = tempbx;
4182 return;
4183 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304185 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4186 tempbx = 4;
4187 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4188 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4189 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004190
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304191 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4192 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4193 pVBInfo->VGAHT = TVPtr->VGAHT;
4194 pVBInfo->VGAVT = TVPtr->VGAVT;
4195 pVBInfo->HDE = TVPtr->TVHDE;
4196 pVBInfo->VDE = TVPtr->TVVDE;
4197 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4198 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304200 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4201 if (resinfo == 0x08)
4202 pVBInfo->NewFlickerMode = 0x40;
4203 else if (resinfo == 0x09)
4204 pVBInfo->NewFlickerMode = 0x40;
4205 else if (resinfo == 0x12)
4206 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304208 if (pVBInfo->VGAVDE == 350)
4209 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304211 tempax = ExtHiTVHT;
4212 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304214 if (pVBInfo->VBInfo & SetInSlaveMode) {
4215 if (pVBInfo->TVInfo & TVSimuMode) {
4216 tempax = StHiTVHT;
4217 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304219 if (!(modeflag & Charx8Dot)) {
4220 tempax = StHiTextTVHT;
4221 tempbx = StHiTextTVVT;
4222 }
4223 }
4224 }
4225 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4226 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4227 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4228 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4229 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304231 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4232 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4233 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4234 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4235 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4236 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4237 if (pVBInfo->TVInfo & NTSC1024x768)
4238 tempax = NTSC1024x768HT;
4239 }
4240 } else {
4241 tempax = PALHT;
4242 tempbx = PALVT;
4243 if (!(pVBInfo->TVInfo & SetPALTV)) {
4244 tempax = NTSCHT;
4245 tempbx = NTSCVT;
4246 if (pVBInfo->TVInfo & NTSC1024x768)
4247 tempax = NTSC1024x768HT;
4248 }
4249 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304251 pVBInfo->HT = tempax;
4252 pVBInfo->VT = tempbx;
4253 return;
4254 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004255}
4256
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004257static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304258 unsigned short RefreshRateTableIndex,
4259 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004260{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004261 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304263 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4264 pVBInfo);
4265 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4266 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004267
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304268 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4269 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004270 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4271 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4272 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304273 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004274 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4275 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304276 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004277
Aaro Koskinen8104e322011-03-13 12:26:22 +02004278 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304280 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004281 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304282 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004283 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004284}
4285
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004286static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4287 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004288{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004289 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4290 short index;
4291 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292
4293 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004294 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304295 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004296 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304297
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004298 index = (modeflag & ModeInfoFlag) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304299
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004300 if (index < 0)
4301 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304302
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004303 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304}
4305
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004306static unsigned short XGI_GetOffset(unsigned short ModeNo,
4307 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 unsigned short RefreshRateTableIndex,
4309 struct xgi_hw_device_info *HwDeviceExtension,
4310 struct vb_device_info *pVBInfo)
4311{
4312 unsigned short temp, colordepth, modeinfo, index, infoflag,
4313 ColorDepth[] = { 0x01, 0x02, 0x04 };
4314
4315 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4316 if (ModeNo <= 0x14)
4317 infoflag = 0;
4318 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004319 infoflag = pVBInfo->
4320 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304321
4322 index = (modeinfo >> 8) & 0xFF;
4323
4324 temp = pVBInfo->ScreenOffset[index];
4325
4326 if (infoflag & InterlaceMode)
4327 temp = temp << 1;
4328
4329 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4330
4331 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4332 temp = ModeNo - 0x7C;
4333 colordepth = ColorDepth[temp];
4334 temp = 0x6B;
4335 if (infoflag & InterlaceMode)
4336 temp = temp << 1;
4337 return temp * colordepth;
4338 } else {
4339 return temp * colordepth;
4340 }
4341}
4342
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004343static void XGI_SetCRT2Offset(unsigned short ModeNo,
4344 unsigned short ModeIdIndex,
4345 unsigned short RefreshRateTableIndex,
4346 struct xgi_hw_device_info *HwDeviceExtension,
4347 struct vb_device_info *pVBInfo)
4348{
4349 unsigned short offset;
4350 unsigned char temp;
4351
4352 if (pVBInfo->VBInfo & SetInSlaveMode)
4353 return;
4354
4355 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4356 HwDeviceExtension, pVBInfo);
4357 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004358 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004359 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004360 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004361 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004362 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004363}
4364
Randy Dunlap89229672010-08-10 08:46:44 -07004365static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004366{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004367 /* threshold high ,disable auto threshold */
4368 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4369 /* threshold low default 04h */
4370 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004371}
4372
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004373static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304374 struct xgi_hw_device_info *HwDeviceExtension,
4375 unsigned short RefreshRateTableIndex,
4376 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004377{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304378 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304380 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004381 CRT1Index = pVBInfo->
4382 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304383 CRT1Index &= IndexMask;
4384 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4385 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004386
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304387 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4388 HwDeviceExtension, pVBInfo);
4389 XGI_SetCRT2FIFO(pVBInfo);
4390 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004393 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004394
Aaro Koskinen8104e322011-03-13 12:26:22 +02004395 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4396 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004397}
4398
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004399static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304400 struct xgi_hw_device_info *HwDeviceExtension,
4401 unsigned short RefreshRateTableIndex,
4402 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004403{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304404 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4405 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304407 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004408 CRT1Index = pVBInfo->
4409 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304410 CRT1Index &= IndexMask;
4411 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004412 }
4413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304414 if (ModeNo <= 0x13)
4415 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4416 else
4417 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004418
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304419 /* bainy change table name */
4420 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004421 /* BTVGA2HT 0x08,0x09 */
4422 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004423 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304424 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004425 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004426 /* BTVGA2HDEE 0x0A,0x0C */
4427 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004428 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304429 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4430 pushbx = pVBInfo->VGAHDE / 2 + 16;
4431 tempcx = tempcx >> 1;
4432 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4433 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304435 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4436 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004437 tempbx |= ((pVBInfo->
4438 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4439 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304440 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4441 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4442 tempcx &= 0x1F;
4443 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4444 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4445 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4446 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304448 tempbx += 4;
4449 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304451 if (tempcx > (pVBInfo->VGAHT / 2))
4452 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004453
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304454 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004455
Aaro Koskinen8104e322011-03-13 12:26:22 +02004456 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304457 } else {
4458 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004459 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304460 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004461 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004462 /* BTVGA2HDEE 0x0A,0x0C */
4463 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004464 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304465 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4466 pushbx = pVBInfo->VGAHDE + 16;
4467 tempcx = tempcx >> 1;
4468 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4469 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004470
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304471 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4472 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004473 tempbx |= ((pVBInfo->
4474 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4475 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304476 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4477 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4478 tempcx &= 0x1F;
4479 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4480 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4481 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4482 tempbx += 16;
4483 tempcx += 16;
4484 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304486 if (tempcx > pVBInfo->VGAHT)
4487 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004488
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304489 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004490 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304493 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4494 tempbx = pushbx;
4495 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4496 tempax |= (tempbx & 0xFF00);
4497 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004498 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304499 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004500 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304501 tempcx = (pVBInfo->VGAVT - 1);
4502 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004503
Aaro Koskinen8104e322011-03-13 12:26:22 +02004504 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304505 tempbx = pVBInfo->VGAVDE - 1;
4506 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004507 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 temp = ((tempbx & 0xFF00) << 3) >> 8;
4509 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004510 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304512 tempax = pVBInfo->VGAVDE;
4513 tempbx = pVBInfo->VGAVDE;
4514 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004515 /* BTVGA2VRS 0x10,0x11 */
4516 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4517 /* BTVGA2VRE 0x11 */
4518 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304520 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4521 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4522 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304524 if (temp & 0x04)
4525 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304527 if (temp & 0x080)
4528 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004529
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304530 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004531
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304532 if (temp & 0x08)
4533 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004534
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304535 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4536 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4537 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004538
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304539 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004540 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304541 temp = ((tempbx & 0xFF00) >> 8) << 4;
4542 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004543 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304544 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004545
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304546 if (modeflag & DoubleScanMode)
4547 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 if (modeflag & HalfDCLK)
4550 tempax |= 0x40;
4551
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004552 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004553}
4554
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004555static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4556{
4557 unsigned long tempax, tempbx;
4558
4559 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4560 & 0xFFFF;
4561 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4562 tempax = (tempax * pVBInfo->HT) / tempbx;
4563
4564 return (unsigned short) tempax;
4565}
4566
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004567static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304568 struct xgi_hw_device_info *HwDeviceExtension,
4569 unsigned short RefreshRateTableIndex,
4570 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004571{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304572 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4573 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304575 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004576 /* si+St_ResInfo */
4577 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304578 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4579 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004580 /* si+Ext_ResInfo */
4581 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304582 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004583 CRT1Index = pVBInfo->
4584 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304585 CRT1Index &= IndexMask;
4586 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304588 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4589 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304591 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004592 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304593 /* if (modeflag & Charx8Dot) */
4594 /* tempcx = 0x08; */
4595 /* else */
4596 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304598 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4599 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304601 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304603 if (modeflag & HalfDCLK)
4604 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304606 tempax = (tempax / tempcx) - 1;
4607 tempbx |= ((tempax & 0x00FF) << 8);
4608 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004609 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304611 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304613 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4614 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4615 | VB_XGI302LV | VB_XGI301C)))
4616 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004617
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304618 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4619 if (pVBInfo->VBType & VB_XGI301LV) {
4620 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4621 if (resinfo == 7)
4622 temp -= 2;
4623 }
4624 } else if (resinfo == 7) {
4625 temp -= 2;
4626 }
4627 }
4628 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004629
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004630 /* 0x05 Horizontal Display Start */
4631 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
4632 /* 0x06 Horizontal Blank end */
4633 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004634
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304635 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4636 if (pVBInfo->VBInfo & SetCRT2ToTV)
4637 tempax = pVBInfo->VGAHT;
4638 else
4639 tempax = XGI_GetVGAHT2(pVBInfo);
4640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304642 if (tempax >= pVBInfo->VGAHT)
4643 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304645 if (modeflag & HalfDCLK)
4646 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304648 tempax = (tempax / tempcx) - 5;
4649 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
4650 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4651 temp = (tempbx & 0x00FF) - 1;
4652 if (!(modeflag & HalfDCLK)) {
4653 temp -= 6;
4654 if (pVBInfo->TVInfo & TVSimuMode) {
4655 temp -= 4;
4656 if (ModeNo > 0x13)
4657 temp -= 10;
4658 }
4659 }
4660 } else {
4661 /* tempcx = tempbx & 0x00FF ; */
4662 tempbx = (tempbx & 0xFF00) >> 8;
4663 tempcx = (tempcx + tempbx) >> 1;
4664 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304666 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4667 temp -= 1;
4668 if (!(modeflag & HalfDCLK)) {
4669 if ((modeflag & Charx8Dot)) {
4670 temp += 4;
4671 if (pVBInfo->VGAHDE >= 800)
4672 temp -= 6;
4673 }
4674 }
4675 } else {
4676 if (!(modeflag & HalfDCLK)) {
4677 temp -= 4;
4678 if (pVBInfo->LCDResInfo != Panel1280x960) {
4679 if (pVBInfo->VGAHDE >= 800) {
4680 temp -= 7;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004681 if (pVBInfo->ModeType ==
4682 ModeEGA) {
4683 if (pVBInfo->VGAVDE ==
4684 1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304685 temp += 15;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004686 if (pVBInfo->LCDResInfo != Panel1280x1024) {
4687 temp +=
4688 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304689 }
4690 }
4691 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304693 if (pVBInfo->VGAHDE >= 1280) {
4694 if (pVBInfo->LCDResInfo
4695 != Panel1280x960) {
4696 if (pVBInfo->LCDInfo
4697 & LCDNonExpanding) {
4698 temp
4699 += 28;
4700 }
4701 }
4702 }
4703 }
4704 }
4705 }
4706 }
4707 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004708
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004709 /* 0x07 Horizontal Retrace Start */
4710 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4711 /* 0x08 Horizontal Retrace End */
4712 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004713
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304714 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4715 if (pVBInfo->TVInfo & TVSimuMode) {
4716 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4717 == 0x11) || (ModeNo == 0x13) || (ModeNo
4718 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004719 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
4720 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304721 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304723 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
4724 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004725 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304726 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004727 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304728 0x08, 0x61);
4729 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004730 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304731 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004732 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304733 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004734 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304735 0x0C, 0xF0);
4736 }
4737 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304739 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
4740 == 0x07)) {
4741 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004742 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304743 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004744 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304745 0x08, 0x00);
4746 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004747 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304748 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004749 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304750 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004751 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304752 0x0C, 0xF0);
4753 }
4754 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304756 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
4757 == 0x0D) || (ModeNo == 0x50)) {
4758 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004759 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304760 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004761 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304762 0x08, 0x03);
4763 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004764 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304765 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004766 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304767 0x08, 0x02);
4768 }
4769 }
4770 }
4771 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004772
Aaro Koskinen8104e322011-03-13 12:26:22 +02004773 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004774 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004775 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777 tempbx = pVBInfo->VGAVT;
4778 push1 = tempbx;
4779 tempcx = 0x121;
4780 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 if (tempbx == 357)
4783 tempbx = 350;
4784 if (tempbx == 360)
4785 tempbx = 350;
4786 if (tempbx == 375)
4787 tempbx = 350;
4788 if (tempbx == 405)
4789 tempbx = 400;
4790 if (tempbx == 525)
4791 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304793 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304795 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4796 if (pVBInfo->LCDResInfo == Panel1024x768) {
4797 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4798 if (tempbx == 350)
4799 tempbx += 5;
4800 if (tempbx == 480)
4801 tempbx += 5;
4802 }
4803 }
4804 }
4805 tempbx--;
4806 temp = tempbx & 0x00FF;
4807 tempbx--;
4808 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004809 /* 0x10 vertical Blank Start */
4810 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304811 tempbx = push2;
4812 tempbx--;
4813 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004814 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304816 if (tempbx & 0x0100)
4817 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304819 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304821 if (modeflag & DoubleScanMode)
4822 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 if (tempbx & 0x0200)
4825 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004826
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004828 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304830 if (tempbx & 0x0400)
4831 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004832
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004833 /* 0x11 Vertival Blank End */
4834 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304835
4836 tempax = push1;
4837 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
4838 tempax = tempax >> 2;
4839 push1 = tempax; /* push ax */
4840
4841 if (resinfo != 0x09) {
4842 tempax = tempax << 1;
4843 tempbx += tempax;
4844 }
4845
4846 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4847 if (pVBInfo->VBType & VB_XGI301LV) {
4848 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
4849 tempbx -= 10;
4850 } else {
4851 if (pVBInfo->TVInfo & TVSimuMode) {
4852 if (pVBInfo->TVInfo & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004853 if (pVBInfo->VBType &
4854 VB_XGI301LV) {
4855 if (!(pVBInfo->TVInfo &
4856 (SetYPbPrMode525p |
4857 SetYPbPrMode750p |
4858 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304859 tempbx += 40;
4860 } else {
4861 tempbx += 40;
4862 }
4863 }
4864 }
4865 }
4866 } else {
4867 tempbx -= 10;
4868 }
4869 } else {
4870 if (pVBInfo->TVInfo & TVSimuMode) {
4871 if (pVBInfo->TVInfo & SetPALTV) {
4872 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004873 if (!(pVBInfo->TVInfo &
4874 (SetYPbPrMode525p |
4875 SetYPbPrMode750p |
4876 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304877 tempbx += 40;
4878 } else {
4879 tempbx += 40;
4880 }
4881 }
4882 }
4883 }
4884 tempax = push1;
4885 tempax = tempax >> 2;
4886 tempax++;
4887 tempax += tempbx;
4888 push1 = tempax; /* push ax */
4889
4890 if ((pVBInfo->TVInfo & SetPALTV)) {
4891 if (tempbx <= 513) {
4892 if (tempax >= 513)
4893 tempbx = 513;
4894 }
4895 }
4896
4897 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004898 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304899 tempbx--;
4900 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004901 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902
4903 if (tempbx & 0x0100)
4904 tempcx |= 0x0008;
4905
4906 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004907 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908
4909 tempbx++;
4910
4911 if (tempbx & 0x0100)
4912 tempcx |= 0x0004;
4913
4914 if (tempbx & 0x0200)
4915 tempcx |= 0x0080;
4916
4917 if (tempbx & 0x0400)
4918 tempcx |= 0x0C00;
4919
4920 tempbx = push1; /* pop ax */
4921 temp = tempbx & 0x00FF;
4922 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004923 /* 0x0D vertical Retrace End */
4924 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925
4926 if (tempbx & 0x0010)
4927 tempcx |= 0x2000;
4928
4929 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004930 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304931 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004932 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304933 tempax = modeflag;
4934 temp = (tempax & 0xFF00) >> 8;
4935
4936 temp = (temp >> 1) & 0x09;
4937
4938 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4939 temp |= 0x01;
4940
Aaro Koskinen8104e322011-03-13 12:26:22 +02004941 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
4942 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
4943 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304944
4945 if (pVBInfo->LCDInfo & LCDRGB18Bit)
4946 temp = 0x80;
4947 else
4948 temp = 0x00;
4949
Aaro Koskinen8104e322011-03-13 12:26:22 +02004950 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304951
4952 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004953}
4954
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004955static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304956 unsigned short RefreshRateTableIndex,
4957 struct xgi_hw_device_info *HwDeviceExtension,
4958 struct vb_device_info *pVBInfo)
4959{
4960 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
4961 modeflag, resinfo, crt2crtc;
4962 unsigned char *TimingPoint;
4963
4964 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
4965
4966 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004967 /* si+St_ResInfo */
4968 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304969 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4970 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
4971 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004972 /* si+Ext_ResInfo */
4973 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304974 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004975 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
4976 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304977 }
4978
4979 tempax = 0;
4980
4981 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
4982 tempax |= 0x0800;
4983
4984 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4985 tempax |= 0x0400;
4986
4987 if (pVBInfo->VBInfo & SetCRT2ToSCART)
4988 tempax |= 0x0200;
4989
4990 if (!(pVBInfo->TVInfo & SetPALTV))
4991 tempax |= 0x1000;
4992
4993 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
4994 tempax |= 0x0100;
4995
4996 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
4997 tempax &= 0xfe00;
4998
4999 tempax = (tempax & 0xff00) >> 8;
5000
Aaro Koskinen8104e322011-03-13 12:26:22 +02005001 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305002 TimingPoint = pVBInfo->NTSCTiming;
5003
5004 if (pVBInfo->TVInfo & SetPALTV)
5005 TimingPoint = pVBInfo->PALTiming;
5006
5007 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5008 TimingPoint = pVBInfo->HiTVExtTiming;
5009
5010 if (pVBInfo->VBInfo & SetInSlaveMode)
5011 TimingPoint = pVBInfo->HiTVSt2Timing;
5012
5013 if (pVBInfo->SetFlag & TVSimuMode)
5014 TimingPoint = pVBInfo->HiTVSt1Timing;
5015
5016 if (!(modeflag & Charx8Dot))
5017 TimingPoint = pVBInfo->HiTVTextTiming;
5018 }
5019
5020 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5021 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5022 TimingPoint = pVBInfo->YPbPr525iTiming;
5023
5024 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5025 TimingPoint = pVBInfo->YPbPr525pTiming;
5026
5027 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5028 TimingPoint = pVBInfo->YPbPr750pTiming;
5029 }
5030
5031 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005032 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305033
5034 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005035 /* di->temp2[j] */
5036 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305037
5038 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005039 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305040
5041 temp = pVBInfo->NewFlickerMode;
5042 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005043 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305044
5045 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5046 tempax = 950;
5047
5048 if (pVBInfo->TVInfo & SetPALTV)
5049 tempax = 520;
5050 else
5051 tempax = 440;
5052
5053 if (pVBInfo->VDE <= tempax) {
5054 tempax -= pVBInfo->VDE;
5055 tempax = tempax >> 2;
5056 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
5057 push1 = tempax;
5058 temp = (tempax & 0xFF00) >> 8;
5059 temp += (unsigned short) TimingPoint[0];
5060
5061 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5062 | VB_XGI302LV | VB_XGI301C)) {
5063 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5064 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5065 | SetCRT2ToYPbPr)) {
5066 tempcx = pVBInfo->VGAHDE;
5067 if (tempcx >= 1024) {
5068 temp = 0x17; /* NTSC */
5069 if (pVBInfo->TVInfo & SetPALTV)
5070 temp = 0x19; /* PAL */
5071 }
5072 }
5073 }
5074
Aaro Koskinen8104e322011-03-13 12:26:22 +02005075 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305076 tempax = push1;
5077 temp = (tempax & 0xFF00) >> 8;
5078 temp += TimingPoint[1];
5079
5080 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5081 | VB_XGI302LV | VB_XGI301C)) {
5082 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5083 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5084 | SetCRT2ToYPbPr))) {
5085 tempcx = pVBInfo->VGAHDE;
5086 if (tempcx >= 1024) {
5087 temp = 0x1D; /* NTSC */
5088 if (pVBInfo->TVInfo & SetPALTV)
5089 temp = 0x52; /* PAL */
5090 }
5091 }
5092 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005093 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305094 }
5095
5096 /* 301b */
5097 tempcx = pVBInfo->HT;
5098
5099 if (XGI_IsLCDDualLink(pVBInfo))
5100 tempcx = tempcx >> 1;
5101
5102 tempcx -= 2;
5103 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005104 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305105
5106 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005107 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305108
5109 tempcx = pVBInfo->HT >> 1;
5110 push1 = tempcx; /* push cx */
5111 tempcx += 7;
5112
5113 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5114 tempcx -= 4;
5115
5116 temp = tempcx & 0x00FF;
5117 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005118 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305119
5120 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5121 tempbx += tempcx;
5122 push2 = tempbx;
5123 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005124 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305125 temp = (tempbx & 0xFF00) >> 8;
5126 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005127 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305128
5129 tempbx = push2;
5130 tempbx = tempbx + 8;
5131 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5132 tempbx = tempbx - 4;
5133 tempcx = tempbx;
5134 }
5135
5136 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005137 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305138
5139 j += 2;
5140 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5141 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005142 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305143 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005144 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305145
5146 tempcx += 8;
5147 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5148 tempcx -= 4;
5149
5150 temp = tempcx & 0xFF;
5151 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005152 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305153
5154 tempcx = push1; /* pop cx */
5155 j += 2;
5156 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5157 tempcx -= temp;
5158 temp = tempcx & 0x00FF;
5159 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005160 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305161
5162 tempcx -= 11;
5163
5164 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5165 tempax = XGI_GetVGAHT2(pVBInfo);
5166 tempcx = tempax - 1;
5167 }
5168 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005169 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305170
5171 tempbx = pVBInfo->VDE;
5172
5173 if (pVBInfo->VGAVDE == 360)
5174 tempbx = 746;
5175 if (pVBInfo->VGAVDE == 375)
5176 tempbx = 746;
5177 if (pVBInfo->VGAVDE == 405)
5178 tempbx = 853;
5179
5180 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005181 if (pVBInfo->VBType &
5182 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5183 if (!(pVBInfo->TVInfo &
5184 (SetYPbPrMode525p | SetYPbPrMode750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305185 tempbx = tempbx >> 1;
5186 } else
5187 tempbx = tempbx >> 1;
5188 }
5189
5190 tempbx -= 2;
5191 temp = tempbx & 0x00FF;
5192
5193 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5194 if (pVBInfo->VBType & VB_XGI301LV) {
5195 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5196 if (pVBInfo->VBInfo & SetInSlaveMode) {
5197 if (ModeNo == 0x2f)
5198 temp += 1;
5199 }
5200 }
5201 } else {
5202 if (pVBInfo->VBInfo & SetInSlaveMode) {
5203 if (ModeNo == 0x2f)
5204 temp += 1;
5205 }
5206 }
5207 }
5208
Aaro Koskinen8104e322011-03-13 12:26:22 +02005209 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305210
5211 temp = (tempcx & 0xFF00) >> 8;
5212 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5213
5214 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5215 if (pVBInfo->VBType & VB_XGI301LV) {
5216 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5217 temp |= 0x10;
5218
5219 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5220 temp |= 0x20;
5221 }
5222 } else {
5223 temp |= 0x10;
5224 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5225 temp |= 0x20;
5226 }
5227 }
5228
Aaro Koskinen8104e322011-03-13 12:26:22 +02005229 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305230
5231 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5232 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5233 tempbx = pVBInfo->VDE;
5234 tempcx = tempbx - 2;
5235
5236 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5237 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5238 | SetYPbPrMode750p)))
5239 tempbx = tempbx >> 1;
5240 }
5241
5242 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5243 temp = 0;
5244 if (tempcx & 0x0400)
5245 temp |= 0x20;
5246
5247 if (tempbx & 0x0400)
5248 temp |= 0x40;
5249
Aaro Koskinen8104e322011-03-13 12:26:22 +02005250 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 }
5252
5253 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005254 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305255 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005256 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305257 }
5258
5259 tempbx = tempbx & 0x00FF;
5260
5261 if (!(modeflag & HalfDCLK)) {
5262 tempcx = pVBInfo->VGAHDE;
5263 if (tempcx >= pVBInfo->HDE) {
5264 tempbx |= 0x2000;
5265 tempax &= 0x00FF;
5266 }
5267 }
5268
5269 tempcx = 0x0101;
5270
5271 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5272 if (pVBInfo->VGAHDE >= 1024) {
5273 tempcx = 0x1920;
5274 if (pVBInfo->VGAHDE >= 1280) {
5275 tempcx = 0x1420;
5276 tempbx = tempbx & 0xDFFF;
5277 }
5278 }
5279 }
5280
5281 if (!(tempbx & 0x2000)) {
5282 if (modeflag & HalfDCLK)
5283 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5284
5285 push1 = tempbx;
5286 tempeax = pVBInfo->VGAHDE;
5287 tempebx = (tempcx & 0xFF00) >> 8;
5288 longtemp = tempeax * tempebx;
5289 tempecx = tempcx & 0x00FF;
5290 longtemp = longtemp / tempecx;
5291
5292 /* 301b */
5293 tempecx = 8 * 1024;
5294
5295 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5296 | VB_XGI302LV | VB_XGI301C)) {
5297 tempecx = tempecx * 8;
5298 }
5299
5300 longtemp = longtemp * tempecx;
5301 tempecx = pVBInfo->HDE;
5302 temp2 = longtemp % tempecx;
5303 tempeax = longtemp / tempecx;
5304 if (temp2 != 0)
5305 tempeax += 1;
5306
5307 tempax = (unsigned short) tempeax;
5308
5309 /* 301b */
5310 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5311 | VB_XGI302LV | VB_XGI301C)) {
5312 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5313 }
5314 /* end 301b */
5315
5316 tempbx = push1;
5317 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5318 | (tempbx & 0x00FF));
5319 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5320 | (tempax & 0x00FF));
5321 temp = (tempax & 0xFF00) >> 8;
5322 } else {
5323 temp = (tempax & 0x00FF) >> 8;
5324 }
5325
Aaro Koskinen8104e322011-03-13 12:26:22 +02005326 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305327 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005328 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305329 temp = tempcx & 0x00FF;
5330
5331 if (tempbx & 0x2000)
5332 temp = 0;
5333
5334 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5335 temp |= 0x18;
5336
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005337 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305338 if (pVBInfo->TVInfo & SetPALTV) {
5339 tempbx = 0x0382;
5340 tempcx = 0x007e;
5341 } else {
5342 tempbx = 0x0369;
5343 tempcx = 0x0061;
5344 }
5345
5346 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005347 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305348 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005349 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305350
5351 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5352 temp = temp << 2;
5353 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5354
5355 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5356 temp |= 0x10;
5357
5358 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5359 temp |= 0x20;
5360
5361 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5362 temp |= 0x60;
5363 }
5364
Aaro Koskinen8104e322011-03-13 12:26:22 +02005365 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005366 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005367 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305368
5369 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5370 if (pVBInfo->TVInfo & NTSC1024x768) {
5371 TimingPoint = XGI_NTSC1024AdjTime;
5372 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005373 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305374 TimingPoint[j]);
5375 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005376 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305377 }
5378 }
5379
5380 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5381 if (pVBInfo->VBType & VB_XGI301C) {
5382 if (pVBInfo->TVInfo & SetPALMTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005383 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305384 0x08); /* PALM Mode */
5385 }
5386
5387 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005388 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305389 0x01);
5390 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005391 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305392
5393 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
Aaro Koskinendc505562011-03-13 12:26:26 +02005394 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305395 }
5396
5397 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5398 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005399 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305400 }
5401
5402 if (pVBInfo->VBInfo & SetCRT2ToTV)
5403 return;
5404}
5405
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005406static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 struct xgi_hw_device_info *HwDeviceExtension,
5408 unsigned short RefreshRateTableIndex,
5409 struct vb_device_info *pVBInfo)
5410{
5411 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5412 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5413
5414 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5415
5416 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005417 /* si+St_ResInfo */
5418 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305419 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5420 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005421 /* si+Ext_ResInfo */
5422 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305423 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005424 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5425 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305426 CRT1Index &= IndexMask;
5427 }
5428
5429 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5430 return;
5431
5432 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5433
5434 if (XGI_IsLCDDualLink(pVBInfo))
5435 tempbx = tempbx >> 1;
5436
5437 tempbx -= 1;
5438 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005439 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305440 temp = (tempbx & 0xFF00) >> 8;
5441 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005442 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305443 temp = 0x01;
5444
5445 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5446 if (pVBInfo->ModeType == ModeEGA) {
5447 if (pVBInfo->VGAHDE >= 1024) {
5448 temp = 0x02;
5449 if (pVBInfo->LCDInfo & LCDVESATiming)
5450 temp = 0x01;
5451 }
5452 }
5453 }
5454
Aaro Koskinen8104e322011-03-13 12:26:22 +02005455 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305456 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5457 push1 = tempbx;
5458 tempbx--;
5459 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005460 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005462 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463
5464 tempcx = pVBInfo->VT - 1;
5465 push2 = tempcx + 1;
5466 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005467 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305468 temp = (tempcx & 0xFF00) >> 8;
5469 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005470 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005471 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5472 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5473 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5474 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305475
5476 /* Customized LCDB Des no add */
5477 tempbx = 5;
5478 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5479 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5480 tempah = pVBInfo->LCDResInfo;
5481 tempah &= PanelResInfo;
5482
5483 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
5484 tempbx = 1024;
5485 tempcx = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005486 } else if ((tempah == Panel1280x1024) ||
5487 (tempah == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305488 tempbx = 1280;
5489 tempcx = 1024;
5490 } else if (tempah == Panel1400x1050) {
5491 tempbx = 1400;
5492 tempcx = 1050;
5493 } else {
5494 tempbx = 1600;
5495 tempcx = 1200;
5496 }
5497
5498 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5499 tempbx = pVBInfo->HDE;
5500 tempcx = pVBInfo->VDE;
5501 }
5502
5503 pushbx = tempbx;
5504 tempax = pVBInfo->VT;
5505 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5506 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5507 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5508 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5509 tempbx = pVBInfo->LCDVDES;
5510 tempcx += tempbx;
5511
5512 if (tempcx >= tempax)
5513 tempcx -= tempax; /* lcdvdes */
5514
5515 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005516 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305517 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005518 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305519 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5520 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5521 tempah = tempch;
5522 tempah = tempah << 3;
5523 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005524 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305525
5526 /* getlcdsync() */
5527 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5528 tempcx = tempbx;
5529 tempax = pVBInfo->VT;
5530 tempbx = pVBInfo->LCDVRS;
5531
5532 /* if (SetLCD_Info & EnableScalingLCD) */
5533 tempcx += tempbx;
5534 if (tempcx >= tempax)
5535 tempcx -= tempax;
5536
5537 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005538 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305539 temp = (tempbx & 0xFF00) >> 8;
5540 temp = temp << 4;
5541 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005542 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305543 tempcx = pushbx;
5544 tempax = pVBInfo->HT;
5545 tempbx = pVBInfo->LCDHDES;
5546 tempbx &= 0x0FFF;
5547
5548 if (XGI_IsLCDDualLink(pVBInfo)) {
5549 tempax = tempax >> 1;
5550 tempbx = tempbx >> 1;
5551 tempcx = tempcx >> 1;
5552 }
5553
5554 if (pVBInfo->VBType & VB_XGI302LV)
5555 tempbx += 1;
5556
5557 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5558 tempbx += 1;
5559
5560 tempcx += tempbx;
5561
5562 if (tempcx >= tempax)
5563 tempcx -= tempax;
5564
5565 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005566 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305567 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005568 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305569 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005570 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305571 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005572 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305573
5574 /* getlcdsync() */
5575 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5576 tempcx = tempax;
5577 tempax = pVBInfo->HT;
5578 tempbx = pVBInfo->LCDHRS;
5579 /* if ( SetLCD_Info & EnableScalingLCD) */
5580 if (XGI_IsLCDDualLink(pVBInfo)) {
5581 tempax = tempax >> 1;
5582 tempbx = tempbx >> 1;
5583 tempcx = tempcx >> 1;
5584 }
5585
5586 if (pVBInfo->VBType & VB_XGI302LV)
5587 tempbx += 1;
5588
5589 tempcx += tempbx;
5590
5591 if (tempcx >= tempax)
5592 tempcx -= tempax;
5593
5594 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005595 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305596
5597 temp = (tempbx & 0xFF00) >> 8;
5598 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005599 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305600 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005601 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305602
5603 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5604 if (pVBInfo->VGAVDE == 525) {
5605 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5606 | VB_XGI301LV | VB_XGI302LV
5607 | VB_XGI301C)) {
5608 temp = 0xC6;
5609 } else
5610 temp = 0xC4;
5611
Aaro Koskinen8104e322011-03-13 12:26:22 +02005612 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5613 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305614 }
5615
5616 if (pVBInfo->VGAVDE == 420) {
5617 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5618 | VB_XGI301LV | VB_XGI302LV
5619 | VB_XGI301C)) {
5620 temp = 0x4F;
5621 } else
5622 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005623 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305624 }
5625 }
5626}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005627
5628/* --------------------------------------------------------------------- */
5629/* Function : XGI_GetTap4Ptr */
5630/* Input : */
5631/* Output : di -> Tap4 Reg. Setting Pointer */
5632/* Description : */
5633/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005634static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005636{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305637 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305639 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305641 if (tempcx == 0) {
5642 tempax = pVBInfo->VGAHDE;
5643 tempbx = pVBInfo->HDE;
5644 } else {
5645 tempax = pVBInfo->VGAVDE;
5646 tempbx = pVBInfo->VDE;
5647 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005648
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005649 if (tempax <= tempbx)
5650 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305651 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005652 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305654 if (pVBInfo->TVInfo & SetPALTV)
5655 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305657 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005658 if ((pVBInfo->TVInfo & SetYPbPrMode525i) ||
5659 (pVBInfo->TVInfo & SetYPbPrMode525p))
5660 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305661 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5662 Tap4TimingPtr = YPbPr750pTap4Timing;
5663 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005664
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305665 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03005666 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305668 i = 0;
5669 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5670 if (Tap4TimingPtr[i].DE == tempax)
5671 break;
5672 i++;
5673 }
5674 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005675}
5676
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005677static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005678{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305679 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305681 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305683 if (!(pVBInfo->VBType & VB_XGI301C))
5684 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305686 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5687 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005688 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005689
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005690 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5691 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
5692 /* Set Vertical Scaling */
5693 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305694 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005695 xgifb_reg_set(pVBInfo->Part2Port,
5696 i,
5697 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305698 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005699
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005700 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5701 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
5702 /* Enable V.Scaling */
5703 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305704 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005705 /* Enable H.Scaling */
5706 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005707}
5708
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005709static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305710 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005711{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305712 unsigned short i;
5713 unsigned char *tempdi;
5714 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305716 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005717 /* si+St_ResInfo */
5718 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305719 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005720 /* si+Ext_ResInfo */
5721 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005722
Aaro Koskinen8104e322011-03-13 12:26:22 +02005723 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305724 if (pVBInfo->TVInfo & SetPALTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005725 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5726 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305727 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005728 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5729 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305730 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305732 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5733 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305735 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005736 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5737 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
5738 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305741 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
5742 & SetCRT2ToYPbPr)) {
5743 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5744 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005745
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305746 tempdi = pVBInfo->HiTVGroup3Data;
5747 if (pVBInfo->SetFlag & TVSimuMode) {
5748 tempdi = pVBInfo->HiTVGroup3Simu;
5749 if (!(modeflag & Charx8Dot))
5750 tempdi = pVBInfo->HiTVGroup3Text;
5751 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305753 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5754 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305756 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5757 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305759 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005760 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305762 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
5763 if (pVBInfo->TVInfo & SetYPbPrMode525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005764 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305765 }
5766 }
5767 return;
5768} /* {end of XGI_SetGroup3} */
5769
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005770static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305771 unsigned short RefreshRateTableIndex,
5772 struct xgi_hw_device_info *HwDeviceExtension,
5773 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005774{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305775 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305777 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305779 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005780 /* si+St_ResInfo */
5781 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305782 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005783 /* si+Ext_ResInfo */
5784 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305786 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005787 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 tempbx = pVBInfo->RVBHCMAX;
5790 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005791 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305792 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
5793 tempcx = pVBInfo->VGAHT - 1;
5794 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005795 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305797 temp = ((tempcx & 0xFF00) >> 8) << 3;
5798 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005799
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305800 tempcx = pVBInfo->VGAVT - 1;
5801 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5802 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305804 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005805 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305806 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005807 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005808 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305809 tempcx = pVBInfo->VBInfo;
5810 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005811
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305812 if (modeflag & HalfDCLK)
5813 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305815 if (XGI_IsLCDDualLink(pVBInfo))
5816 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305818 if (tempcx & SetCRT2ToHiVisionTV) {
5819 temp = 0;
5820 if (tempbx <= 1024)
5821 temp = 0xA0;
5822 if (tempbx == 1280)
5823 temp = 0xC0;
5824 } else if (tempcx & SetCRT2ToTV) {
5825 temp = 0xA0;
5826 if (tempbx <= 800)
5827 temp = 0x80;
5828 } else {
5829 temp = 0x80;
5830 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5831 temp = 0;
5832 if (tempbx > 800)
5833 temp = 0x60;
5834 }
5835 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005836
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305837 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
5838 temp = 0x00;
5839 if (pVBInfo->VGAHDE == 1280)
5840 temp = 0x40;
5841 if (pVBInfo->VGAHDE == 1024)
5842 temp = 0x20;
5843 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005844 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305846 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005847
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 if (tempcx & SetCRT2ToHiVisionTV) {
5849 if (!(temp & 0xE000))
5850 tempbx = tempbx >> 1;
5851 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305853 tempcx = pVBInfo->RVBHRS;
5854 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005855 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305857 tempeax = pVBInfo->VGAVDE;
5858 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305860 if (tempeax <= tempebx) {
5861 tempcx = (tempcx & (~0x4000));
5862 tempeax = pVBInfo->VGAVDE;
5863 } else {
5864 tempeax -= tempebx;
5865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305867 templong = (tempeax * 256 * 1024) % tempebx;
5868 tempeax = (tempeax * 256 * 1024) / tempebx;
5869 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305871 if (templong != 0)
5872 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005873
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305874 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005875 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305877 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005878 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305879 tempbx = (unsigned short) (tempebx >> 16);
5880 temp = tempbx & 0x00FF;
5881 temp = temp << 4;
5882 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005883 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305885 /* 301b */
5886 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5887 | VB_XGI302LV | VB_XGI301C)) {
5888 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005889 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305890 tempax = pVBInfo->VGAHDE;
5891 if (modeflag & HalfDCLK)
5892 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305894 if (XGI_IsLCDDualLink(pVBInfo))
5895 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005896
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005897 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD)) ||
5898 ((pVBInfo->TVInfo&SetYPbPrMode525p) ||
5899 (pVBInfo->TVInfo&SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305900 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5901 if (tempax > 800)
5902 tempax -= 800;
5903 } else {
5904 if (pVBInfo->VGAHDE > 800) {
5905 if (pVBInfo->VGAHDE == 1024)
5906 tempax = (tempax * 25 / 32) - 1;
5907 else
5908 tempax = (tempax * 20 / 32) - 1;
5909 }
5910 }
5911 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305913 /*
5914 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
5915 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005916 if (!(pVBInfo->TVInfo &
5917 (SetYPbPrMode525p |
5918 SetYPbPrMode750p |
5919 SetYPbPrMode1080i))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305920 if (pVBInfo->VGAHDE > 800) {
5921 if (pVBInfo->VGAHDE == 1024)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005922 tempax =(tempax * 25 /
5923 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305924 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005925 tempax = (tempax * 20 /
5926 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305927 }
5928 }
5929 } else {
5930 if (pVBInfo->VGAHDE > 800) {
5931 if (pVBInfo->VGAHDE == 1024)
5932 tempax = (tempax * 25 / 32) - 1;
5933 else
5934 tempax = (tempax * 20 / 32) - 1;
5935 }
5936 }
5937 }
5938 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005939
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305940 temp = (tempax & 0xFF00) >> 8;
5941 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005942 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305943 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005944 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005945
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305946 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
5947 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005948 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305950 }
5951 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305953 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5954 if (!(pVBInfo->TVInfo & (NTSC1024x768
5955 | SetYPbPrMode525p | SetYPbPrMode750p
5956 | SetYPbPrMode1080i))) {
5957 temp |= 0x0001;
5958 if ((pVBInfo->VBInfo & SetInSlaveMode)
5959 && (!(pVBInfo->TVInfo
5960 & TVSimuMode)))
5961 temp &= (~0x0001);
5962 }
5963 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005964
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005965 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305966 tempbx = pVBInfo->HT;
5967 if (XGI_IsLCDDualLink(pVBInfo))
5968 tempbx = tempbx >> 1;
5969 tempbx = (tempbx >> 1) - 2;
5970 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005971 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305972 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005973 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305974 }
5975 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305977 if (pVBInfo->ISXPDOS == 0)
5978 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5979 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005980}
5981
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005982static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
5983{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005984 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005985}
5986
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005987static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305988 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005989{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305990 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305992 Pindex = pVBInfo->Part5Port;
5993 Pdata = pVBInfo->Part5Port + 1;
5994 if (pVBInfo->ModeType == ModeVGA) {
5995 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
5996 | CRT2DisplayFlag))) {
5997 XGINew_EnableCRT2(pVBInfo);
5998 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
5999 }
6000 }
6001 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006002}
6003
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006004static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306005 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006006{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006007 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006008}
6009
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006010static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306011 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006012{
6013
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006014 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006015}
6016
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006017/* --------------------------------------------------------------------- */
Bill Pemberton80adad82010-06-17 13:10:51 -04006018unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006019{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306020 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006021
Aaro Koskinen58839b02011-03-13 12:26:23 +02006022 index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306023 if (index < sizeof(XGI21_LCDCapList)
6024 / sizeof(struct XGI21_LVDSCapStruct))
6025 return index;
6026 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006027}
6028
6029/* --------------------------------------------------------------------- */
6030/* Function : XGI_XG21SetPanelDelay */
6031/* Input : */
6032/* Output : */
6033/* Description : */
6034/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6035/* : bl : 2 ; T2 : the duration signal on and Vdd on */
6036/* : bl : 3 ; T3 : the duration between CPL off and signal off */
6037/* : bl : 4 ; T4 : the duration signal off and Vdd off */
6038/* --------------------------------------------------------------------- */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306039void XGI_XG21SetPanelDelay(unsigned short tempbl,
6040 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006041{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306042 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006043
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306044 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6045 if (tempbl == 1)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006046 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306048 if (tempbl == 2)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006049 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006050
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306051 if (tempbl == 3)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006052 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306054 if (tempbl == 4)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006055 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056}
6057
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006058unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306059 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006060{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306061 unsigned short xres, yres, colordepth, modeflag, resindex,
6062 lvdstableindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006063
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306064 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6065 if (ModeNo <= 0x13) {
6066 xres = pVBInfo->StResInfo[resindex].HTotal;
6067 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006068 /* si+St_ResInfo */
6069 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306070 } else {
6071 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6072 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006073 /* si+St_ModeFlag */
6074 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306075 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006076
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306077 if (!(modeflag & Charx8Dot)) {
6078 xres /= 9;
6079 xres *= 8;
6080 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006081
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306082 if (ModeNo > 0x13) {
6083 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6084 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306086 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6087 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306089 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306091 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6092 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6093 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04006094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306095 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6096 return 0;
6097
6098 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006099 if ((xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6100 LVDSHDE)) ||
6101 (yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6102 LVDSVDE))) {
6103 colordepth = XGI_GetColorDepth(ModeNo,
6104 ModeIdIndex,
6105 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306106 if (colordepth > 2)
6107 return 0;
6108
6109 }
6110 }
6111 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006112}
6113
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006114static void xgifb_set_lvds(int chip_id,
6115 unsigned short ModeNo,
6116 unsigned short ModeIdIndex,
6117 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006118{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306119 unsigned char temp, Miscdata;
6120 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6121 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6122 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6123 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306125 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006126 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6127 LVDS_Capability &
6128 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306129 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006130 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006131
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006132 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006133
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006134 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6135 LVDS_Capability & LCDPolarity);
6136 /* SR35[7] FP VSync polarity */
6137 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6138 /* SR30[5] FP HSync polarity */
6139 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006140
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006141 if (chip_id == XG27)
6142 XGI_SetXG27FPBits(pVBInfo);
6143 else
6144 XGI_SetXG21FPBits(pVBInfo);
6145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306146 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6147 if (ModeNo <= 0x13) {
6148 xres = pVBInfo->StResInfo[resindex].HTotal;
6149 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006150 /* si+St_ResInfo */
6151 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306152 } else {
6153 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6154 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006155 /* si+St_ModeFlag */
6156 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306159 if (!(modeflag & Charx8Dot))
6160 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306162 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006163
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306164 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6165 - xres) / 2;
6166 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6167 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306169 if (LVDSHBS > LVDSHT)
6170 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006171
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306172 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6173 if (LVDSHRS > LVDSHT)
6174 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306176 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6177 if (LVDSHRE > LVDSHT)
6178 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306180 LVDSHBE = LVDSHBS + LVDSHT
6181 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306183 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306185 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6186 - yres) / 2;
6187 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6188 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306190 if (LVDSVBS > LVDSVT)
6191 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306193 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6194 if (LVDSVRS > LVDSVT)
6195 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006196
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006197 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].
6198 LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306199 if (LVDSVRE > LVDSVT)
6200 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306202 LVDSVBE = LVDSVBS + LVDSVT
6203 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006204
Aaro Koskinen58839b02011-03-13 12:26:23 +02006205 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006206 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306208 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006209 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306211 /* HT SR0B[1:0] CR00 */
6212 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006213 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006214 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006215
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306216 /* HBS SR0B[5:4] CR02 */
6217 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006218 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006219 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006220
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306221 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6222 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006223 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6224 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6225 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306227 /* HRS SR0B[7:6] CR04 */
6228 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006229 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006230 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306232 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6233 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006234 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006235 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006236
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306237 /* HRE SR0C[2] CR05[4:0] */
6238 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006239 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6240 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306242 /* Panel HRE SR2F[7:2] */
6243 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006244 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006245
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306246 /* VT SR0A[0] CR07[5][0] CR06 */
6247 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006248 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6249 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6250 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006251 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306253 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6254 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006255 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6256 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6257 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006258 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006259
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306260 /* VBE SR0A[4] CR16 */
6261 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006262 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006263 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306265 /* VRS SR0A[3] CR7[7][2] CR10 */
6266 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006267 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6268 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6269 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006270 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006271
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006272 if (chip_id == XG27) {
6273 /* Panel VRS SR35[2:0] SR34[7:0] */
6274 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
6275 (value & 0x700) >> 8);
6276 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
6277 } else {
6278 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6279 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
6280 (value & 0x600) >> 9);
6281 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
6282 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
6283 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306285 /* VRE SR0A[5] CR11[3:0] */
6286 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006287 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6288 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306290 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006291 if (chip_id == XG27)
6292 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6293 (value << 2) & 0xFC);
6294 else
6295 /* SR3F[7] has to be 0, h/w bug */
6296 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
6297 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006298
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306299 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006300
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006301 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006302 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006303 0x2B,
6304 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6305 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006306 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006307 0x2C,
6308 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6309 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306310 value += 0x10;
6311 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306313 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006314 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006315 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006316 /* set data, panning = 0, shift left 1 dot*/
6317 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006318
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006319 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006320 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306321
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006322 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306323 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006324
6325}
6326
6327/* --------------------------------------------------------------------- */
6328/* Function : XGI_IsLCDON */
6329/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006330/* Output : 0 : Skip PSC Control */
6331/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006332/* Description : */
6333/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006334static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006335{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306336 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306338 tempax = pVBInfo->VBInfo;
6339 if (tempax & SetCRT2ToDualEdge)
6340 return 0;
6341 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
6342 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006343
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306344 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006345}
6346
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006347/* --------------------------------------------------------------------- */
6348/* Function : XGI_DisableChISLCD */
6349/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006350/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006351/* Description : */
6352/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006353static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006354{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306355 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306357 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006358 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306360 if (tempbx & (EnableChA | DisableChA)) {
6361 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6362 return 0;
6363 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306365 if (!(tempbx & (EnableChB | DisableChB)))
6366 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006367
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306368 if (tempah & 0x01) /* Chk LCDB Mode */
6369 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006370
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306371 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006372}
6373
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006374/* --------------------------------------------------------------------- */
6375/* Function : XGI_EnableChISLCD */
6376/* Input : */
6377/* Output : 0 -> Not LCD mode */
6378/* Description : */
6379/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006380static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006381{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306382 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006383
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306384 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006385 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006386
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306387 if (tempbx & (EnableChA | DisableChA)) {
6388 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6389 return 0;
6390 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306392 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006393 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306395 if (tempah & 0x01) /* Chk LCDB Mode */
6396 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306398 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006399}
6400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306401void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
6402 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006403{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006404 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306406 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6407 | VB_XGI302LV | VB_XGI301C)) {
6408 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006409 if (!(pVBInfo->VBInfo &
6410 (DisableCRT2Display | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306411 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6412 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6413 tempah = 0x7F; /* Disable Channel A */
6414 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006415 /* Disable Channel B */
6416 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306418 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006419 /* force to disable Cahnnel */
6420 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306422 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006423 /* Force to disable Channel B */
6424 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306425 }
6426 }
6427 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006428
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006429 /* disable part4_1f */
6430 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306432 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6433 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
6434 || (XGI_DisableChISLCD(pVBInfo))
6435 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006436 /* LVDS Driver power down */
6437 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306438 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306440 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6441 & (DisableCRT2Display | SetCRT2ToLCDA
6442 | SetSimuScanMode))) {
6443 if (pVBInfo->SetFlag & GatingCRT)
6444 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
6445 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6446 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306448 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6449 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6450 & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006451 /* Power down */
6452 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306453 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006454
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006455 /* disable TV as primary VGA swap */
6456 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306458 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02006459 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006460
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006461 if ((pVBInfo->SetFlag & DisableChB) ||
6462 (pVBInfo->VBInfo &
6463 (DisableCRT2Display | SetSimuScanMode)) ||
6464 ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) &&
6465 (pVBInfo->VBInfo &
6466 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
6467 /* BScreenOff=1 */
6468 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006469
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006470 if ((pVBInfo->SetFlag & DisableChB) ||
6471 (pVBInfo->VBInfo &
6472 (DisableCRT2Display | SetSimuScanMode)) ||
6473 (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) ||
6474 (pVBInfo->VBInfo &
6475 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
6476 /* save Part1 index 0 */
6477 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
6478 /* BTDAC = 1, avoid VB reset */
6479 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
6480 /* disable CRT2 */
6481 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6482 /* restore Part1 index 0 */
6483 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306484 }
6485 } else { /* {301} */
6486 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006487 /* BScreenOff=1 */
6488 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
6489 /* Disable CRT2 */
6490 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6491 /* Disable TV asPrimary VGA swap */
6492 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306495 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
6496 | SetSimuScanMode))
6497 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6498 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006499}
6500
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006501/* --------------------------------------------------------------------- */
6502/* Function : XGI_GetTVPtrIndex */
6503/* Input : */
6504/* Output : */
6505/* Description : bx 0 : ExtNTSC */
6506/* 1 : StNTSC */
6507/* 2 : ExtPAL */
6508/* 3 : StPAL */
6509/* 4 : ExtHiTV */
6510/* 5 : StHiTV */
6511/* 6 : Ext525i */
6512/* 7 : St525i */
6513/* 8 : Ext525p */
6514/* 9 : St525p */
6515/* A : Ext750p */
6516/* B : St750p */
6517/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006518static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006519{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306520 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306522 if (pVBInfo->TVInfo & SetPALTV)
6523 tempbx = 2;
6524 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
6525 tempbx = 4;
6526 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6527 tempbx = 6;
6528 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6529 tempbx = 8;
6530 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6531 tempbx = 10;
6532 if (pVBInfo->TVInfo & TVSimuMode)
6533 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006534
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306535 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006536}
6537
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006538/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006539/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006540/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006541/* Output : bx 0 : NTSC */
6542/* 1 : PAL */
6543/* 2 : PALM */
6544/* 3 : PALN */
6545/* 4 : NTSC1024x768 */
6546/* 5 : PAL-M 1024x768 */
6547/* 6-7: reserved */
6548/* cl 0 : YFilter1 */
6549/* 1 : YFilter2 */
6550/* ch 0 : 301A */
6551/* 1 : 301B/302B/301LV/302LV */
6552/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006553/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006554static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
6555 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006556{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006557 *tempbx = 0;
6558 *tempcl = 0;
6559 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006560
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006561 if (pVBInfo->TVInfo & SetPALTV)
6562 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006563
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006564 if (pVBInfo->TVInfo & SetPALMTV)
6565 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006566
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006567 if (pVBInfo->TVInfo & SetPALNTV)
6568 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006569
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006570 if (pVBInfo->TVInfo & NTSC1024x768) {
6571 *tempbx = 4;
6572 if (pVBInfo->TVInfo & SetPALMTV)
6573 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306574 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006575
6576 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6577 | VB_XGI302LV | VB_XGI301C)) {
6578 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
6579 & TVSimuMode)) {
6580 *tempbx += 8;
6581 *tempcl += 1;
6582 }
6583 }
6584
6585 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6586 | VB_XGI302LV | VB_XGI301C))
6587 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006588}
6589
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006590static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006591{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306592 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306594 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306596 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6597 | VB_XGI302LV | VB_XGI301C)) {
6598 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
6599 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
6600 tempbl = 0;
6601 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306603 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
6604 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006605
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306606 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
6607 | VB_XGI301LV | VB_XGI302LV
6608 | VB_XGI301C))
6609 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306611 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
6612 tempbl = tempbl >> 4;
6613 /*
6614 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
6615 tempbl = CRT2Delay1; // Get CRT2 Delay
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006616 if (pVBInfo->VBType &
6617 (VB_XGI301B |
6618 VB_XGI302B |
6619 VB_XGI301LV |
6620 VB_XGI302LV |
6621 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306622 tempbl = CRT2Delay2;
6623 */
6624 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006625 /* Get LCD Delay */
6626 index = XGI_GetLCDCapPtr(pVBInfo);
6627 tempbh = pVBInfo->LCDCapList[index].
6628 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306630 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
6631 tempbl = tempbh;
6632 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306634 tempbl &= 0x0F;
6635 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02006636 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006637
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306638 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
6639 | SetCRT2ToTV)) { /* Channel B */
6640 tempah &= 0xF0;
6641 tempah |= tempbl;
6642 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306644 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
6645 tempah &= 0x0F;
6646 tempah |= tempbh;
6647 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006648 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306649 }
6650 } else if (pVBInfo->IF_DEF_LVDS == 1) {
6651 tempbl = 0;
6652 tempbh = 0;
6653 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006654 /* / Get LCD Delay */
6655 tempah = pVBInfo->LCDCapList[
6656 XGI_GetLCDCapPtr(pVBInfo)].
6657 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306658 tempah &= 0x0f;
6659 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006660 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306661 tempah);
6662 }
6663 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006664}
6665
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006666static void XGI_SetLCDCap_A(unsigned short tempcx,
6667 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006668{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306669 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006670
Aaro Koskinen58839b02011-03-13 12:26:23 +02006671 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006672
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306673 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006674 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006675 /* Enable Dither */
6676 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006677 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306678 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006679 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306680 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006681 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306682 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306684 /*
6685 if (tempcx & EnableLCD24bpp) { // 24bits
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006686 xgifb_reg_and_or(pVBInfo->Part1Port,
6687 0x19,
6688 0x0F,
6689 (unsigned short)(0x30 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006690 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306691 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006692 xgifb_reg_and_or(pVBInfo->Part1Port,
6693 0x19,
6694 0x0F,
6695 // Enable Dither
6696 (unsigned short)(0x20 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006697 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306698 }
6699 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006700}
6701
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006702/* --------------------------------------------------------------------- */
6703/* Function : XGI_SetLCDCap_B */
6704/* Input : cx -> LCD Capability */
6705/* Output : */
6706/* Description : */
6707/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006708static void XGI_SetLCDCap_B(unsigned short tempcx,
6709 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006710{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306711 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006712 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306713 (unsigned short) (((tempcx & 0x00ff) >> 6)
6714 | 0x0c));
6715 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006716 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306717 (unsigned short) (((tempcx & 0x00ff) >> 6)
6718 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006719}
6720
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02006721static void XGI_LongWait(struct vb_device_info *pVBInfo)
6722{
6723 unsigned short i;
6724
6725 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
6726
6727 if (!(i & 0xC0)) {
6728 for (i = 0; i < 0xFFFF; i++) {
6729 if (!(inb(pVBInfo->P3da) & 0x08))
6730 break;
6731 }
6732
6733 for (i = 0; i < 0xFFFF; i++) {
6734 if ((inb(pVBInfo->P3da) & 0x08))
6735 break;
6736 }
6737 }
6738}
6739
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006740static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006741{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306742 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006743
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306744 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006745
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006746 /* disable down spectrum D[4] */
6747 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306748 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006749 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306750 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006751
Aaro Koskinen8104e322011-03-13 12:26:22 +02006752 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306753 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006754 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306755 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006756 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306757 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006758 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306759 pVBInfo->LCDCapList[index].Spectrum_34);
6760 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006761 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006762}
6763
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006764static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
6765{
6766 unsigned short tempcx;
6767
6768 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
6769
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006770 if (pVBInfo->VBType &
6771 (VB_XGI301B |
6772 VB_XGI302B |
6773 VB_XGI301LV |
6774 VB_XGI302LV |
6775 VB_XGI301C)) { /* 301LV/302LV only */
6776 if (pVBInfo->VBType &
6777 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006778 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006779 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006780 (unsigned char) (tempcx & 0x1F));
6781 }
6782 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006783 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006784 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
6785 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
6786 | EnablePLLSPLOW)) >> 8));
6787 }
6788
6789 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6790 | VB_XGI302LV | VB_XGI301C)) {
6791 if (pVBInfo->VBInfo & SetCRT2ToLCD)
6792 XGI_SetLCDCap_B(tempcx, pVBInfo);
6793 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
6794 XGI_SetLCDCap_A(tempcx, pVBInfo);
6795
6796 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6797 if (tempcx & EnableSpectrum)
6798 SetSpectrum(pVBInfo);
6799 }
6800 } else {
6801 /* LVDS,CH7017 */
6802 XGI_SetLCDCap_A(tempcx, pVBInfo);
6803 }
6804}
6805
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006806/* --------------------------------------------------------------------- */
6807/* Function : XGI_SetAntiFlicker */
6808/* Input : */
6809/* Output : */
6810/* Description : Set TV Customized Param. */
6811/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006812static void XGI_SetAntiFlicker(unsigned short ModeNo,
6813 unsigned short ModeIdIndex,
6814 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006815{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306816 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306818 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306820 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
6821 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306823 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6824 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306826 if (ModeNo <= 0x13)
6827 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
6828 else
6829 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306831 tempbx += index;
6832 tempah = TVAntiFlickList[tempbx];
6833 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006834
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006835 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006836}
6837
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006838static void XGI_SetEdgeEnhance(unsigned short ModeNo,
6839 unsigned short ModeIdIndex,
6840 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, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306844 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306846 tempbx = XGI_GetTVPtrIndex(pVBInfo);
6847 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006848
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306849 if (ModeNo <= 0x13)
6850 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
6851 else
6852 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306854 tempbx += index;
6855 tempah = TVEdgeList[tempbx];
6856 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006857
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006858 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006859}
6860
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006861static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006862{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306863 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306865 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306867 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306869 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
6870 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006871
Aaro Koskinen8104e322011-03-13 12:26:22 +02006872 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306873 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006874 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306875 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006876 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306877 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006878 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306879 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006880}
6881
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006882static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306883 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006884{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306885 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306887 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006888
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306889 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306891 switch (tempbx) {
6892 case 0x00:
6893 case 0x04:
6894 filterPtr = NTSCYFilter1;
6895 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306897 case 0x01:
6898 filterPtr = PALYFilter1;
6899 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306901 case 0x02:
6902 case 0x05:
6903 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306904 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03006905 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306906 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306908 case 0x08:
6909 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306910 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306911 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306912 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03006913 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306914 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306916 default:
6917 return;
6918 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306920 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006921 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
6922 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306923 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006924 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
6925 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006926
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306927 if (tempcl == 0)
6928 index = tempal * 4;
6929 else
6930 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306932 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006933 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
6934 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
6935 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
6936 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306937 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006938 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
6939 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
6940 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
6941 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306942 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306944 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6945 | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006946 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
6947 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
6948 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306949 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006950}
6951
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006952/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006953/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006954/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006955/* Output : */
6956/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006957/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006958static void XGI_OEM310Setting(unsigned short ModeNo,
6959 unsigned short ModeIdIndex,
6960 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006961{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006962 /* GetPart1IO(); */
6963 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006964
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006965 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
6966 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006967
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006968 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6969 /* GetPart2IO() */
6970 XGI_SetPhaseIncr(pVBInfo);
6971 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
6972 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006973
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006974 if (pVBInfo->VBType & VB_XGI301)
6975 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306976 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006977}
6978
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006979/* --------------------------------------------------------------------- */
6980/* Function : XGI_SetCRT2ModeRegs */
6981/* Input : */
6982/* Output : */
6983/* Description : Origin code for crt2group */
6984/* --------------------------------------------------------------------- */
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006985void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306986 struct xgi_hw_device_info *HwDeviceExtension,
6987 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006988{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306989 unsigned short tempbl;
6990 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306992 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006993
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006994 /* // fix write part1 index 0 BTDRAM bit Bug
6995 * xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306996 tempah = 0;
6997 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006998 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306999 tempah &= ~0x10; /* BTRAMDAC */
7000 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307002 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7003 | SetCRT2ToLCD)) {
7004 tempah = 0x40; /* BTDRAM */
7005 if (ModeNo > 0x13) {
7006 tempcl = pVBInfo->ModeType;
7007 tempcl -= ModeVGA;
7008 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007009 /* BT Color */
7010 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307011 if (tempah == 0)
7012 tempah = 1;
7013 tempah |= 0x040;
7014 }
7015 }
7016 if (pVBInfo->VBInfo & SetInSlaveMode)
7017 tempah ^= 0x50; /* BTDAC */
7018 }
7019 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007020
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307021 /* 0210 shampoo
7022 if (pVBInfo->VBInfo & DisableCRT2Display) {
7023 tempah = 0;
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 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7028 tempcl = pVBInfo->ModeType;
7029 if (ModeNo > 0x13) {
7030 tempcl -= ModeVGA;
7031 if ((tempcl > 0) || (tempcl == 0)) {
7032 tempah=(0x008>>tempcl) ;
7033 if (tempah == 0)
7034 tempah = 1;
7035 tempah |= 0x040;
7036 }
7037 } else {
7038 tempah = 0x040;
7039 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307041 if (pVBInfo->VBInfo & SetInSlaveMode) {
7042 tempah = (tempah ^ 0x050);
7043 }
7044 }
7045 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007046
Aaro Koskinen8104e322011-03-13 12:26:22 +02007047 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307048 tempah = 0x08;
7049 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007050
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307051 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007052 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307053 } else {
7054 tempah = 0x00;
7055 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307057 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7058 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007059 if ((pVBInfo->VBInfo & SetCRT2ToLCDA) &&
7060 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307061 tempbl &= 0xf7;
7062 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007063 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307064 tempbl, tempah);
7065 } else {
7066 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7067 tempbl &= 0xf7;
7068 tempah |= 0x01;
7069 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007070
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007071 if (pVBInfo->VBInfo &
7072 (SetCRT2ToRAMDAC |
7073 SetCRT2ToTV |
7074 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307075 tempbl &= 0xf8;
7076 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307078 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7079 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007080
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007081 if (!(pVBInfo->VBInfo &
7082 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307083 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007084 if (!(pVBInfo->VBInfo &
7085 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307086 tempah = tempah ^ 0x01;
7087 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007088
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007089 if (!(pVBInfo->VBInfo &
7090 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307091 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007092 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307093 0x2e, tempbl, tempah);
7094 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007095 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307096 0x2e, tempbl, tempah);
7097 }
7098 }
7099 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007100 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307101 tempah);
7102 }
7103 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307105 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7106 | SetCRT2ToLCDA)) {
7107 tempah &= (~0x08);
7108 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7109 & SetInSlaveMode))) {
7110 tempah |= 0x010;
7111 }
7112 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307114 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007115 /* if (!(pVBInfo->TVInfo &
7116 (SetYPbPrMode525p | SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307117 tempah |= 0x020;
7118 if (ModeNo > 0x13) {
7119 if (pVBInfo->VBInfo & DriverMode)
7120 tempah = tempah ^ 0x20;
7121 }
7122 /* } */
7123 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007124
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007125 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307126 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307128 if (pVBInfo->LCDInfo & SetLCDDualLink)
7129 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307131 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007132 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) &&
7133 (!(pVBInfo->TVInfo &
7134 (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307135 if (pVBInfo->TVInfo & RPLLDIV2XO)
7136 tempah |= 0x40;
7137 /* } */
7138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307140 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7141 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7142 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307144 if (pVBInfo->LCDResInfo == Panel1280x960)
7145 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007146
Aaro Koskinen8104e322011-03-13 12:26:22 +02007147 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307148 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307150 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7151 | VB_XGI302LV | VB_XGI301C)) {
7152 tempah = 0;
7153 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007154
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307155 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7156 tempbl = 0xff;
7157 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7158 tempah |= 0x04; /* shampoo 0129 */
7159 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007160
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007161 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307162 tempah = 0x00;
7163 tempbl = 0xcf;
7164 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7165 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7166 tempah |= 0x30;
7167 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007168
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007169 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307170 tempah = 0;
7171 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307173 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7174 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7175 tempah |= 0xc0;
7176 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007177 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307178 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307180 tempah = 0;
7181 tempbl = 0x7f;
7182 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
7183 tempbl = 0xff;
7184 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
7185 tempah |= 0x80;
7186 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007187
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007188 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307190 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7191 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007192 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
7193 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307194 }
7195 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007196}
7197
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007198static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307199 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007200{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307201 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007202
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307203 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007204
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307205 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7206 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007207
7208}
7209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307210void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7211 struct vb_device_info *pVBInfo)
7212{
7213
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007214 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007215
7216}
7217
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307218void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7219 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007220{
7221
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007222 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007223
7224}
7225
Bill Pemberton80adad82010-06-17 13:10:51 -04007226unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007227{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307228 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307230 if (pVBInfo->IF_DEF_LVDS == 1) {
7231 return 1;
7232 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007233 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307234 if ((flag == 1) || (flag == 2))
7235 return 1; /* 301b */
7236 else
7237 return 0;
7238 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007239}
7240
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007241static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007242{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307243 unsigned short tempal, temp, i, j;
7244 return;
7245 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
7246 temp = 0;
7247 for (i = 0; i < 3; i++) {
7248 for (j = 0; j < 100; j++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007249 tempal = inb(pVBInfo->P3da);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307250 if (temp & 0x01) { /* VBWaitMode2 */
7251 if ((tempal & 0x08))
7252 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307254 if (!(tempal & 0x08))
7255 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307257 } else { /* VBWaitMode1 */
7258 if (!(tempal & 0x08))
7259 continue;
7260
7261 if ((tempal & 0x08))
7262 break;
7263 }
7264 }
7265 temp = temp ^ 0x01;
7266 }
7267 } else {
7268 XGI_LongWait(pVBInfo);
7269 }
7270 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007271}
7272
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007273unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
7274 unsigned short ModeNo, unsigned short ModeIdIndex,
7275 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007276{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007277 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
7278 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
7279 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007280
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007281 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007282
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007283 if (ModeNo <= 0x13)
7284 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7285 else
7286 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7287
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007288 if (ModeNo < 0x14)
7289 return 0xFFFF;
7290
Aaro Koskinen58839b02011-03-13 12:26:23 +02007291 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007292 index = index >> pVBInfo->SelectCRT2Rate;
7293 index &= 0x0F;
7294
7295 if (pVBInfo->LCDInfo & LCDNonExpanding)
7296 index = 0;
7297
7298 if (index > 0)
7299 index--;
7300
7301 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007302 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7303 if (pVBInfo->IF_DEF_LVDS == 0) {
7304 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7305 | VB_XGI301LV | VB_XGI302LV
7306 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007307 /* 301b */
7308 temp = LCDARefreshIndex[
7309 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007310 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007311 temp = LCDRefreshIndex[
7312 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007313
7314 if (index > temp)
7315 index = temp;
7316 } else {
7317 index = 0;
7318 }
7319 }
7320 }
7321
7322 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
7323 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
7324 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
7325 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007326 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag &
7327 XG2xNotSupport) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007328 index++;
7329 }
7330 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007331 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
7332 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007333 index++;
7334 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007335 /* Alan 10/19/2007;
7336 * do the similar adjustment like XGISearchCRT1Rate() */
7337 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
7338 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007339 index++;
7340 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007341 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
7342 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007343 index++;
7344 }
7345 }
7346
7347 i = 0;
7348 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007349 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
7350 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007351 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007352 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
7353 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007354 temp &= ModeInfoFlag;
7355 if (temp < pVBInfo->ModeType)
7356 break;
7357 i++;
7358 index--;
7359
7360 } while (index != 0xFFFF);
7361 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7362 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007363 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
7364 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007365 if (temp & InterlaceMode)
7366 i++;
7367 }
7368 }
7369 i--;
7370 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7371 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7372 RefreshRateTableIndex, &i, pVBInfo);
7373 }
7374 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007375}
7376
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007377static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307378 struct xgi_hw_device_info *HwDeviceExtension,
7379 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007380{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007381 unsigned short RefreshRateTableIndex;
7382 /* unsigned short temp ; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007383
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007384 /* pVBInfo->SelectCRT2Rate = 0; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007385
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007386 pVBInfo->SetFlag |= ProgrammingCRT2;
7387 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7388 ModeIdIndex, pVBInfo);
7389 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7390 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7391 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7392 HwDeviceExtension, pVBInfo);
7393 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7394 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007395}
7396
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007397unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
7398 struct xgi_hw_device_info *HwDeviceExtension,
7399 struct vb_device_info *pVBInfo)
7400{
7401 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7402
7403 tempbx = pVBInfo->VBInfo;
7404 pVBInfo->SetFlag |= ProgrammingCRT2;
7405 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7406 pVBInfo->SelectCRT2Rate = 4;
7407 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7408 ModeIdIndex, pVBInfo);
7409 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7410 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7411 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7412 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7413 RefreshRateTableIndex, pVBInfo);
7414 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7415 RefreshRateTableIndex, pVBInfo);
7416 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7417 RefreshRateTableIndex, pVBInfo);
7418 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7419 HwDeviceExtension, pVBInfo);
7420 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7421 RefreshRateTableIndex, pVBInfo);
7422 XGI_SetTap4Regs(pVBInfo);
7423 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7424 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7425 HwDeviceExtension, pVBInfo);
7426 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7427 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7428 XGI_AutoThreshold(pVBInfo);
7429 return 1;
7430}
7431
7432void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7433{
7434 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7435 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7436 0x05, 0x00 };
7437
7438 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7439
7440 unsigned char CR17, CR63, SR31;
7441 unsigned short temp;
7442 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7443
7444 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007445 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007446
7447 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007448 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007449 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007450 pVBInfo->P3d4, 0x53) | 0x02));
7451
Aaro Koskinen58839b02011-03-13 12:26:23 +02007452 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
7453 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
7454 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007455
Aaro Koskinen8104e322011-03-13 12:26:22 +02007456 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7457 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007458
Aaro Koskinen58839b02011-03-13 12:26:23 +02007459 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007460 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007461
Aaro Koskinen58839b02011-03-13 12:26:23 +02007462 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007463 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007464
Aaro Koskinen58839b02011-03-13 12:26:23 +02007465 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007466 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02007467 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007468 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007469
Aaro Koskinen8104e322011-03-13 12:26:22 +02007470 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007471
7472 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007473 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007474
7475 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007476 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007477 CRTCData[i]);
7478
7479 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007480 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007481 CRTCData[i]);
7482
7483 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007484 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007485 CRTCData[i]);
7486
Aaro Koskinen8104e322011-03-13 12:26:22 +02007487 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007488 & 0xE0));
7489
Aaro Koskinen8104e322011-03-13 12:26:22 +02007490 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7491 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7492 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007493
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007494 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007495
7496 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007497 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
7498 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
7499 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007500 }
7501
7502 XGI_VBLongWait(pVBInfo);
7503 XGI_VBLongWait(pVBInfo);
7504 XGI_VBLongWait(pVBInfo);
7505
7506 mdelay(1);
7507
7508 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007509 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007510
7511 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007512 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007513 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007514 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007515
7516 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007517 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007518
7519 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007520 outb(0, (pVBInfo->P3c8 + 1));
7521 outb(0, (pVBInfo->P3c8 + 1));
7522 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007523 }
7524
Aaro Koskinen8104e322011-03-13 12:26:22 +02007525 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
7526 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
7527 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007528
7529 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02007530 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007531 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007532 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007533}
7534
7535void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
7536 struct vb_device_info *pVBInfo)
7537{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02007538 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007539
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007540 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7541 | VB_XGI302LV | VB_XGI301C)) {
7542 if (!(pVBInfo->SetFlag & DisableChA)) {
7543 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007544 /* Power on */
7545 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007546 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007547 /* SetCRT2ToLCDA ) */
7548 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7549 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007550 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007551 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007552 }
7553 }
7554 }
7555
7556 if (!(pVBInfo->SetFlag & DisableChB)) {
7557 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
7558 & (SetCRT2ToLCD | SetCRT2ToTV
7559 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007560 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007561 pVBInfo->P3c4, 0x32);
7562 tempah &= 0xDF;
7563 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007564 if (!(pVBInfo->VBInfo &
7565 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007566 tempah |= 0x20;
7567 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007568 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007569 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007570
Aaro Koskinen58839b02011-03-13 12:26:23 +02007571 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007572 pVBInfo->Part1Port, 0x2E);
7573
7574 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007575 /* BVBDOENABLE = 1 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007576 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007577 0x2E, 0x80);
7578 /* BScreenOFF = 0 */
7579 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007580 }
7581 }
7582
7583 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
7584 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007585 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007586 0x20); /* shampoo 0129 */
7587 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7588 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007589 if (XGI_EnableChISLCD(pVBInfo) ||
7590 (pVBInfo->VBInfo &
7591 (SetCRT2ToLCD | SetCRT2ToLCDA)))
7592 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02007593 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007594 pVBInfo->Part4Port,
7595 0x2A,
7596 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007597 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007598 /* LVDS Driver power on */
7599 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007600 }
7601 }
7602
7603 tempah = 0x00;
7604
7605 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7606 tempah = 0xc0;
7607
7608 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
7609 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007610 if (pVBInfo->VBInfo &
7611 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007612 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007613 if (pVBInfo->VBInfo &
7614 SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007615 tempah = tempah ^ 0xC0;
7616
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007617 if (pVBInfo->SetFlag &
7618 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007619 tempah &= 0xBF;
7620
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007621 if (pVBInfo->SetFlag &
7622 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007623 tempah &= 0x7F;
7624
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007625 if (pVBInfo->SetFlag &
7626 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007627 tempah |= 0x40;
7628
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007629 if (pVBInfo->SetFlag &
7630 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007631 tempah |= 0x80;
7632 }
7633 }
7634 }
7635 }
7636
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007637 /* EnablePart4_1F */
7638 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007639
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007640 if (!(pVBInfo->SetFlag & DisableChA)) {
7641 XGI_VBLongWait(pVBInfo);
7642 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007643 XGI_DisableGatingCRT(HwDeviceExtension,
7644 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007645 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7646 XGI_VBLongWait(pVBInfo);
7647 }
7648 }
7649 } /* 301 */
7650 else { /* LVDS */
7651 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
7652 | SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007653 /* enable CRT2 */
7654 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007655
Aaro Koskinen58839b02011-03-13 12:26:23 +02007656 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007657 0x2E);
7658 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007659 /* BVBDOENABLE = 1 */
7660 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007661
Aaro Koskinendc505562011-03-13 12:26:26 +02007662 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007663 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7664 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007665}
7666
7667static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
7668 unsigned short ModeNo, unsigned short ModeIdIndex,
7669 struct vb_device_info *pVBInfo)
7670{
7671 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
7672
7673 unsigned short XGINew_P3cc = pVBInfo->P3cc;
7674
7675 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
7676 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
7677 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
7678 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
7679 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7680 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
7681 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
7682 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
7683 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
7684 XGI_ClearExt1Regs(pVBInfo);
7685
7686 /* if (pVBInfo->IF_DEF_ExpLink) */
7687 if (HwDeviceExtension->jChipType == XG27) {
7688 if (pVBInfo->IF_DEF_LVDS == 0)
7689 XGI_SetDefaultVCLK(pVBInfo);
7690 }
7691
7692 temp = ~ProgrammingCRT2;
7693 pVBInfo->SetFlag &= temp;
7694 pVBInfo->SelectCRT2Rate = 0;
7695
7696 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7697 | VB_XGI302LV | VB_XGI301C)) {
7698 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
7699 | SetInSlaveMode)) {
7700 pVBInfo->SetFlag |= ProgrammingCRT2;
7701 }
7702 }
7703
7704 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7705 ModeIdIndex, pVBInfo);
7706 if (RefreshRateTableIndex != 0xFFFF) {
7707 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
7708 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7709 pVBInfo, HwDeviceExtension);
7710 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
7711 RefreshRateTableIndex, pVBInfo);
7712 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7713 HwDeviceExtension, pVBInfo);
7714 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
7715 RefreshRateTableIndex, pVBInfo);
7716 }
7717
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007718 if ((HwDeviceExtension->jChipType >= XG20) &&
7719 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007720 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007721 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
7722 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007723 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007724 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007725 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
7726 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007727 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7728 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007729 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007730 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007731 }
7732 }
7733
7734 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007735 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007736 if (temp & 0xA0) {
7737
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007738 /* Enable write GPIOF */
7739 /* xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); */
7740 /* P. DWN */
7741 /* xgifb_reg_and(pVBInfo->P3d4, 0x48, ~0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007742 /* XG21 CRT1 Timing */
7743 if (HwDeviceExtension->jChipType == XG27)
7744 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
7745 RefreshRateTableIndex, pVBInfo);
7746 else
7747 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
7748 RefreshRateTableIndex, pVBInfo);
7749
7750 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
7751 RefreshRateTableIndex);
7752
Aaro Koskinen105d8d02011-08-31 21:46:00 +03007753 xgifb_set_lcd(HwDeviceExtension->jChipType,
7754 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007755
Aaro Koskinen64db29f2011-08-31 21:46:01 +03007756 if (pVBInfo->IF_DEF_LVDS == 1)
7757 xgifb_set_lvds(HwDeviceExtension->jChipType,
7758 ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007759 /* P. ON */
7760 /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007761 }
7762 }
7763
7764 pVBInfo->SetFlag &= (~ProgrammingCRT2);
7765 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
7766 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
7767 RefreshRateTableIndex, pVBInfo);
7768
7769 /* XGI_LoadCharacter(); //dif ifdef TVFont */
7770
7771 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
7772 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
7773}
7774
7775unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
7776 unsigned short ModeNo)
7777{
7778 unsigned short ModeIdIndex;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007779 /* unsigned char *pVBInfo->FBAddr =
7780 HwDeviceExtension->pjVideoMemoryAddress; */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007781 struct vb_device_info VBINF;
7782 struct vb_device_info *pVBInfo = &VBINF;
7783 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
7784 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
7785 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007786 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007787
7788 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
7789 pVBInfo->IF_DEF_YPbPr = 0;
7790 pVBInfo->IF_DEF_HiVision = 0;
7791 pVBInfo->IF_DEF_CRT2Monitor = 0;
7792 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007793 } else {
7794 pVBInfo->IF_DEF_YPbPr = 1;
7795 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02007796 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007797 }
7798
7799 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
7800 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
7801 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
7802 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
7803 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
7804 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
7805 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
7806 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
7807 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
7808 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
7809 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
7810 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
7811 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
7812 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
7813 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
7814 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
7815 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
7816 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
7817
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007818 /* for x86 Linux, XG21 LVDS */
7819 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007820 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007821 pVBInfo->IF_DEF_LVDS = 1;
7822 }
7823 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007824 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
7825 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007826 pVBInfo->IF_DEF_LVDS = 1;
7827 }
7828 }
7829
7830 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
7831 XGI_GetVBType(pVBInfo);
7832
7833 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
7834 if (ModeNo & 0x80) {
7835 ModeNo = ModeNo & 0x7F;
7836 /* XGINew_flag_clearbuffer = 0; */
7837 }
7838 /* else {
7839 XGINew_flag_clearbuffer = 1;
7840 }
7841 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007842 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007843
7844 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
7845 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
7846
7847 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7848
7849 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
7850
7851 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7852 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
7853 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
7854 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
7855 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007856
7857 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
7858 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
7859 ModeIdIndex, pVBInfo);
7860
7861 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7862 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7863 HwDeviceExtension, pVBInfo);
7864 }
7865 } else {
7866 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
7867 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
7868 ModeIdIndex, pVBInfo);
7869 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7870 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
7871 HwDeviceExtension,
7872 pVBInfo);
7873 }
7874 }
7875 }
7876
7877 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
7878 switch (HwDeviceExtension->ujVBChipID) {
7879 case VB_CHIP_301:
7880 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7881 pVBInfo); /*add for CRT2 */
7882 break;
7883
7884 case VB_CHIP_302:
7885 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
7886 pVBInfo); /*add for CRT2 */
7887 break;
7888
7889 default:
7890 break;
7891 }
7892 }
7893
7894 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
7895 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
7896 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
7897 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
7898 } /* !XG20 */
7899 else {
7900 if (pVBInfo->IF_DEF_LVDS == 1)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007901 if (!XGI_XG21CheckLVDSMode(ModeNo,
7902 ModeIdIndex,
7903 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007904 return 0;
7905
7906 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007907 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
7908 St_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007909 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007910 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
7911 Ext_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007912 }
7913
7914 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03007915 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007916
7917 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7918
7919 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
7920 pVBInfo);
7921
7922 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7923 /*
7924 if (HwDeviceExtension->jChipType == XG21)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007925 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007926 */
7927 }
7928
7929 /*
7930 if (ModeNo <= 0x13) {
7931 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7932 } else {
7933 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7934 }
7935 pVBInfo->ModeType = modeflag&ModeInfoFlag;
7936 pVBInfo->SetFlag = 0x00;
7937 pVBInfo->VBInfo = DisableCRT2Display;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007938 temp = XGINew_CheckMemorySize(HwDeviceExtension,
7939 ModeNo,
7940 ModeIdIndex,
7941 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007942
7943 if (temp == 0)
7944 return (0);
7945
7946 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
7947 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
7948 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
7949 */
7950
7951 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
7952
7953 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
7954 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
7955 }
7956
7957 return 1;
7958}