blob: dc4d6e6fc9b37c326a95239da220b87e772fa313 [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002#include <linux/io.h>
Aaro Koskinend80aaa02011-02-17 23:29:14 +02003#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include <linux/types.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
8#include "vb_def.h"
9#include "vgatypes.h"
10#include "vb_struct.h"
11#include "vb_util.h"
12#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020013#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020014
15
16#define IndexMask 0xff
17#ifndef XGI_MASK_DUAL_CHIP
18#define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */
19#endif
20
Randy Dunlap89229672010-08-10 08:46:44 -070021static unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
24 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
25 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
27 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
28 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
29 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020030
Randy Dunlap89229672010-08-10 08:46:44 -070031static unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040032 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
33 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
34 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
35 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
36 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
37 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
38 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
39 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020040
Randy Dunlap89229672010-08-10 08:46:44 -070041static unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040042 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
43 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
44 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
45 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
46 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
47 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
48 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
49 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020050
Randy Dunlap89229672010-08-10 08:46:44 -070051static unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040052 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
53 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
54 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
55 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
56 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
57 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
58 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
59 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
60 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
61 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020062
Bill Pemberton80adad82010-06-17 13:10:51 -040063void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020064{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053065 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
66 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
67 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
68 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
69 pVBInfo->XGINEWUB_CRT1Table
70 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020071
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053072 /* add for new UNIVGABIOS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +080073 /* XGINew_UBLCDDataTable =
74 * (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053075 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020076
Aaro Koskinen06587332011-03-13 12:26:10 +020077 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
78 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053079 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
80 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
81 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
82 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
83 pVBInfo->ModeResInfo
84 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053086 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
87 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
88 pVBInfo->pSR07 = &XGI330_SR07;
89 pVBInfo->LCDResInfo = 0;
90 pVBInfo->LCDTypeInfo = 0;
91 pVBInfo->LCDInfo = 0;
92 pVBInfo->VBInfo = 0;
93 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053095 pVBInfo->SR15 = XGI340_SR13;
96 pVBInfo->CR40 = XGI340_cr41;
97 pVBInfo->SR25 = XGI330_sr25;
98 pVBInfo->pSR31 = &XGI330_sr31;
99 pVBInfo->pSR32 = &XGI330_sr32;
100 pVBInfo->CR6B = XGI340_CR6B;
101 pVBInfo->CR6E = XGI340_CR6E;
102 pVBInfo->CR6F = XGI340_CR6F;
103 pVBInfo->CR89 = XGI340_CR89;
104 pVBInfo->AGPReg = XGI340_AGPReg;
105 pVBInfo->SR16 = XGI340_SR16;
106 pVBInfo->pCRCF = &XG40_CRCF;
107 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 pVBInfo->CR49 = XGI330_CR49;
110 pVBInfo->pSR1F = &XGI330_SR1F;
111 pVBInfo->pSR21 = &XGI330_SR21;
112 pVBInfo->pSR22 = &XGI330_SR22;
113 pVBInfo->pSR23 = &XGI330_SR23;
114 pVBInfo->pSR24 = &XGI330_SR24;
115 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530117 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
118 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
119 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
120 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
121 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
122 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
123 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
124 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
125 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
126 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530128 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
129 pVBInfo->PALTiming = XGI330_PALTiming;
130 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
131 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
132 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
133 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
134 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
135 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
136 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
137 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
138 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
139 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
140 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
141 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530143 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
144 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
145 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530147 pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC;
148 pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC;
149 pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL;
150 pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530152 /* 310 customization related */
153 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
154 pVBInfo->LCDCapList = XGI_LCDDLCapList;
155 else
156 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 if ((ChipType == XG21) || (ChipType == XG27))
159 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530161 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
162 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200163
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530164 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530166 if (ChipType >= XG20)
167 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530169 if (ChipType == XG27) {
170 pVBInfo->MCLKData
171 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
172 pVBInfo->CR40 = XGI27_cr41;
173 pVBInfo->pXGINew_CR97 = &XG27_CR97;
174 pVBInfo->pSR36 = &XG27_SR36;
175 pVBInfo->pCR8F = &XG27_CR8F;
176 pVBInfo->pCRD0 = XG27_CRD0;
177 pVBInfo->pCRDE = XG27_CRDE;
178 pVBInfo->pSR40 = &XG27_SR40;
179 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530183 if (ChipType >= XG20) {
184 pVBInfo->pDVOSetting = &XG21_DVOSetting;
185 pVBInfo->pCR2E = &XG21_CR2E;
186 pVBInfo->pCR2F = &XG21_CR2F;
187 pVBInfo->pCR46 = &XG21_CR46;
188 pVBInfo->pCR47 = &XG21_CR47;
189 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200190
191}
192
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800193static unsigned char XGI_GetModePtr(unsigned short ModeNo,
194 unsigned short ModeIdIndex,
195 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200196{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530197 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530199 if (ModeNo <= 0x13)
200 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
201 else {
202 if (pVBInfo->ModeType <= 0x02)
203 index = 0x1B; /* 02 -> ModeEGA */
204 else
205 index = 0x0F;
206 }
207 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200208}
209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530210/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800211unsigned char XGI_SetBIOSData(unsigned short ModeNo,
212 unsigned short ModeIdIndex) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530213 return (0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200214}
215*/
216
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800217/* unsigned char XGI_ClearBankRegs(unsigned short ModeNo,
218 unsigned short ModeIdIndex) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530219 return( 0 ) ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220}
221*/
222
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800223static void XGI_SetSeqRegs(unsigned short ModeNo,
224 unsigned short StandTableIndex,
225 unsigned short ModeIdIndex,
226 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530228 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530229 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530231 if (ModeNo <= 0x13)
232 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
233 else
234 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Aaro Koskinen8104e322011-03-13 12:26:22 +0200236 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530237 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200238
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530239 i = SetCRT2ToLCDA;
240 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
241 tempah |= 0x01;
242 } else {
243 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
244 if (pVBInfo->VBInfo & SetInSlaveMode)
245 tempah |= 0x01;
246 }
247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530249 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200250 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200251
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530252 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800253 /* Get SR2,3,4 from file */
254 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200255 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530256 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200257}
258
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200259static void XGI_SetMiscRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800260 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200261{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530262 unsigned char Miscdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200263
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800264 /* Get Misc from file */
265 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530266 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800267 if (pVBInfo->VBType & (VB_XGI301B |
268 VB_XGI302B |
269 VB_XGI301LV |
270 VB_XGI302LV |
271 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530272 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
273 Miscdata |= 0x0C;
274 }
275 }
276 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200277
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200278 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200279}
280
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200281static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800282 unsigned short StandTableIndex,
283 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200284{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530285 unsigned char CRTCdata;
286 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200287
Aaro Koskinen58839b02011-03-13 12:26:23 +0200288 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530289 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200290 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200291
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530292 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800293 /* Get CRTC from file */
294 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200295 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530296 }
297 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800298 if ((HwDeviceExtension->jChipType == XGI_630) &&
299 (HwDeviceExtension->jChipRevision == 0x30)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530300 if (pVBInfo->VBInfo & SetInSlaveMode) {
301 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200302 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530303 }
304 }
305 }
306 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200307}
308
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800309static void XGI_SetATTRegs(unsigned short ModeNo,
310 unsigned short StandTableIndex,
311 unsigned short ModeIdIndex,
312 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200313{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 unsigned char ARdata;
315 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200316
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530317 if (ModeNo <= 0x13)
318 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
319 else
320 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200321
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530322 for (i = 0; i <= 0x13; i++) {
323 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
324 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
325 if (i == 0x13) {
326 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
327 ARdata = 0;
328 } else {
329 if (pVBInfo->VBInfo & (SetCRT2ToTV
330 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800331 if (pVBInfo->VBInfo &
332 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530333 ARdata = 0;
334 }
335 }
336 }
337 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200338
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200339 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200340 outb(i, pVBInfo->P3c0); /* set index */
341 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200343
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200344 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200345 outb(0x14, pVBInfo->P3c0); /* set index */
346 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200347 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200348 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200349}
350
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200351static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800352 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530354 unsigned char GRdata;
355 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530357 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800358 /* Get GR from file */
359 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200360 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530361 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530363 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200364 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530365 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200366 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530367 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368}
369
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200370static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200371{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530372 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530374 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200375 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200376}
377
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200378static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200379{
380
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200381 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200382 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
383 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200384
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200385 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200386 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
387 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200388
Aaro Koskinendc505562011-03-13 12:26:26 +0200389 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200391}
392
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200393static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530394 unsigned short ModeIdIndex,
395 unsigned short RefreshRateTableIndex, unsigned short *i,
396 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200397{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530398 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800401 /* si+St_ModeFlag */
402 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530403 else
404 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
407 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
408 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200409
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530410 if (pVBInfo->IF_DEF_LVDS == 0) {
411 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
412 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530414 if (pVBInfo->VBType & VB_XGI301C)
415 tempax |= SupportCRT2in301C;
416 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200417
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800418 /* 301b */
419 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530420 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 if (pVBInfo->LCDResInfo != Panel1280x1024) {
423 if (pVBInfo->LCDResInfo != Panel1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800424 if (pVBInfo->LCDInfo &
425 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530426 if (resinfo >= 9) {
427 tempax = 0;
428 return 0;
429 }
430 }
431 }
432 }
433 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530435 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800436 if ((pVBInfo->VBType & VB_XGI301LV) &&
437 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530438 tempax |= SupportYPbPr;
439 if (pVBInfo->VBInfo & SetInSlaveMode) {
440 if (resinfo == 4)
441 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530443 if (resinfo == 3)
444 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200445
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530446 if (resinfo > 7)
447 return 0;
448 }
449 } else {
450 tempax |= SupportHiVisionTV;
451 if (pVBInfo->VBInfo & SetInSlaveMode) {
452 if (resinfo == 4)
453 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530455 if (resinfo == 3) {
456 if (pVBInfo->SetFlag
457 & TVSimuMode)
458 return 0;
459 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530461 if (resinfo > 7)
462 return 0;
463 }
464 }
465 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800466 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
467 SetCRT2ToSVIDEO |
468 SetCRT2ToSCART |
469 SetCRT2ToYPbPr |
470 SetCRT2ToHiVisionTV)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530471 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200472
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530473 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
474 | VB_XGI301LV | VB_XGI302LV
475 | VB_XGI301C)) {
476 tempax |= SupportTV1024;
477 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200478
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530479 if (!(pVBInfo->VBInfo & SetPALTV)) {
480 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800481 if (pVBInfo->VBInfo &
482 SetInSlaveMode) {
483 if (!(pVBInfo->VBInfo &
484 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530485 return 0;
486 }
487 }
488 }
489 }
490 }
491 }
492 } else { /* for LVDS */
493 if (pVBInfo->IF_DEF_CH7005 == 1) {
494 if (pVBInfo->VBInfo & SetCRT2ToTV)
495 tempax |= SupportCHTV;
496 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530498 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
499 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530501 if (resinfo > 0x08)
502 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200503
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530504 if (pVBInfo->LCDResInfo < Panel1024x768) {
505 if (resinfo > 0x07)
506 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530508 if (resinfo == 0x04)
509 return 0; /* 512x384 */
510 }
511 }
512 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200513
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800514 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
515 tempbx; (*i)--) {
516 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
517 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530518 if (infoflag & tempax)
519 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200520
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530521 if ((*i) == 0)
522 break;
523 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530525 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800526 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
527 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530528 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
529 != tempbx) {
530 return 0;
531 }
532
533 if (infoflag & tempax)
534 return 1;
535 }
536 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200537}
538
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200539static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530540 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200541{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530542 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200543
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800544 /* di+0x00 */
545 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530546 sync &= 0xC0;
547 temp = 0x2F;
548 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200549 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200550}
551
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200552static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530553 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200554{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530555 unsigned char data, data1, pushax;
556 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200557
Aaro Koskinen8104e322011-03-13 12:26:22 +0200558 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
559 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200560 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200561
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800562 /* unlock cr0-7 */
563 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530564 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200565 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530567 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200568 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530570 for (i = 0x01; i <= 0x04; i++) {
571 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200572 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530575 for (i = 0x05; i <= 0x06; i++) {
576 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200577 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530578 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200579
Aaro Koskinen58839b02011-03-13 12:26:23 +0200580 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530581 j &= 0x1F;
582 data = pVBInfo->TimingH[0].data[7];
583 data &= 0xE0;
584 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200585 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530587 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200588 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530589 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200590 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200591 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530592 data1 = data;
593 data1 &= 0xE0;
594 data &= 0x1F;
595 if (data == 0) {
596 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200597 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530598 0x0c);
599 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200600 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530601 data = pushax;
602 }
603 data = data - 1;
604 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200605 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200606 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530607 data = data >> 5;
608 data = data + 3;
609 if (data > 7)
610 data = data - 7;
611 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200612 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530613 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200614}
615
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800616static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
617 unsigned short ModeNo,
618 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200619{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530620 unsigned char data;
621 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200622
Aaro Koskinen8104e322011-03-13 12:26:22 +0200623 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
624 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200625 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530627 for (i = 0x00; i <= 0x01; i++) {
628 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200629 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530630 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530632 for (i = 0x02; i <= 0x03; i++) {
633 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200634 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530635 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530637 for (i = 0x04; i <= 0x05; i++) {
638 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200639 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200641
Aaro Koskinen58839b02011-03-13 12:26:23 +0200642 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530643 j &= 0xC0;
644 data = pVBInfo->TimingV[0].data[6];
645 data &= 0x3F;
646 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200647 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530649 data = pVBInfo->TimingV[0].data[6];
650 data &= 0x80;
651 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530653 if (ModeNo <= 0x13)
654 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
655 else
656 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530658 i &= DoubleScanMode;
659 if (i)
660 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200661
Aaro Koskinen58839b02011-03-13 12:26:23 +0200662 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530663 j &= 0x5F;
664 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200665 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200666}
667
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200668static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
669 unsigned short RefreshRateTableIndex,
670 struct vb_device_info *pVBInfo,
671 struct xgi_hw_device_info *HwDeviceExtension)
672{
673 unsigned char index, data;
674 unsigned short i;
675
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800676 /* Get index */
677 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200678 index = index & IndexMask;
679
Aaro Koskinen58839b02011-03-13 12:26:23 +0200680 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200681 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200682 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200683
684 for (i = 0; i < 8; i++)
685 pVBInfo->TimingH[0].data[i]
686 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
687
688 for (i = 0; i < 7; i++)
689 pVBInfo->TimingV[0].data[i]
690 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
691
692 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
693
694 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
695
696 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200697 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200698}
699
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200700/* --------------------------------------------------------------------- */
701/* Function : XGI_SetXG21CRTC */
702/* Input : Stand or enhance CRTC table */
703/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
704/* Description : Set LCD timing */
705/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200706static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530707 unsigned short RefreshRateTableIndex,
708 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200709{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530710 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
711 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200712
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530713 if (ModeNo <= 0x13) {
714 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800715 /* CR04 HRS */
716 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
717 /* SR2E [7:0]->HRS */
718 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
719 /* Tempbx: CR05 HRE */
720 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530721 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
722 Tempcx = Tempax;
723 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
724 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
725 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
726 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
727 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800728 /* SR2F [7:2]->HRE */
729 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200730 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200731
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800732 /* Tempax: CR16 VRS */
733 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530734 Tempbx = Tempax; /* Tempbx=Tempax */
735 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200736 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800737
738 /* Tempax: CR7 VRS */
739 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530740 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
741 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
742 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
743 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800744 /* SR34[7:0]: VRS[8:1] */
745 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200746
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800747 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
748 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530749 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
750 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
751 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
752 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200753
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800754 /* CR16 VRE */
755 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530756 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
757 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
758 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
759 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
760 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
761 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
762 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
763 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
764 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
765 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
766 Temp1 >>= 9; /* [10:9]->[1:0] */
767 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
768 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
769 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800770 /* SR3F D[7:2]->VRE D[1:0]->VRS */
771 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 } else {
773 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800774 /* Tempax: CR4 HRS */
775 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530776 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800777 /* SR2E[7:0]->HRS */
778 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530780 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
781 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
782 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
783 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
784 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530786 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
787 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530789 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
790 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
791 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
792 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200793
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530794 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
795 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530797 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
798 if (Tempax < Tempcx) /* HRE < HRS */
799 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530801 Temp2 &= 0xFF;
802 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
803 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
804 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
805 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800806 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
807 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200808 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800810 /* CR10 VRS */
811 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530812 Tempbx = Tempax; /* Tempbx: VRS */
813 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200814 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800815 /* CR7[2][7] VRE */
816 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530817 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
818 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
819 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
820 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200821 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530823 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
824 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
825 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
826 Tempax &= 0x80;
827 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
828 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800829 /* Tempax: SRA */
830 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530831 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
832 Temp2 = Tempax;
833 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
834 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200835
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800836 /* Tempax: CR11 VRE */
837 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530838 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800839 /* Tempbx: SRA */
840 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530841 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
842 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
843 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
844 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
845 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530847 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
848 if (Tempax < Temp3) /* VRE < VRS */
849 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530851 Temp2 &= 0xFF;
852 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
853 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
854 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
855 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
856 Tempbx = (unsigned char) Temp1;
857 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
858 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800859 /* SR3F D[7:2]->VRE D[1:0]->VRS */
860 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530861 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200862}
863
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800864static void XGI_SetXG27CRTC(unsigned short ModeNo,
865 unsigned short ModeIdIndex,
866 unsigned short RefreshRateTableIndex,
867 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200868{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400869 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530871 if (ModeNo <= 0x13) {
872 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800873 /* CR04 HRS */
874 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
875 /* SR2E [7:0]->HRS */
876 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
877 /* Tempbx: CR05 HRE */
878 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530879 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
880 Tempcx = Tempax;
881 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
882 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
883 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
884 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
885 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800886 /* SR2F [7:2]->HRE */
887 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200888 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200889
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800890 /* Tempax: CR10 VRS */
891 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200892 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530893 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800894 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
895 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530896 Tempbx = Tempax; /* Tempbx=CR07 */
897 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
898 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800899 /* SR35 D[0]->VRS D[8] */
900 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
902 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200903
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800904 /* CR11 VRE */
905 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530906 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
907 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
908 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
909 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
910 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
911 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800912 /* Tempax[7:0]: VRE[7:0] */
913 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530914 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
915 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800916 /* SR3F D[7:2]->VRE D[5:0] */
917 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
918 /* SR35 D[2:1]->VRS[10:9] */
919 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530920 } else {
921 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800922 /* Tempax: CR4 HRS */
923 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530924 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800925 /* SR2E[7:0]->HRS */
926 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200927
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800928 /* SR0B */
929 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530930 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
931 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200932
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530933 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
934 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
935 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530937 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
938 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
939 Tempax <<= 3; /* Tempax[5]: HRE[5] */
940 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530942 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
943 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200944
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800945 /* Tempax: CR4 HRS */
946 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530947 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
948 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
949 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530951 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
952 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
953 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
954 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800955 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
956 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200957 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200958
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800959 /* CR10 VRS */
960 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
961 /* SR34[7:0]->VRS[7:0] */
962 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530964 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800965 /* CR7[7][2] VRS[9][8] */
966 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530967 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
968 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
969 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800970 /* SR35[0]: VRS[8] */
971 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530972 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
973 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800974 /* Tempax: SR0A */
975 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530976 Tempax &= 0x08; /* SR0A[3] VRS[10] */
977 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200978
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800979 /* Tempax: CR11 VRE */
980 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530981 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800982 /* Tempbx: SR0A */
983 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530984 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
985 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
986 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
987 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
988 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
989 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530991 if (Tempbx <= Tempcx) /* VRE <= VRS */
992 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200993
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800994 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
995 Tempax = (Tempbx << 2) & 0xFF;
996 /* SR3F[7:2]:VRE[5:0] */
997 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800999 /* SR35[2:0]:VRS[10:8] */
1000 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301001 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001002}
1003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001004/* --------------------------------------------------------------------- */
1005/* Function : XGI_SetXG21LCD */
1006/* Input : */
1007/* Output : FCLK duty cycle, FCLK delay compensation */
1008/* Description : All values set zero */
1009/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001010static void XGI_SetXG21LCD(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301011 unsigned short RefreshRateTableIndex, unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001012{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001013 unsigned short Data, Temp, b3CC;
1014 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301016 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001017
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1019 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1020 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1021 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301022 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001023 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1024 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1025 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1026 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301027 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001028
Aaro Koskinen58839b02011-03-13 12:26:23 +02001029 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301031 if (Temp & 0x01) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001032 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40); /* 18 bits FP */
1033 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301034 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001035
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001036 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001037
Aaro Koskinendc505562011-03-13 12:26:26 +02001038 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20);
1039 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301041 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001042 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301043 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001044 /* Hsync polarity */
1045 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301046 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001047 /* Vsync polarity */
1048 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301049 } else {
1050 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1051 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001052 /* Hsync polarity */
1053 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301054 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001055 /* Vsync polarity */
1056 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301057 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001058}
1059
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001060static void XGI_SetXG27LCD(struct vb_device_info *pVBInfo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001061 unsigned short RefreshRateTableIndex,
1062 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001063{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301064 unsigned short Data, Temp, b3CC;
1065 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001066
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301067 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001068
Aaro Koskinen8104e322011-03-13 12:26:22 +02001069 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1070 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1071 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1072 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001073
Aaro Koskinen58839b02011-03-13 12:26:23 +02001074 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301075 if ((Temp & 0x03) == 0) { /* dual 12 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001076 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
1077 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301078 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301080 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001081 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1082 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1083 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1084 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301085 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001086
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301087 XGI_SetXG27FPBits(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001088
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001089 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001090
Aaro Koskinendc505562011-03-13 12:26:26 +02001091 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1092 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001093
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301094 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001095 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301096 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001097 /* Hsync polarity */
1098 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001100 /* Vsync polarity */
1101 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301102 } else {
1103 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1104 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001105 /* Hsync polarity */
1106 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301107 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001108 /* Vsync polarity */
1109 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301110 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001111}
1112
1113/* --------------------------------------------------------------------- */
1114/* Function : XGI_UpdateXG21CRTC */
1115/* Input : */
1116/* Output : CRT1 CRTC */
1117/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1118/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001119static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1120 struct vb_device_info *pVBInfo,
1121 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001122{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301123 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001124
Aaro Koskinendc505562011-03-13 12:26:26 +02001125 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301126 if (ModeNo <= 0x13) {
1127 for (i = 0; i < 12; i++) {
1128 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1129 index = i;
1130 }
1131 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001132 if (ModeNo == 0x2E &&
1133 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1134 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301135 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001136 else if (ModeNo == 0x2E &&
1137 (pVBInfo->RefIndex[RefreshRateTableIndex].
1138 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 index = 13;
1140 else if (ModeNo == 0x2F)
1141 index = 14;
1142 else if (ModeNo == 0x50)
1143 index = 15;
1144 else if (ModeNo == 0x59)
1145 index = 16;
1146 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001147
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301148 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001149 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301150 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001151 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301152 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001153 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301154 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001155 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 pVBInfo->UpdateCRT1[index].CR16);
1157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001158}
1159
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001160static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 unsigned short ModeNo, unsigned short ModeIdIndex,
1162 unsigned short RefreshRateTableIndex,
1163 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001164{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001165 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301167 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301169 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 if (ModeNo <= 0x13) {
1172 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1173 tempax = pVBInfo->StResInfo[resindex].HTotal;
1174 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1175 } else {
1176 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1177 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1178 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301181 if (modeflag & HalfDCLK)
1182 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301184 if (ModeNo > 0x13) {
1185 if (modeflag & HalfDCLK)
1186 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301188 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301190 if (temp & InterlaceMode)
1191 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301193 if (modeflag & DoubleScanMode)
1194 tempbx = tempbx << 1;
1195 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301197 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001198
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301199 /* if (!(modeflag & Charx8Dot)) */
1200 /* tempcx = 9; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301202 tempax /= tempcx;
1203 tempax -= 1;
1204 tempbx -= 1;
1205 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001206 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1207 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301208 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001209 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1210 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001211 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301212 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001213 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301214 tempax = 0;
1215 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001216
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301217 if (tempbx & 0x01)
1218 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001219
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301220 if (tempbx & 0x02)
1221 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001222
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001223 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001224 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301225 data &= 0xFF;
1226 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301228 if (tempbx & 0x04)
1229 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001230
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001231 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001232 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001233}
1234
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001235unsigned short XGI_GetResInfo(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301236 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001237{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001238 unsigned short resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301240 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001241 /* si+St_ResInfo */
1242 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301243 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001244 /* si+Ext_ResInfo */
1245 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301246 return resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247}
1248
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001249static void XGI_SetCRT1Offset(unsigned short ModeNo,
1250 unsigned short ModeIdIndex,
1251 unsigned short RefreshRateTableIndex,
1252 struct xgi_hw_device_info *HwDeviceExtension,
1253 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001254{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301255 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301257 /* GetOffset */
1258 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1259 temp = temp >> 8;
1260 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301262 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1263 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301265 if (temp2)
1266 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001267
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301268 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301270 switch (temp2) {
1271 case 0:
1272 temp2 = 1;
1273 break;
1274 case 1:
1275 temp2 = 2;
1276 break;
1277 case 2:
1278 temp2 = 4;
1279 break;
1280 case 3:
1281 temp2 = 4;
1282 break;
1283 case 4:
1284 temp2 = 6;
1285 break;
1286 case 5:
1287 temp2 = 8;
1288 break;
1289 default:
1290 break;
1291 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301293 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1294 temp = temp * temp2 + temp2 / 2;
1295 else
1296 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001297
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301298 /* SetOffset */
1299 DisplayUnit = temp;
1300 temp2 = temp;
1301 temp = temp >> 8; /* ah */
1302 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001303 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301304 i &= 0xF0;
1305 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001306 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001307
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301308 temp = (unsigned char) temp2;
1309 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001310 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301312 /* SetDisplayUnit */
1313 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1314 temp2 &= InterlaceMode;
1315 if (temp2)
1316 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301318 DisplayUnit = DisplayUnit << 5;
1319 ah = (DisplayUnit & 0xff00) >> 8;
1320 al = DisplayUnit & 0x00ff;
1321 if (al == 0)
1322 ah += 1;
1323 else
1324 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301326 if (HwDeviceExtension->jChipType >= XG20)
1327 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1328 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001329
Aaro Koskinen8104e322011-03-13 12:26:22 +02001330 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001331}
1332
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001333static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1334 unsigned short ModeIdIndex,
1335 unsigned short RefreshRateTableIndex,
1336 struct xgi_hw_device_info *HwDeviceExtension,
1337 struct vb_device_info *pVBInfo)
1338{
1339 unsigned short tempbx;
1340
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001341 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2,
1342 VCLK65 + 2,
1343 VCLK65 + 2,
1344 VCLK65 + 2 };
1345 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5,
1346 VCLK108_2 + 5,
1347 VCLK108_2 + 5,
1348 VCLK108_2 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001349 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001350 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2,
1351 VCLK65 + 2,
1352 VCLK65 + 2,
1353 VCLK65 + 2 };
1354 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2,
1355 VCLK65 + 2,
1356 VCLK65 + 2,
1357 VCLK65 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001358
1359 unsigned short CRT2Index, VCLKIndex;
1360 unsigned short modeflag, resinfo;
1361 unsigned char *CHTVVCLKPtr = NULL;
1362
1363 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001364 /* si+St_ResInfo */
1365 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001366 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1367 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1368 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001369 /* si+Ext_ResInfo */
1370 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001371 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001372 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1373 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001374 }
1375
1376 if (pVBInfo->IF_DEF_LVDS == 0) {
1377 CRT2Index = CRT2Index >> 6; /* for LCD */
1378 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1379 if (pVBInfo->LCDResInfo != Panel1024x768)
1380 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1381 else
1382 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1383 } else { /* for TV */
1384 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1385 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1386 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1387 VCLKIndex = HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001388 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001389 } else {
1390 VCLKIndex = HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001391 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001392 }
1393
1394 if (pVBInfo->SetFlag & TVSimuMode) {
1395 if (modeflag & Charx8Dot) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001396 VCLKIndex =
1397 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001398 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001399 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001400 VCLKIndex =
1401 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001402 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001403 }
1404 }
1405
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001406 /* 301lv */
1407 if (pVBInfo->VBType & VB_XGI301LV) {
1408 if (!(pVBInfo->VBExtInfo ==
1409 VB_YPbPr1080i)) {
1410 VCLKIndex =
1411 YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001412 if (!(pVBInfo->VBExtInfo
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001413 ==
1414 VB_YPbPr750p)) {
1415 VCLKIndex =
1416 YPbPr525pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001417 if (!(pVBInfo->VBExtInfo
1418 == VB_YPbPr525p)) {
1419 VCLKIndex
1420 = YPbPr525iVCLK_2;
1421 if (!(pVBInfo->SetFlag
1422 & RPLLDIV2XO))
1423 VCLKIndex
1424 = YPbPr525iVCLK;
1425 }
1426 }
1427 }
1428 }
1429 } else {
1430 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001431 if (pVBInfo->SetFlag &
1432 RPLLDIV2XO) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001433 VCLKIndex = TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001434 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001435 } else {
1436 VCLKIndex = TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001437 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001438 }
1439 }
1440 }
1441 } else { /* for CRT2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001442 /* Port 3cch */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001443 VCLKIndex = (unsigned char) inb(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001444 (pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001445 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1446 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001447 /* di+Ext_CRTVCLK */
1448 VCLKIndex =
1449 pVBInfo->RefIndex[
1450 RefreshRateTableIndex].
1451 Ext_CRTVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001452 VCLKIndex &= IndexMask;
1453 }
1454 }
1455 }
1456 } else { /* LVDS */
1457 if (ModeNo <= 0x13)
1458 VCLKIndex = CRT2Index;
1459 else
1460 VCLKIndex = CRT2Index;
1461
1462 if (pVBInfo->IF_DEF_CH7005 == 1) {
1463 if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) {
1464 VCLKIndex &= 0x1f;
1465 tempbx = 0;
1466
1467 if (pVBInfo->VBInfo & SetPALTV)
1468 tempbx += 2;
1469
1470 if (pVBInfo->VBInfo & SetCHTVOverScan)
1471 tempbx += 1;
1472
1473 switch (tempbx) {
1474 case 0:
1475 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC;
1476 break;
1477 case 1:
1478 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC;
1479 break;
1480 case 2:
1481 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL;
1482 break;
1483 case 3:
1484 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL;
1485 break;
1486 default:
1487 break;
1488 }
1489
1490 VCLKIndex = CHTVVCLKPtr[VCLKIndex];
1491 }
1492 } else {
1493 VCLKIndex = VCLKIndex >> 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001494 if ((pVBInfo->LCDResInfo == Panel800x600) ||
1495 (pVBInfo->LCDResInfo == Panel320x480))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001496 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001497 else if ((pVBInfo->LCDResInfo == Panel1024x768) ||
1498 (pVBInfo->LCDResInfo == Panel1024x768x75))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001499 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1500 else
1501 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
1502 }
1503 }
1504 /* VCLKIndex = VCLKIndex&IndexMask; */
1505
1506 return VCLKIndex;
1507}
1508
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001509static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1510 unsigned short ModeIdIndex,
1511 struct xgi_hw_device_info *HwDeviceExtension,
1512 unsigned short RefreshRateTableIndex,
1513 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001514{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001515 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301516 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001517
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301518 if (pVBInfo->IF_DEF_LVDS == 1) {
1519 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001520 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001521 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1522 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301523 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001524 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301525 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001526 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301527 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1528 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1529 & SetCRT2ToLCDA)) {
1530 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1531 RefreshRateTableIndex, HwDeviceExtension,
1532 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001533 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001534 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301535 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001536 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301537 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001538 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1539 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301540 } else {
1541 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001542 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001543 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1544 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301545 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001546 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301547 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001548 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301549 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001550
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301551 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001552 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1553 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001554 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001555 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001556 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301557 index = data;
1558 index &= 0xE0;
1559 data &= 0x1F;
1560 data = data << 1;
1561 data += 1;
1562 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001563 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301564 }
1565 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001566}
1567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001568static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301569 struct xgi_hw_device_info *HwDeviceExtension,
1570 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001571{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301572 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001573
Aaro Koskinen58839b02011-03-13 12:26:23 +02001574 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301575 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001576 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301578 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001579 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001580 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301581 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001582 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001583 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301584 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001585 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301586 } else {
1587 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001588 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001589 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301590 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001591 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301592 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001593 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001594 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301595 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001596 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301597 }
1598 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301600 if (HwDeviceExtension->jChipType == XG21)
1601 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001602}
1603
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001604static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1605 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1606 struct vb_device_info *pVBInfo)
1607{
1608 unsigned short data, data2 = 0;
1609 short VCLK;
1610
1611 unsigned char index;
1612
1613 if (ModeNo <= 0x13)
1614 VCLK = 0;
1615 else {
1616 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1617 index &= IndexMask;
1618 VCLK = pVBInfo->VCLKData[index].CLOCK;
1619 }
1620
Aaro Koskinen58839b02011-03-13 12:26:23 +02001621 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001622 data &= 0xf3;
1623 if (VCLK >= 200)
1624 data |= 0x0c; /* VCLK > 200 */
1625
1626 if (HwDeviceExtension->jChipType >= XG20)
1627 data &= ~0x04; /* 2 pixel mode */
1628
Aaro Koskinen8104e322011-03-13 12:26:22 +02001629 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001630
1631 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001632 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001633 data &= 0xE7;
1634 if (VCLK < 200)
1635 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001636 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001637 }
1638
1639 /* Jong for Adavantech LCD ripple issue
1640 if ((VCLK >= 0) && (VCLK < 135))
1641 data2 = 0x03;
1642 else if ((VCLK >= 135) && (VCLK < 160))
1643 data2 = 0x02;
1644 else if ((VCLK >= 160) && (VCLK < 260))
1645 data2 = 0x01;
1646 else if (VCLK > 260)
1647 data2 = 0x00;
1648 */
1649 data2 = 0x00;
1650
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001651 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001652 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001653 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001654
1655}
1656
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001657static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301658 unsigned short ModeNo, unsigned short ModeIdIndex,
1659 unsigned short RefreshRateTableIndex,
1660 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001661{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301662 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1663 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001664
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301665 if (ModeNo > 0x13) {
1666 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001667 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1668 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301669 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001670 /* si+St_ModeFlag */
1671 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001672
Aaro Koskinen58839b02011-03-13 12:26:23 +02001673 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001674 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001675
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301676 if (ModeNo > 0x13)
1677 data = infoflag;
1678 else
1679 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301681 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301683 if (ModeNo > 0x13) {
1684 if (pVBInfo->ModeType > 0x02) {
1685 data2 |= 0x02;
1686 data3 = pVBInfo->ModeType - ModeVGA;
1687 data3 = data3 << 2;
1688 data2 |= data3;
1689 }
1690 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301692 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301694 if (data)
1695 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001696
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001697 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001698 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301699 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1700 if (ModeNo <= 0x13)
1701 xres = pVBInfo->StResInfo[resindex].HTotal;
1702 else
1703 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301705 data = 0x0000;
1706 if (infoflag & InterlaceMode) {
1707 if (xres == 1024)
1708 data = 0x0035;
1709 else if (xres == 1280)
1710 data = 0x0048;
1711 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001712
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301713 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001714 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301715 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001716 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001717
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301718 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001719 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301721 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301723 if (modeflag & LineCompareOff)
1724 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301726 if (ModeNo > 0x13) {
1727 if (pVBInfo->ModeType == ModeEGA)
1728 data2 |= 0x40;
1729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001730
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001731 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301732 data = 0x60;
1733 if (pVBInfo->ModeType != ModeText) {
1734 data = data ^ 0x60;
1735 if (pVBInfo->ModeType != ModeEGA)
1736 data = data ^ 0xA0;
1737 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001738 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301740 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1741 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301743 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1744 /* if (XGINew_IF_DEF_NEW_LOWRES) */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001745 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex);
1746 * //030305 fix lowresolution bug */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001747
Aaro Koskinen58839b02011-03-13 12:26:23 +02001748 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301750 if (HwDeviceExtension->jChipType == XG27) {
1751 if (data & 0x40)
1752 data = 0x2c;
1753 else
1754 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001755 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001756 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301757 } else if (HwDeviceExtension->jChipType >= XG20) {
1758 if (data & 0x40)
1759 data = 0x33;
1760 else
1761 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001762 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1763 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301764 } else {
1765 if (data & 0x40)
1766 data = 0x2c;
1767 else
1768 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001769 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001771
1772}
1773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301774/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001775void XGI_VesaLowResolution(unsigned short ModeNo,
1776 unsigned short ModeIdIndex,
1777 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001778{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301779 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301781 if (ModeNo > 0x13)
1782 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1783 else
1784 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301786 if (ModeNo > 0x13) {
1787 if (modeflag & DoubleScanMode) {
1788 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001789 if (pVBInfo->VBType & VB_XGI301B |
1790 VB_XGI302B |
1791 VB_XGI301LV |
1792 VB_XGI302LV |
1793 VB_XGI301C)) {
1794 if (!(pVBInfo->VBInfo &
1795 SetCRT2ToRAMDAC)) {
1796 if (pVBInfo->VBInfo &
1797 SetInSlaveMode) {
1798 xgifb_reg_and_or(
1799 pVBInfo->P3c4,
1800 0x01,
1801 0xf7,
1802 0x00);
1803 xgifb_reg_and_or(
1804 pVBInfo->P3c4,
1805 0x0f,
1806 0x7f,
1807 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301808 return;
1809 }
1810 }
1811 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001812 xgifb_reg_and_or(pVBInfo->P3c4,
1813 0x0f,
1814 0xff,
1815 0x80);
1816 xgifb_reg_and_or(pVBInfo->P3c4,
1817 0x01,
1818 0xf7,
1819 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301820 return;
1821 }
1822 }
1823 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001824 xgifb_reg_and_or(pVBInfo->P3c4, 0x0f, 0x7f, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001825}
1826*/
1827
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001828static void XGI_WriteDAC(unsigned short dl,
1829 unsigned short ah,
1830 unsigned short al,
1831 unsigned short dh,
1832 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001833{
1834 unsigned short temp, bh, bl;
1835
1836 bh = ah;
1837 bl = al;
1838
1839 if (dl != 0) {
1840 temp = bh;
1841 bh = dh;
1842 dh = temp;
1843 if (dl == 1) {
1844 temp = bl;
1845 bl = dh;
1846 dh = temp;
1847 } else {
1848 temp = bl;
1849 bl = bh;
1850 bh = temp;
1851 }
1852 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001853 outb((unsigned short) dh, pVBInfo->P3c9);
1854 outb((unsigned short) bh, pVBInfo->P3c9);
1855 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001856}
1857
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001858static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301859 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001860{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301861 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
1862 ah, dh, *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301864 if (ModeNo <= 0x13)
1865 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1866 else
1867 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301869 data &= DACInfoFlag;
1870 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301872 if (data == 0x00)
1873 table = XGINew_MDA_DAC;
1874 else if (data == 0x08)
1875 table = XGINew_CGA_DAC;
1876 else if (data == 0x10)
1877 table = XGINew_EGA_DAC;
1878 else if (data == 0x18) {
1879 time = 256;
1880 table = XGINew_VGA_DAC;
1881 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301883 if (time == 256)
1884 j = 16;
1885 else
1886 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001887
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001888 outb(0xFF, pVBInfo->P3c6);
1889 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301891 for (i = 0; i < j; i++) {
1892 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301894 for (k = 0; k < 3; k++) {
1895 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301897 if (data & 0x01)
1898 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001899
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301900 if (data & 0x02)
1901 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001902
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001903 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301904 data = data >> 2;
1905 }
1906 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301908 if (time == 256) {
1909 for (i = 16; i < 32; i++) {
1910 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301912 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001913 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301914 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301916 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001917
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301918 for (m = 0; m < 9; m++) {
1919 di = si;
1920 bx = si + 0x04;
1921 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301923 for (n = 0; n < 3; n++) {
1924 for (o = 0; o < 5; o++) {
1925 dh = table[si];
1926 ah = table[di];
1927 al = table[bx];
1928 si++;
1929 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1930 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301932 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001933
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301934 for (o = 0; o < 3; o++) {
1935 dh = table[bx];
1936 ah = table[di];
1937 al = table[si];
1938 si--;
1939 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1940 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301942 dl++;
1943 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301945 si += 5;
1946 }
1947 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001948}
1949
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001950static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1951 unsigned short ModeIdIndex,
1952 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001953{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301954 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001955
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301956 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001957 /* si+St_ResInfo */
1958 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301959 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001960 /* si+Ext_ResInfo */
1961 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301963 /* if (ModeNo > 0x13) */
1964 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1965 /* else */
1966 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301968 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001969 /* si+St_ResInfo */
1970 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301971 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001972 /* si+Ext_ResInfo */
1973 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001974
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301975 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001976
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301977 if (ModeNo <= 0x13) {
1978 xres = pVBInfo->StResInfo[resindex].HTotal;
1979 yres = pVBInfo->StResInfo[resindex].VTotal;
1980 } else {
1981 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1982 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1983 }
1984 if (ModeNo > 0x13) {
1985 if (modeflag & HalfDCLK)
1986 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001987
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301988 if (modeflag & DoubleScanMode)
1989 yres = yres << 1;
1990 }
1991 /* if (modeflag & Charx8Dot) */
1992 /* { */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001993
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301994 if (xres == 720)
1995 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301997 /* } */
1998 pVBInfo->VGAHDE = xres;
1999 pVBInfo->HDE = xres;
2000 pVBInfo->VGAVDE = yres;
2001 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002002}
2003
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002004static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
2005 unsigned short ModeIdIndex,
2006 unsigned short RefreshRateTableIndex,
2007 struct vb_device_info *pVBInfo)
2008{
2009 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
2010
2011 struct XGI330_LCDDataTablStruct *tempdi = NULL;
2012
2013 tempbx = BX;
2014
2015 if (ModeNo <= 0x13) {
2016 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2017 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2018 } else {
2019 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2020 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2021 }
2022
2023 tempal = tempal & 0x0f;
2024
2025 if (tempbx <= 1) { /* ExpLink */
2026 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002027 /* find no Ext_CRT2CRTC2 */
2028 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002029 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002030 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
2031 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002032 }
2033
2034 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
2035 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002036 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
2037 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002038 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002039 tempal = pVBInfo->RefIndex[
2040 RefreshRateTableIndex].
2041 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002042 }
2043
2044 if (tempbx & 0x01)
2045 tempal = (tempal >> 4);
2046
2047 tempal = (tempal & 0x0f);
2048 }
2049
2050 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
2051
2052 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
2053 if ((tempbx == 5) || (tempbx) == 7)
2054 tempcx = LCDDesDataLen2;
2055 else if ((tempbx == 3) || (tempbx == 8))
2056 tempcx = LVDSDesDataLen2;
2057 }
2058 /* mov di, word ptr cs:LCDDataList[bx] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002059 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] |
2060 (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002061
2062 switch (tempbx) {
2063 case 0:
2064 tempdi = XGI_EPLLCDCRT1Ptr_H;
2065 break;
2066 case 1:
2067 tempdi = XGI_EPLLCDCRT1Ptr_V;
2068 break;
2069 case 2:
2070 tempdi = XGI_EPLLCDDataPtr;
2071 break;
2072 case 3:
2073 tempdi = XGI_EPLLCDDesDataPtr;
2074 break;
2075 case 4:
2076 tempdi = XGI_LCDDataTable;
2077 break;
2078 case 5:
2079 tempdi = XGI_LCDDesDataTable;
2080 break;
2081 case 6:
2082 tempdi = XGI_EPLCHLCDRegPtr;
2083 break;
2084 case 7:
2085 case 8:
2086 case 9:
2087 tempdi = NULL;
2088 break;
2089 default:
2090 break;
2091 }
2092
2093 if (tempdi == NULL) /* OEMUtil */
2094 return NULL;
2095
2096 table = tempbx;
2097 i = 0;
2098
2099 while (tempdi[i].PANELID != 0xff) {
2100 tempdx = pVBInfo->LCDResInfo;
2101 if (tempbx & 0x0080) { /* OEMUtil */
2102 tempbx &= (~0x0080);
2103 tempdx = pVBInfo->LCDTypeInfo;
2104 }
2105
2106 if (pVBInfo->LCDInfo & EnableScalingLCD)
2107 tempdx &= (~PanelResInfo);
2108
2109 if (tempdi[i].PANELID == tempdx) {
2110 tempbx = tempdi[i].MASK;
2111 tempdx = pVBInfo->LCDInfo;
2112
2113 if (ModeNo <= 0x13) /* alan 09/10/2003 */
2114 tempdx |= SetLCDStdMode;
2115
2116 if (modeflag & HalfDCLK)
2117 tempdx |= SetLCDLowResolution;
2118
2119 tempbx &= tempdx;
2120 if (tempbx == tempdi[i].CAP)
2121 break;
2122 }
2123 i++;
2124 }
2125
2126 if (table == 0) {
2127 switch (tempdi[i].DATAPTR) {
2128 case 0:
2129 return &XGI_LVDSCRT11024x768_1_H[tempal];
2130 break;
2131 case 1:
2132 return &XGI_LVDSCRT11024x768_2_H[tempal];
2133 break;
2134 case 2:
2135 return &XGI_LVDSCRT11280x1024_1_H[tempal];
2136 break;
2137 case 3:
2138 return &XGI_LVDSCRT11280x1024_2_H[tempal];
2139 break;
2140 case 4:
2141 return &XGI_LVDSCRT11400x1050_1_H[tempal];
2142 break;
2143 case 5:
2144 return &XGI_LVDSCRT11400x1050_2_H[tempal];
2145 break;
2146 case 6:
2147 return &XGI_LVDSCRT11600x1200_1_H[tempal];
2148 break;
2149 case 7:
2150 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
2151 break;
2152 case 8:
2153 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
2154 break;
2155 case 9:
2156 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
2157 break;
2158 case 10:
2159 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
2160 break;
2161 default:
2162 break;
2163 }
2164 } else if (table == 1) {
2165 switch (tempdi[i].DATAPTR) {
2166 case 0:
2167 return &XGI_LVDSCRT11024x768_1_V[tempal];
2168 break;
2169 case 1:
2170 return &XGI_LVDSCRT11024x768_2_V[tempal];
2171 break;
2172 case 2:
2173 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2174 break;
2175 case 3:
2176 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2177 break;
2178 case 4:
2179 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2180 break;
2181 case 5:
2182 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2183 break;
2184 case 6:
2185 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2186 break;
2187 case 7:
2188 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2189 break;
2190 case 8:
2191 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2192 break;
2193 case 9:
2194 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2195 break;
2196 case 10:
2197 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2198 break;
2199 default:
2200 break;
2201 }
2202 } else if (table == 2) {
2203 switch (tempdi[i].DATAPTR) {
2204 case 0:
2205 return &XGI_LVDS1024x768Data_1[tempal];
2206 break;
2207 case 1:
2208 return &XGI_LVDS1024x768Data_2[tempal];
2209 break;
2210 case 2:
2211 return &XGI_LVDS1280x1024Data_1[tempal];
2212 break;
2213 case 3:
2214 return &XGI_LVDS1280x1024Data_2[tempal];
2215 break;
2216 case 4:
2217 return &XGI_LVDS1400x1050Data_1[tempal];
2218 break;
2219 case 5:
2220 return &XGI_LVDS1400x1050Data_2[tempal];
2221 break;
2222 case 6:
2223 return &XGI_LVDS1600x1200Data_1[tempal];
2224 break;
2225 case 7:
2226 return &XGI_LVDSNoScalingData[tempal];
2227 break;
2228 case 8:
2229 return &XGI_LVDS1024x768Data_1x75[tempal];
2230 break;
2231 case 9:
2232 return &XGI_LVDS1024x768Data_2x75[tempal];
2233 break;
2234 case 10:
2235 return &XGI_LVDS1280x1024Data_1x75[tempal];
2236 break;
2237 case 11:
2238 return &XGI_LVDS1280x1024Data_2x75[tempal];
2239 break;
2240 case 12:
2241 return &XGI_LVDSNoScalingDatax75[tempal];
2242 break;
2243 default:
2244 break;
2245 }
2246 } else if (table == 3) {
2247 switch (tempdi[i].DATAPTR) {
2248 case 0:
2249 return &XGI_LVDS1024x768Des_1[tempal];
2250 break;
2251 case 1:
2252 return &XGI_LVDS1024x768Des_3[tempal];
2253 break;
2254 case 2:
2255 return &XGI_LVDS1024x768Des_2[tempal];
2256 break;
2257 case 3:
2258 return &XGI_LVDS1280x1024Des_1[tempal];
2259 break;
2260 case 4:
2261 return &XGI_LVDS1280x1024Des_2[tempal];
2262 break;
2263 case 5:
2264 return &XGI_LVDS1400x1050Des_1[tempal];
2265 break;
2266 case 6:
2267 return &XGI_LVDS1400x1050Des_2[tempal];
2268 break;
2269 case 7:
2270 return &XGI_LVDS1600x1200Des_1[tempal];
2271 break;
2272 case 8:
2273 return &XGI_LVDSNoScalingDesData[tempal];
2274 break;
2275 case 9:
2276 return &XGI_LVDS1024x768Des_1x75[tempal];
2277 break;
2278 case 10:
2279 return &XGI_LVDS1024x768Des_3x75[tempal];
2280 break;
2281 case 11:
2282 return &XGI_LVDS1024x768Des_2x75[tempal];
2283 break;
2284 case 12:
2285 return &XGI_LVDS1280x1024Des_1x75[tempal];
2286 break;
2287 case 13:
2288 return &XGI_LVDS1280x1024Des_2x75[tempal];
2289 break;
2290 case 14:
2291 return &XGI_LVDSNoScalingDesDatax75[tempal];
2292 break;
2293 default:
2294 break;
2295 }
2296 } else if (table == 4) {
2297 switch (tempdi[i].DATAPTR) {
2298 case 0:
2299 return &XGI_ExtLCD1024x768Data[tempal];
2300 break;
2301 case 1:
2302 return &XGI_StLCD1024x768Data[tempal];
2303 break;
2304 case 2:
2305 return &XGI_CetLCD1024x768Data[tempal];
2306 break;
2307 case 3:
2308 return &XGI_ExtLCD1280x1024Data[tempal];
2309 break;
2310 case 4:
2311 return &XGI_StLCD1280x1024Data[tempal];
2312 break;
2313 case 5:
2314 return &XGI_CetLCD1280x1024Data[tempal];
2315 break;
2316 case 6:
2317 return &XGI_ExtLCD1400x1050Data[tempal];
2318 break;
2319 case 7:
2320 return &XGI_StLCD1400x1050Data[tempal];
2321 break;
2322 case 8:
2323 return &XGI_CetLCD1400x1050Data[tempal];
2324 break;
2325 case 9:
2326 return &XGI_ExtLCD1600x1200Data[tempal];
2327 break;
2328 case 10:
2329 return &XGI_StLCD1600x1200Data[tempal];
2330 break;
2331 case 11:
2332 return &XGI_NoScalingData[tempal];
2333 break;
2334 case 12:
2335 return &XGI_ExtLCD1024x768x75Data[tempal];
2336 break;
2337 case 13:
2338 return &XGI_ExtLCD1024x768x75Data[tempal];
2339 break;
2340 case 14:
2341 return &XGI_CetLCD1024x768x75Data[tempal];
2342 break;
2343 case 15:
2344 return &XGI_ExtLCD1280x1024x75Data[tempal];
2345 break;
2346 case 16:
2347 return &XGI_StLCD1280x1024x75Data[tempal];
2348 break;
2349 case 17:
2350 return &XGI_CetLCD1280x1024x75Data[tempal];
2351 break;
2352 case 18:
2353 return &XGI_NoScalingDatax75[tempal];
2354 break;
2355 default:
2356 break;
2357 }
2358 } else if (table == 5) {
2359 switch (tempdi[i].DATAPTR) {
2360 case 0:
2361 return &XGI_ExtLCDDes1024x768Data[tempal];
2362 break;
2363 case 1:
2364 return &XGI_StLCDDes1024x768Data[tempal];
2365 break;
2366 case 2:
2367 return &XGI_CetLCDDes1024x768Data[tempal];
2368 break;
2369 case 3:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002370 if ((pVBInfo->VBType & VB_XGI301LV) ||
2371 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002372 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2373 else
2374 return &XGI_ExtLCDDes1280x1024Data[tempal];
2375 break;
2376 case 4:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002377 if ((pVBInfo->VBType & VB_XGI301LV) ||
2378 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002379 return &XGI_StLCDDLDes1280x1024Data[tempal];
2380 else
2381 return &XGI_StLCDDes1280x1024Data[tempal];
2382 break;
2383 case 5:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002384 if ((pVBInfo->VBType & VB_XGI301LV) ||
2385 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002386 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2387 else
2388 return &XGI_CetLCDDes1280x1024Data[tempal];
2389 break;
2390 case 6:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002391 if ((pVBInfo->VBType & VB_XGI301LV) ||
2392 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002393 return &XGI_ExtLCDDLDes1400x1050Data[tempal];
2394 else
2395 return &XGI_ExtLCDDes1400x1050Data[tempal];
2396 break;
2397 case 7:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002398 if ((pVBInfo->VBType & VB_XGI301LV) ||
2399 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002400 return &XGI_StLCDDLDes1400x1050Data[tempal];
2401 else
2402 return &XGI_StLCDDes1400x1050Data[tempal];
2403 break;
2404 case 8:
2405 return &XGI_CetLCDDes1400x1050Data[tempal];
2406 break;
2407 case 9:
2408 return &XGI_CetLCDDes1400x1050Data2[tempal];
2409 break;
2410 case 10:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002411 if ((pVBInfo->VBType & VB_XGI301LV) ||
2412 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002413 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2414 else
2415 return &XGI_ExtLCDDes1600x1200Data[tempal];
2416 break;
2417 case 11:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002418 if ((pVBInfo->VBType & VB_XGI301LV) ||
2419 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002420 return &XGI_StLCDDLDes1600x1200Data[tempal];
2421 else
2422 return &XGI_StLCDDes1600x1200Data[tempal];
2423 break;
2424 case 12:
2425 return &XGI_NoScalingDesData[tempal];
2426 break;
2427 case 13:
2428 return &XGI_ExtLCDDes1024x768x75Data[tempal];
2429 break;
2430 case 14:
2431 return &XGI_StLCDDes1024x768x75Data[tempal];
2432 break;
2433 case 15:
2434 return &XGI_CetLCDDes1024x768x75Data[tempal];
2435 break;
2436 case 16:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002437 if ((pVBInfo->VBType & VB_XGI301LV) ||
2438 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002439 return &XGI_ExtLCDDLDes1280x1024x75Data[tempal];
2440 else
2441 return &XGI_ExtLCDDes1280x1024x75Data[tempal];
2442 break;
2443 case 17:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002444 if ((pVBInfo->VBType & VB_XGI301LV) ||
2445 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002446 return &XGI_StLCDDLDes1280x1024x75Data[tempal];
2447 else
2448 return &XGI_StLCDDes1280x1024x75Data[tempal];
2449 break;
2450 case 18:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002451 if ((pVBInfo->VBType & VB_XGI301LV) ||
2452 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002453 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2454 else
2455 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2456 break;
2457 case 19:
2458 return &XGI_NoScalingDesDatax75[tempal];
2459 break;
2460 default:
2461 break;
2462 }
2463 } else if (table == 6) {
2464 switch (tempdi[i].DATAPTR) {
2465 case 0:
2466 return &XGI_CH7017LV1024x768[tempal];
2467 break;
2468 case 1:
2469 return &XGI_CH7017LV1400x1050[tempal];
2470 break;
2471 default:
2472 break;
2473 }
2474 }
2475 return NULL;
2476}
2477
2478static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2479 unsigned short ModeIdIndex,
2480 unsigned short RefreshRateTableIndex,
2481 struct vb_device_info *pVBInfo)
2482{
2483 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2484 struct XGI330_TVDataTablStruct *tempdi = NULL;
2485
2486 tempbx = BX;
2487
2488 if (ModeNo <= 0x13) {
2489 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2490 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2491 } else {
2492 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2493 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2494 }
2495
2496 tempal = tempal & 0x3f;
2497 table = tempbx;
2498
2499 switch (tempbx) {
2500 case 0:
2501 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
2502 if (pVBInfo->IF_DEF_CH7007 == 1)
2503 tempdi = XGI_EPLCHTVCRT1Ptr;
2504
2505 break;
2506 case 1:
2507 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
2508 if (pVBInfo->IF_DEF_CH7007 == 1)
2509 tempdi = XGI_EPLCHTVCRT1Ptr;
2510
2511 break;
2512 case 2:
2513 tempdi = XGI_EPLCHTVDataPtr;
2514 break;
2515 case 3:
2516 tempdi = NULL;
2517 break;
2518 case 4:
2519 tempdi = XGI_TVDataTable;
2520 break;
2521 case 5:
2522 tempdi = NULL;
2523 break;
2524 case 6:
2525 tempdi = XGI_EPLCHTVRegPtr;
2526 break;
2527 default:
2528 break;
2529 }
2530
2531 if (tempdi == NULL) /* OEMUtil */
2532 return NULL;
2533
2534 tempdx = pVBInfo->TVInfo;
2535
2536 if (pVBInfo->VBInfo & SetInSlaveMode)
2537 tempdx = tempdx | SetTVLockMode;
2538
2539 if (modeflag & HalfDCLK)
2540 tempdx = tempdx | SetTVLowResolution;
2541
2542 i = 0;
2543
2544 while (tempdi[i].MASK != 0xffff) {
2545 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2546 break;
2547 i++;
2548 }
2549
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002550 /* 07/05/22 */
2551 if (table == 0x00) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002552 } else if (table == 0x01) {
2553 } else if (table == 0x04) {
2554 switch (tempdi[i].DATAPTR) {
2555 case 0:
2556 return &XGI_ExtPALData[tempal];
2557 break;
2558 case 1:
2559 return &XGI_ExtNTSCData[tempal];
2560 break;
2561 case 2:
2562 return &XGI_StPALData[tempal];
2563 break;
2564 case 3:
2565 return &XGI_StNTSCData[tempal];
2566 break;
2567 case 4:
2568 return &XGI_ExtHiTVData[tempal];
2569 break;
2570 case 5:
2571 return &XGI_St2HiTVData[tempal];
2572 break;
2573 case 6:
2574 return &XGI_ExtYPbPr525iData[tempal];
2575 break;
2576 case 7:
2577 return &XGI_ExtYPbPr525pData[tempal];
2578 break;
2579 case 8:
2580 return &XGI_ExtYPbPr750pData[tempal];
2581 break;
2582 case 9:
2583 return &XGI_StYPbPr525iData[tempal];
2584 break;
2585 case 10:
2586 return &XGI_StYPbPr525pData[tempal];
2587 break;
2588 case 11:
2589 return &XGI_StYPbPr750pData[tempal];
2590 break;
2591 case 12: /* avoid system hang */
2592 return &XGI_ExtNTSCData[tempal];
2593 break;
2594 case 13:
2595 return &XGI_St1HiTVData[tempal];
2596 break;
2597 default:
2598 break;
2599 }
2600 } else if (table == 0x02) {
2601 switch (tempdi[i].DATAPTR) {
2602 case 0:
2603 return &XGI_CHTVUNTSCData[tempal];
2604 break;
2605 case 1:
2606 return &XGI_CHTVONTSCData[tempal];
2607 break;
2608 case 2:
2609 return &XGI_CHTVUPALData[tempal];
2610 break;
2611 case 3:
2612 return &XGI_CHTVOPALData[tempal];
2613 break;
2614 default:
2615 break;
2616 }
2617 } else if (table == 0x06) {
2618 }
2619 return NULL;
2620}
2621
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002622static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302623 unsigned short RefreshRateTableIndex,
2624 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002625{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302626 unsigned short tempbx;
2627 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
2628 struct XGI330_CHTVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302630 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302632 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2633 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2634 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2635 pVBInfo);
2636 pVBInfo->VGAHT = LCDPtr->VGAHT;
2637 pVBInfo->VGAVT = LCDPtr->VGAVT;
2638 pVBInfo->HT = LCDPtr->LCDHT;
2639 pVBInfo->VT = LCDPtr->LCDVT;
2640 }
2641 if (pVBInfo->IF_DEF_CH7017 == 1) {
2642 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2643 TVPtr = (struct XGI330_CHTVDataStruct *) XGI_GetTVPtr(
2644 tempbx, ModeNo, ModeIdIndex,
2645 RefreshRateTableIndex, pVBInfo);
2646 pVBInfo->VGAHT = TVPtr->VGAHT;
2647 pVBInfo->VGAVT = TVPtr->VGAVT;
2648 pVBInfo->HT = TVPtr->LCDHT;
2649 pVBInfo->VT = TVPtr->LCDVT;
2650 }
2651 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302653 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2654 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2655 | EnableScalingLCD))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002656 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2657 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302658 pVBInfo->HDE = 1024;
2659 pVBInfo->VDE = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002660 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2661 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302662 pVBInfo->HDE = 1280;
2663 pVBInfo->VDE = 1024;
2664 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2665 pVBInfo->HDE = 1400;
2666 pVBInfo->VDE = 1050;
2667 } else {
2668 pVBInfo->HDE = 1600;
2669 pVBInfo->VDE = 1200;
2670 }
2671 }
2672 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002673}
2674
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002675static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302676 unsigned short RefreshRateTableIndex,
2677 struct xgi_hw_device_info *HwDeviceExtension,
2678 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002679{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302680 unsigned char index;
2681 unsigned short tempbx, i;
2682 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2683 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
2684 /* struct XGI330_CHTVDataStruct *TVPtr = NULL; */
2685 struct XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
2686 struct XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302688 if (ModeNo <= 0x13)
2689 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2690 else
2691 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302693 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002694
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002695 if ((pVBInfo->IF_DEF_ScaleLCD == 0) ||
2696 ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2697 (!(pVBInfo->LCDInfo & EnableScalingLCD)))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302698 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302700 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002701 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2702 XGI_GetLcdPtr(tempbx, ModeNo,
2703 ModeIdIndex,
2704 RefreshRateTableIndex,
2705 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302707 for (i = 0; i < 8; i++)
2708 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
2709 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002710
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302711 if (pVBInfo->IF_DEF_CH7007 == 1) {
2712 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002713 CH7007TV_TimingHPtr =
2714 (struct XGI_CH7007TV_TimingHStruct *)
2715 XGI_GetTVPtr(
2716 tempbx,
2717 ModeNo,
2718 ModeIdIndex,
2719 RefreshRateTableIndex,
2720 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002721
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302722 for (i = 0; i < 8; i++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002723 pVBInfo->TimingH[0].data[i] =
2724 CH7007TV_TimingHPtr[0].data[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302725 }
2726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302728 /* if (pVBInfo->IF_DEF_CH7017 == 1) {
2729 if (pVBInfo->VBInfo & SetCRT2ToTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002730 TVPtr = (struct XGI330_CHTVDataStruct *)
2731 XGI_GetTVPtr(
2732 tempbx,
2733 ModeNo,
2734 ModeIdIndex,
2735 RefreshRateTableIndex,
2736 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302737 }
2738 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302740 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302742 if (pVBInfo->IF_DEF_CH7007 == 1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002743 xgifb_reg_set(pVBInfo->P3c4, 0x2E,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302744 CH7007TV_TimingHPtr[0].data[8]);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002745 xgifb_reg_set(pVBInfo->P3c4, 0x2F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302746 CH7007TV_TimingHPtr[0].data[9]);
2747 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302749 tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002750
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302751 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002752 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2753 XGI_GetLcdPtr(
2754 tempbx,
2755 ModeNo,
2756 ModeIdIndex,
2757 RefreshRateTableIndex,
2758 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302759 for (i = 0; i < 7; i++)
2760 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2761 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302763 if (pVBInfo->IF_DEF_CH7007 == 1) {
2764 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002765 CH7007TV_TimingVPtr =
2766 (struct XGI_CH7007TV_TimingVStruct *)
2767 XGI_GetTVPtr(
2768 tempbx,
2769 ModeNo,
2770 ModeIdIndex,
2771 RefreshRateTableIndex,
2772 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302774 for (i = 0; i < 7; i++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002775 pVBInfo->TimingV[0].data[i] =
2776 CH7007TV_TimingVPtr[0].data[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302777 }
2778 }
2779 /* if (pVBInfo->IF_DEF_CH7017 == 1) {
2780 if (pVBInfo->VBInfo & SetCRT2ToTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002781 TVPtr = (struct XGI330_CHTVDataStruct *)
2782 XGI_GetTVPtr(tempbx,
2783 ModeNo,
2784 ModeIdIndex,
2785 RefreshRateTableIndex,
2786 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302787 }
2788 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302790 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302792 if (pVBInfo->IF_DEF_CH7007 == 1) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002793 xgifb_reg_and_or(pVBInfo->P3c4, 0x33, ~0x01,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302794 CH7007TV_TimingVPtr[0].data[7] & 0x01);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002795 xgifb_reg_set(pVBInfo->P3c4, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302796 CH7007TV_TimingVPtr[0].data[8]);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002797 xgifb_reg_set(pVBInfo->P3c4, 0x3F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302798 CH7007TV_TimingVPtr[0].data[9]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002799
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302800 }
2801 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002802}
2803
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002804static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2805{
2806 unsigned char tempal, tempah, tempbl, i;
2807
Aaro Koskinen58839b02011-03-13 12:26:23 +02002808 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002809 tempal = tempah & 0x0F;
2810 tempah = tempah & 0xF0;
2811 i = 0;
2812 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2813
2814 while (tempbl != 0xFF) {
2815 if (tempbl & 0x80) { /* OEMUtil */
2816 tempal = tempah;
2817 tempbl = tempbl & ~(0x80);
2818 }
2819
2820 if (tempal == tempbl)
2821 break;
2822
2823 i++;
2824
2825 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2826 }
2827
2828 return i;
2829}
2830
2831static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2832{
2833 unsigned short tempah, tempal, tempbl, i;
2834
2835 tempal = pVBInfo->LCDResInfo;
2836 tempah = pVBInfo->LCDTypeInfo;
2837
2838 i = 0;
2839 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2840
2841 while (tempbl != 0xFF) {
2842 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2843 tempal = tempah;
2844 tempbl &= ~0x80;
2845 }
2846
2847 if (tempal == tempbl)
2848 break;
2849
2850 i++;
2851 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2852 }
2853
2854 if (tempbl == 0xFF) {
2855 pVBInfo->LCDResInfo = Panel1024x768;
2856 pVBInfo->LCDTypeInfo = 0;
2857 i = 0;
2858 }
2859
2860 return i;
2861}
2862
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002863static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2864 unsigned short *VSyncWidth,
2865 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002866{
2867 unsigned short Index;
2868
2869 Index = XGI_GetLCDCapPtr(pVBInfo);
2870 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2871 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2872
2873 return;
2874}
2875
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002876static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302877 unsigned short RefreshRateTableIndex,
2878 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002879{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302880 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2881 unsigned long temp, temp1, temp2, temp3, push3;
2882 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2883 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302885 if (ModeNo > 0x13)
2886 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2887 else
2888 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002889
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302890 if (!(pVBInfo->SetFlag & Win9xDOSMode)) {
2891 if ((pVBInfo->IF_DEF_CH7017 == 0) || (pVBInfo->VBInfo
2892 & (SetCRT2ToLCD | SetCRT2ToLCDA))) {
2893 if (pVBInfo->IF_DEF_OEMUtil == 1) {
2894 tempbx = 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002895 LCDPtr = (struct XGI330_LCDDataDesStruct *)
2896 XGI_GetLcdPtr(tempbx,
2897 ModeNo,
2898 ModeIdIndex,
2899 RefreshRateTableIndex,
2900 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302901 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002902
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002903 if ((pVBInfo->IF_DEF_OEMUtil == 0) ||
2904 (LCDPtr == NULL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302905 tempbx = 3;
2906 if (pVBInfo->LCDInfo & EnableScalingLCD)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002907 LCDPtr1 =
2908 (struct XGI330_LCDDataDesStruct2 *)
2909 XGI_GetLcdPtr(
2910 tempbx,
2911 ModeNo,
2912 ModeIdIndex,
2913 RefreshRateTableIndex,
2914 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302915 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002916 LCDPtr =
2917 (struct XGI330_LCDDataDesStruct *)
2918 XGI_GetLcdPtr(
2919 tempbx,
2920 ModeNo,
2921 ModeIdIndex,
2922 RefreshRateTableIndex,
2923 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302924 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2927 push1 = tempbx;
2928 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302930 /* GetLCDResInfo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002931 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2932 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302933 tempax = 1024;
2934 tempbx = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002935 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2936 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 tempax = 1280;
2938 tempbx = 1024;
2939 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2940 tempax = 1400;
2941 tempbx = 1050;
2942 } else {
2943 tempax = 1600;
2944 tempbx = 1200;
2945 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002946
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302947 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2948 pVBInfo->HDE = tempax;
2949 pVBInfo->VDE = tempbx;
2950 pVBInfo->VGAHDE = tempax;
2951 pVBInfo->VGAVDE = tempbx;
2952 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002953
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002954 if ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2955 (pVBInfo->LCDInfo & EnableScalingLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302956 tempax = pVBInfo->HDE;
2957 tempbx = pVBInfo->VDE;
2958 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302960 tempax = pVBInfo->HT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002961
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302962 if (pVBInfo->LCDInfo & EnableScalingLCD)
2963 tempbx = LCDPtr1->LCDHDES;
2964 else
2965 tempbx = LCDPtr->LCDHDES;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002966
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302967 tempcx = pVBInfo->HDE;
2968 tempbx = tempbx & 0x0fff;
2969 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002970
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302971 if (tempcx >= tempax)
2972 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002973
Aaro Koskinen8104e322011-03-13 12:26:22 +02002974 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302976 tempcx = tempcx >> 3;
2977 tempbx = tempbx >> 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002978
Aaro Koskinen8104e322011-03-13 12:26:22 +02002979 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302980 (unsigned short) (tempbx & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02002981 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302982 (unsigned short) (tempcx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302984 tempax = pVBInfo->HT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302986 if (pVBInfo->LCDInfo & EnableScalingLCD)
2987 tempbx = LCDPtr1->LCDHRS;
2988 else
2989 tempbx = LCDPtr->LCDHRS;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302991 tempcx = push2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302993 if (pVBInfo->LCDInfo & EnableScalingLCD)
2994 tempcx = LCDPtr1->LCDHSync;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302996 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002997
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302998 if (tempcx >= tempax)
2999 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303001 tempax = tempbx & 0x07;
3002 tempax = tempax >> 5;
3003 tempcx = tempcx >> 3;
3004 tempbx = tempbx >> 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303006 tempcx &= 0x1f;
3007 tempax |= tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003008
Aaro Koskinen8104e322011-03-13 12:26:22 +02003009 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
3010 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303011 (unsigned short) (tempbx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003012
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303013 tempax = pVBInfo->VT;
3014 if (pVBInfo->LCDInfo & EnableScalingLCD)
3015 tempbx = LCDPtr1->LCDVDES;
3016 else
3017 tempbx = LCDPtr->LCDVDES;
3018 tempcx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303020 tempbx = tempbx & 0x0fff;
3021 tempcx += tempbx;
3022 if (tempcx >= tempax)
3023 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003024
Aaro Koskinen8104e322011-03-13 12:26:22 +02003025 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303026 (unsigned short) (tempbx & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003027 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303028 (unsigned short) (tempcx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003029
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303030 tempbx = (tempbx >> 8) & 0x07;
3031 tempcx = (tempcx >> 8) & 0x07;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003032
Aaro Koskinen8104e322011-03-13 12:26:22 +02003033 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303034 (unsigned short) ((tempcx << 3)
3035 | tempbx));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303037 tempax = pVBInfo->VT;
3038 if (pVBInfo->LCDInfo & EnableScalingLCD)
3039 tempbx = LCDPtr1->LCDVRS;
3040 else
3041 tempbx = LCDPtr->LCDVRS;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003042
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303043 /* tempbx = tempbx >> 4; */
3044 tempcx = push1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003045
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303046 if (pVBInfo->LCDInfo & EnableScalingLCD)
3047 tempcx = LCDPtr1->LCDVSync;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003048
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303049 tempcx += tempbx;
3050 if (tempcx >= tempax)
3051 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003052
Aaro Koskinen8104e322011-03-13 12:26:22 +02003053 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303054 (unsigned short) (tempbx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003055 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303056 (unsigned short) (tempcx & 0x0f));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003057
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303058 tempax = ((tempbx >> 8) & 0x07) << 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303060 tempbx = pVBInfo->VGAVDE;
3061 if (tempbx != pVBInfo->VDE)
3062 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003063
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303064 if (pVBInfo->LCDInfo & EnableLVDSDDA)
3065 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003066
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003067 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303068 tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003069
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303070 tempcx = pVBInfo->VGAVT;
3071 tempbx = pVBInfo->VDE;
3072 tempax = pVBInfo->VGAVDE;
3073 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303075 temp = tempax; /* 0430 ylshieh */
3076 temp1 = (temp << 18) / tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303078 tempdx = (unsigned short) ((temp << 18) % tempbx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303080 if (tempdx != 0)
3081 temp1 += 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303083 temp2 = temp1;
3084 push3 = temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003085
Aaro Koskinen8104e322011-03-13 12:26:22 +02003086 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303087 (unsigned short) (temp2 & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003088 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 (unsigned short) ((temp2 >> 8) & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303091 tempbx = (unsigned short) (temp2 >> 16);
3092 tempax = tempbx & 0x03;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003093
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303094 tempbx = pVBInfo->VGAVDE;
3095 if (tempbx == pVBInfo->VDE)
3096 tempax |= 0x04;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003097
Aaro Koskinen8104e322011-03-13 12:26:22 +02003098 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003099
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303100 if (pVBInfo->VBType & VB_XGI301C) {
3101 temp2 = push3;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003102 xgifb_reg_set(pVBInfo->Part4Port,
3103 0x3c,
3104 (unsigned short) (temp2 & 0xff));
3105 xgifb_reg_set(pVBInfo->Part4Port,
3106 0x3b,
3107 (unsigned short) ((temp2 >> 8) &
3108 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303109 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003110 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 ~0xc0,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003112 (unsigned short) ((tempbx &
3113 0xff) << 6));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303115 tempcx = pVBInfo->VGAVDE;
3116 if (tempcx == pVBInfo->VDE)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003117 xgifb_reg_and_or(pVBInfo->Part4Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303118 0x30, ~0x0c, 0x00);
3119 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003120 xgifb_reg_and_or(pVBInfo->Part4Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303121 0x30, ~0x0c, 0x08);
3122 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003123
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303124 tempcx = pVBInfo->VGAHDE;
3125 tempbx = pVBInfo->HDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303127 temp1 = tempcx << 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303129 tempax = (unsigned short) (temp1 / tempbx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303131 if ((tempbx & 0xffff) == (tempcx & 0xffff))
3132 tempax = 65535;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303134 temp3 = tempax;
3135 temp1 = pVBInfo->VGAHDE << 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003136
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303137 temp1 /= temp3;
3138 temp3 = temp3 << 16;
3139 temp1 -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303141 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303143 tempax = (unsigned short) (temp3 & 0xff);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003144 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 temp1 = pVBInfo->VGAVDE << 18;
3147 temp1 = temp1 / push3;
3148 tempbx = (unsigned short) (temp1 & 0xffff);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303150 if (pVBInfo->LCDResInfo == Panel1024x768)
3151 tempbx -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303153 tempax = ((tempbx >> 8) & 0xff) << 3;
3154 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003155 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303156 (unsigned short) (tempax & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003157 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303158 (unsigned short) (tempbx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303160 temp3 = temp3 >> 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303162 if (modeflag & HalfDCLK)
3163 temp3 = temp3 >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003164
Aaro Koskinen8104e322011-03-13 12:26:22 +02003165 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303166 (unsigned short) ((temp3 >> 8) & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003167 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303168 (unsigned short) (temp3 & 0xff));
3169 }
3170 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003171}
3172
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003173/* --------------------------------------------------------------------- */
3174/* Function : XGI_GETLCDVCLKPtr */
3175/* Input : */
3176/* Output : al -> VCLK Index */
3177/* Description : */
3178/* --------------------------------------------------------------------- */
3179static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
3180 struct vb_device_info *pVBInfo)
3181{
3182 unsigned short index;
3183
3184 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
3185 if (pVBInfo->IF_DEF_ScaleLCD == 1) {
3186 if (pVBInfo->LCDInfo & EnableScalingLCD)
3187 return;
3188 }
3189
3190 /* index = XGI_GetLCDCapPtr(pVBInfo); */
3191 index = XGI_GetLCDCapPtr1(pVBInfo);
3192
3193 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
3194 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
3195 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
3196 } else { /* LCDA */
3197 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
3198 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
3199 }
3200 }
3201 return;
3202}
3203
3204static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
3205 unsigned short ModeNo, unsigned short ModeIdIndex,
3206 struct vb_device_info *pVBInfo)
3207{
3208
3209 unsigned short index, modeflag;
3210 unsigned short tempbx;
3211 unsigned char tempal;
3212 unsigned char *CHTVVCLKPtr = NULL;
3213
3214 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003215 /* si+St_ResInfo */
3216 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003217 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003218 /* si+Ext_ResInfo */
3219 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003220
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003221 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
3222 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003223 index = XGI_GetLCDCapPtr(pVBInfo);
3224 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
3225
3226 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
3227 return tempal;
3228
3229 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003230 if (pVBInfo->VBType &
3231 (VB_XGI301B |
3232 VB_XGI302B |
3233 VB_XGI301LV |
3234 VB_XGI302LV |
3235 VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003236 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3237 tempal = HiTVVCLKDIV2;
3238 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3239 tempal = HiTVVCLK;
3240 if (pVBInfo->TVInfo & TVSimuMode) {
3241 tempal = HiTVSimuVCLK;
3242 if (!(modeflag & Charx8Dot))
3243 tempal = HiTVTextVCLK;
3244
3245 }
3246 return tempal;
3247 }
3248
3249 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
3250 tempal = YPbPr750pVCLK;
3251 return tempal;
3252 }
3253
3254 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
3255 tempal = YPbPr525pVCLK;
3256 return tempal;
3257 }
3258
3259 tempal = NTSC1024VCLK;
3260
3261 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
3262 tempal = TVVCLKDIV2;
3263 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3264 tempal = TVVCLK;
3265 }
3266
3267 if (pVBInfo->VBInfo & SetCRT2ToTV)
3268 return tempal;
3269 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003270 /* else if ((pVBInfo->IF_DEF_CH7017==1) &&
3271 (pVBInfo->VBType&VB_CH7017)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003272 if (ModeNo<=0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003273 *tempal = pVBInfo->SModeIDTable[ModeIdIndex].
3274 St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003275 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003276 *tempal = pVBInfo->RefIndex[
3277 RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003278 *tempal = *tempal & 0x1F;
3279 tempbx = 0;
3280 if (pVBInfo->TVInfo & SetPALTV)
3281 tempbx = tempbx + 2;
3282 if (pVBInfo->TVInfo & SetCHTVOverScan)
3283 tempbx++;
3284 tempbx = tempbx << 1;
3285 } */
3286 } /* {End of VB} */
3287
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003288 if ((pVBInfo->IF_DEF_CH7007 == 1) &&
3289 (pVBInfo->VBType & VB_CH7007)) { /* [Billy] 07/05/08 CH7007 */
3290 /* VideoDebugPrint((
3291 0,
3292 "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003293 if ((pVBInfo->VBInfo & SetCRT2ToTV)) {
3294 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003295 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
3296 St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003297 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003298 tempal = pVBInfo->RefIndex[
3299 RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003300 }
3301
3302 tempal = tempal & 0x0F;
3303 tempbx = 0;
3304
3305 if (pVBInfo->TVInfo & SetPALTV)
3306 tempbx = tempbx + 2;
3307
3308 if (pVBInfo->TVInfo & SetCHTVOverScan)
3309 tempbx++;
3310
3311 /** tempbx = tempbx << 1; CH7007 ? **/
3312
3313 /* [Billy]07/05/29 CH7007 */
3314 if (pVBInfo->IF_DEF_CH7007 == 1) {
3315 switch (tempbx) {
3316 case 0:
3317 CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC;
3318 break;
3319 case 1:
3320 CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC;
3321 break;
3322 case 2:
3323 CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL;
3324 break;
3325 case 3:
3326 CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL;
3327 break;
3328 default:
3329 break;
3330
3331 }
3332 }
3333 /* else {
3334 switch(tempbx) {
3335 case 0:
3336 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC;
3337 break;
3338 case 1:
3339 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC;
3340 break;
3341 case 2:
3342 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL;
3343 break;
3344 case 3:
3345 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL;
3346 break;
3347 default:
3348 break;
3349 }
3350 }
3351 */
3352
3353 tempal = CHTVVCLKPtr[tempal];
3354 return tempal;
3355 }
3356
3357 }
3358
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003359 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003360 tempal = tempal >> 2;
3361 tempal &= 0x03;
3362
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003363 /* for Dot8 Scaling LCD */
3364 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003365 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
3366
3367 if (ModeNo <= 0x13)
3368 return tempal;
3369
3370 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
3371 return tempal;
3372}
3373
3374static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
3375 unsigned char *di_1, struct vb_device_info *pVBInfo)
3376{
3377 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 2007/05/16 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003378 /* VideoDebugPrint((
3379 0,
3380 "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003381 *di_0 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2B;
3382 *di_1 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2C;
3383 } else if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
3384 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
3385 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
3386 & ProgrammingCRT2)) {
3387 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
3388 *di_1 = XGI_VBVCLKData[tempal].SR2C;
3389 }
3390 } else {
3391 *di_0 = XGI_VCLKData[tempal].SR2B;
3392 *di_1 = XGI_VCLKData[tempal].SR2C;
3393 }
3394}
3395
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003396static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303397 unsigned short RefreshRateTableIndex,
3398 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003399{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 unsigned char di_0, di_1, tempal;
3401 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003402
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303403 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3404 pVBInfo);
3405 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3406 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003407
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303408 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003409 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303410 (unsigned short) (0x10 * i));
3411 if (pVBInfo->IF_DEF_CH7007 == 1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003412 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3413 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303414 } else if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
3415 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003416 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3417 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303418 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003419 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3420 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 }
3422 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003423}
3424
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003425static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303426 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003427{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303428 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003429
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303430 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3431 | VB_XGI302LV | VB_XGI301C)) {
3432 tempcl = 0;
3433 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003434 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303436 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003437 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303438 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003439 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303440 if (!(temp & 0x40))
3441 tempcl |= ActiveCRT1;
3442 }
3443 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003444
Aaro Koskinen58839b02011-03-13 12:26:23 +02003445 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303446 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303448 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003449 /* Check ChannelA by Part1_13 [2003/10/03] */
3450 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303451 if (tempax & 0x04)
3452 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003453
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303454 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303456 if (!(tempcl & ActiveLCD))
3457 if (temp == 0x01)
3458 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 if (temp == 0x04)
3461 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303463 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003464 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003465
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303466 if (!(temp & 0x08))
3467 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003468
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303469 if (!(temp & 0x04))
3470 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303472 if (temp & 0x02)
3473 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003474
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303475 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3476 if (temp & 0x01)
3477 tempch |= ActiveHiTV;
3478 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003481 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303482 pVBInfo->Part2Port,
3483 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003484
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303485 if (temp & 0x10)
3486 tempch |= ActiveYPbPr;
3487 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003488
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303489 if (tempch != 0)
3490 tempcl |= ActiveTV;
3491 }
3492 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003493
Aaro Koskinen58839b02011-03-13 12:26:23 +02003494 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303495 if (tempcl & ActiveLCD) {
3496 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3497 if (temp & ActiveTV)
3498 tempcl |= ActiveTV;
3499 }
3500 }
3501 temp = tempcl;
3502 tempbl = ~ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003503 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303505 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003506 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 } else {
3508 return;
3509 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003510}
3511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303512void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3513 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003514{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 /*
3516 if ( HwDeviceExtension->jChipType >= XG20 ) {
3517 pVBInfo->Set_VGAType = XG20;
Aaro Koskinen06587332011-03-13 12:26:10 +02003518 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303519 pVBInfo->Set_VGAType = VGA_XGI340;
3520 }
3521 */
3522 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003523}
3524
Bill Pemberton80adad82010-06-17 13:10:51 -04003525void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003526{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303527 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003528
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303529 if (pVBInfo->IF_DEF_CH7007 == 1) {
3530 pVBInfo->VBType = VB_CH7007;
3531 return;
3532 }
3533 if (pVBInfo->IF_DEF_LVDS == 0) {
3534 tempbx = VB_XGI302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003535 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303536 if (flag != 0x02) {
3537 tempbx = VB_XGI301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003538 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303539 if (flag >= 0xB0) {
3540 tempbx = VB_XGI301B;
3541 if (flag >= 0xC0) {
3542 tempbx = VB_XGI301C;
3543 if (flag >= 0xD0) {
3544 tempbx = VB_XGI301LV;
3545 if (flag >= 0xE0) {
3546 tempbx = VB_XGI302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003547 tempah = xgifb_reg_get(
3548 pVBInfo->Part4Port,
3549 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303550 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003551 tempbx =
3552 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303553 }
3554 }
3555 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003556
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303557 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003558 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303559 pVBInfo->Part4Port,
3560 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303562 if (!(flag & 0x02))
3563 tempbx = tempbx | VB_NoLCD;
3564 }
3565 }
3566 }
3567 pVBInfo->VBType = tempbx;
3568 }
3569 /*
3570 else if (pVBInfo->IF_DEF_CH7017 == 1)
3571 pVBInfo->VBType = VB_CH7017;
3572 else //LVDS
3573 pVBInfo->VBType = VB_LVDS_NS;
3574 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003575
3576}
3577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303578void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3579 struct xgi_hw_device_info *HwDeviceExtension,
3580 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003581{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303582 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003583
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303584 if (ModeNo <= 0x13)
3585 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3586 else
3587 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303589 pVBInfo->SetFlag = 0;
3590 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3591 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303593 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003594 /* Check Display Device */
3595 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303596 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003597 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303598 push = temp;
3599 push = push << 8;
3600 tempax = temp << 8;
3601 tempbx = tempbx | tempax;
3602 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3603 | SetInSlaveMode | DisableCRT2Display);
3604 temp = 0xFFFF ^ temp;
3605 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003606
Aaro Koskinen58839b02011-03-13 12:26:23 +02003607 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003608
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303609 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303611 if ((pVBInfo->Set_VGAType >= XG20)
3612 || (pVBInfo->Set_VGAType >= XG40)) {
3613 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003614 /* if ((pVBInfo->VBType & VB_XGI302B)
3615 || (pVBInfo->VBType & VB_XGI301LV)
3616 || (pVBInfo->VBType & VB_XGI302LV)
3617 || (pVBInfo->VBType & VB_XGI301C))
3618 */
3619 if (pVBInfo->VBType &
3620 (VB_XGI302B |
3621 VB_XGI301LV |
3622 VB_XGI302LV |
3623 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303624 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003625 tempbx |=
3626 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303628 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003629 tempbx |=
3630 SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303631 }
3632 }
3633 } else if (pVBInfo->IF_DEF_CH7017 == 1) {
3634 if (pVBInfo->VBType & VB_CH7017) {
3635 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003636 tempbx |=
3637 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303639 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003640 tempbx |=
3641 SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303642 }
3643 }
3644 }
3645 }
3646 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303648 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003649 /* [Billy] 07/05/04 */
3650 if (((pVBInfo->IF_DEF_LVDS == 0) &&
3651 ((pVBInfo->VBType & VB_XGI301LV) ||
3652 (pVBInfo->VBType & VB_XGI302LV) ||
3653 (pVBInfo->VBType & VB_XGI301C))) ||
3654 ((pVBInfo->IF_DEF_CH7017 == 1) &&
3655 (pVBInfo->VBType & VB_CH7017)) ||
3656 ((pVBInfo->IF_DEF_CH7007 == 1) &&
3657 (pVBInfo->VBType & VB_CH7007))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303658 if (temp & SetYPbPr) { /* temp = CR38 */
3659 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003660 /* shampoo add for new
3661 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003662 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303663 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003664 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303665 temp &= YPbPrMode;
3666 tempbx |= SetCRT2ToHiVisionTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303668 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003669 tempbx &=
3670 (~SetCRT2ToHiVisionTV);
3671 tempbx |=
3672 SetCRT2ToYPbPr;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303673 }
3674 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003675
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303676 /* tempbx |= SetCRT2ToYPbPr; */
3677 }
3678 }
3679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303681 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303683 if (pVBInfo->IF_DEF_LVDS == 0) {
3684 if (pVBInfo->IF_DEF_YPbPr == 1) {
3685 if (pVBInfo->IF_DEF_HiVision == 1)
3686 temp = 0x09FC;
3687 else
3688 temp = 0x097C;
3689 } else {
3690 if (pVBInfo->IF_DEF_HiVision == 1)
3691 temp = 0x01FC;
3692 else
3693 temp = 0x017C;
3694 }
3695 } else { /* 3nd party chip */
3696 if (pVBInfo->IF_DEF_CH7017 == 1)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003697 temp = (SetCRT2ToTV |
3698 SetCRT2ToLCD |
3699 SetCRT2ToLCDA);
3700 /* [Billy] 07/05/03 */
3701 else if (pVBInfo->IF_DEF_CH7007 == 1)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303702 temp = SetCRT2ToTV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003703 else
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 temp = SetCRT2ToLCD;
3705 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303707 if (!(tempbx & temp)) {
3708 tempax |= DisableCRT2Display;
3709 tempbx = 0;
3710 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303712 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3713 if (!(pVBInfo->VBType & VB_NoLCD)) {
3714 if (tempbx & SetCRT2ToLCDA) {
3715 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003716 tempbx &= (~(SetCRT2ToLCD |
3717 SetCRT2ToRAMDAC |
3718 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303719 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003720 tempbx &= (~(SetCRT2ToLCD |
3721 SetCRT2ToRAMDAC |
3722 SetCRT2ToTV |
3723 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303724 }
3725 }
3726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303728 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003729 /* for driver abnormal */
3730 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303731 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3732 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003733 tempbx &= (0xFF00 |
3734 SetCRT2ToRAMDAC |
3735 SwitchToCRT2 |
3736 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303737 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3738 }
3739 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003740 tempbx &= (~(SetCRT2ToRAMDAC |
3741 SetCRT2ToLCD |
3742 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743 }
3744 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003745
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303746 if (!(pVBInfo->VBType & VB_NoLCD)) {
3747 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003748 tempbx &= (0xFF00 |
3749 SetCRT2ToLCD |
3750 SwitchToCRT2 |
3751 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303752 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3753 }
3754 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303756 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003757 tempbx &= (0xFF00 |
3758 SetCRT2ToSCART |
3759 SwitchToCRT2 |
3760 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303761 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3762 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303764 if (pVBInfo->IF_DEF_YPbPr == 1) {
3765 if (tempbx & SetCRT2ToYPbPr)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003766 tempbx &= (0xFF00 |
3767 SwitchToCRT2 |
3768 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303769 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303771 if (pVBInfo->IF_DEF_HiVision == 1) {
3772 if (tempbx & SetCRT2ToHiVisionTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003773 tempbx &= (0xFF00 |
3774 SetCRT2ToHiVisionTV |
3775 SwitchToCRT2 |
3776 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303777 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303779 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3780 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3781 tempbx = DisableCRT2Display;
3782 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303784 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003785 if ((!(tempbx & DriverMode)) ||
3786 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303787 if (pVBInfo->IF_DEF_LCDA == 1) {
3788 if (!(tempbx & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003789 tempbx |= (SetInSlaveMode |
3790 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303791 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303793 if (pVBInfo->IF_DEF_VideoCapture == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003794 if (((HwDeviceExtension->jChipType ==
3795 XG40) &&
3796 (pVBInfo->Set_VGAType == XG40)) ||
3797 ((HwDeviceExtension->jChipType ==
3798 XG41) &&
3799 (pVBInfo->Set_VGAType == XG41)) ||
3800 ((HwDeviceExtension->jChipType ==
3801 XG42) &&
3802 (pVBInfo->Set_VGAType == XG42)) ||
3803 ((HwDeviceExtension->jChipType ==
3804 XG45) &&
3805 (pVBInfo->Set_VGAType == XG45))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303806 if (ModeNo <= 13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003807 if (!(tempbx &
3808 SetCRT2ToRAMDAC)) {
3809 /*CRT2 not need
3810 * to support*/
3811 tempbx &=
3812 (0x00FF |
3813 (~SetInSlaveMode));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303814 pVBInfo->SetFlag
3815 |= EnableVCMode;
3816 }
3817 }
3818 }
3819 }
3820 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003821
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003822 /* LCD+TV can't support in slave mode
3823 * (Force LCDA+TV->LCDB) */
3824 if ((tempbx & SetInSlaveMode) &&
3825 (tempbx & SetCRT2ToLCDA)) {
3826 tempbx ^= (SetCRT2ToLCD |
3827 SetCRT2ToLCDA |
3828 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303829 pVBInfo->SetFlag |= ReserveTVOption;
3830 }
3831 }
3832 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303834 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003835}
3836
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303837void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3838 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003839{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303840 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303842 tempbx = 0;
3843 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303845 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3846 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003847 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3848 St_ModeFlag; /* si+St_ModeFlag */
3849 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3850 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303851 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003852 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3853 Ext_ModeFlag;
3854 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3855 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303856 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303858 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003859 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 tempbx = temp;
3861 if (tempbx & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003862 tempbx &= (SetCHTVOverScan |
3863 SetPALMTV |
3864 SetPALNTV |
3865 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303866 if (tempbx & SetPALMTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003867 /* set to NTSC if PAL-M */
3868 tempbx &= ~SetPALTV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303869 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003870 tempbx &= (SetCHTVOverScan |
3871 SetNTSCJ |
3872 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303873 /*
3874 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003875 //PAL-M/PAL-N Info
3876 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3877 //00:PAL, 01:PAL-M, 10:PAL-N
3878 temp2 = (index1 & 0xC0) >> 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303879 tempbx |= temp2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003880 if (temp2 & 0x02) //PAL-M
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303881 tempbx &= (~SetPALTV);
3882 }
3883 */
3884 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003885
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303886 if (pVBInfo->IF_DEF_CH7017 == 1) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003887 tempbx = xgifb_reg_get(pVBInfo->P3d4, 0x35);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003888
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303889 if (tempbx & TVOverScan)
3890 tempbx |= SetCHTVOverScan;
3891 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003892
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303893 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/04 */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003894 tempbx = xgifb_reg_get(pVBInfo->P3d4, 0x35);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003895
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303896 if (tempbx & TVOverScan)
3897 tempbx |= SetCHTVOverScan;
3898 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003899
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303900 if (pVBInfo->IF_DEF_LVDS == 0) {
3901 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3902 tempbx |= SetPALTV;
3903 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303905 if (pVBInfo->IF_DEF_YPbPr == 1) {
3906 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003907 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303908 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003909
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303910 if (index1 == YPbPrMode525i)
3911 tempbx |= SetYPbPrMode525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303913 if (index1 == YPbPrMode525p)
3914 tempbx = tempbx | SetYPbPrMode525p;
3915 if (index1 == YPbPrMode750p)
3916 tempbx = tempbx | SetYPbPrMode750p;
3917 }
3918 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303920 if (pVBInfo->IF_DEF_HiVision == 1) {
3921 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3922 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
3923 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303925 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003926 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3927 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303928 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003929
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003930 if (!(tempbx & SetPALTV) &&
3931 (modeflag > 13) &&
3932 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303933 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003934
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303935 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303937 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3938 if (pVBInfo->VBInfo & SetInSlaveMode)
3939 tempbx &= (~RPLLDIV2XO);
3940 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003941 if (tempbx &
3942 (SetYPbPrMode525p | SetYPbPrMode750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303943 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003944 else if (!(pVBInfo->VBType &
3945 (VB_XGI301B |
3946 VB_XGI302B |
3947 VB_XGI301LV |
3948 VB_XGI302LV |
3949 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303950 if (tempbx & TVSimuMode)
3951 tempbx &= (~RPLLDIV2XO);
3952 }
3953 }
3954 }
3955 }
3956 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003957}
3958
Bill Pemberton108afbf2010-06-17 13:10:47 -04003959unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303960 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003961{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303964 pVBInfo->LCDResInfo = 0;
3965 pVBInfo->LCDTypeInfo = 0;
3966 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303968 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003969 /* si+St_ModeFlag // */
3970 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971 } else {
3972 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003973 /* si+Ext_ResInfo // */
3974 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303975 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003976
Aaro Koskinen58839b02011-03-13 12:26:23 +02003977 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303978 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003979
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303980 if (tempbx == 0)
3981 tempbx = Panel1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303983 /* LCD75 [2003/8/22] Vicent */
3984 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3985 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003986 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303987 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3988 tempax &= 0x0F;
3989 else
3990 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303992 if ((resinfo == 6) || (resinfo == 9)) {
3993 if (tempax >= 3)
3994 tempbx |= PanelRef75Hz;
3995 } else if ((resinfo == 7) || (resinfo == 8)) {
3996 if (tempax >= 4)
3997 tempbx |= PanelRef75Hz;
3998 }
3999 }
4000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304002 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304006 if (pVBInfo->IF_DEF_OEMUtil == 1)
4007 pVBInfo->LCDTypeInfo = (temp & 0xf0) >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
4010 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304012 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004013
Aaro Koskinen58839b02011-03-13 12:26:23 +02004014 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004017
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304018 if ((pVBInfo->IF_DEF_ScaleLCD == 1) && (temp & LCDNonExpanding))
4019 temp &= ~EnableScalingLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004020
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304021 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004022
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304023 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004024
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304025 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004026
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304027 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
4028 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
4029 & VB_XGI301C)) && (tempax & LCDDualLink)) {
4030 tempbx |= SetLCDDualLink;
4031 }
4032 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004033
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304034 if (pVBInfo->IF_DEF_CH7017 == 1) {
4035 if (tempax & LCDDualLink)
4036 tempbx |= SetLCDDualLink;
4037 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004038
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304039 if (pVBInfo->IF_DEF_LVDS == 0) {
4040 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
4041 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
4042 == 9) && (!(tempbx & EnableScalingLCD)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004043 /* set to center in 1280x1024 LCDB for Panel1400x1050 */
4044 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304045 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304047 /*
4048 if (tempax & LCDBToA) {
4049 tempbx |= SetLCDBToA;
4050 }
4051 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004052
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304053 if (pVBInfo->IF_DEF_ExpLink == 1) {
4054 if (modeflag & HalfDCLK) {
4055 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
4056 if (!(tempbx & SetLCDtoNonExpanding)) {
4057 tempbx |= EnableLVDSDDA;
4058 } else {
4059 if (ModeNo > 0x13) {
4060 if (pVBInfo->LCDResInfo
4061 == Panel1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004062 if (resinfo == 4) {/* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304063 tempbx |= EnableLVDSDDA;
4064 }
4065 }
4066 }
4067 }
4068 }
4069 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004070
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304071 if (pVBInfo->VBInfo & SetInSlaveMode) {
4072 if (pVBInfo->VBInfo & SetNotSimuMode)
4073 tempbx |= LCDVESATiming;
4074 } else {
4075 tempbx |= LCDVESATiming;
4076 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304078 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304080 if (pVBInfo->IF_DEF_PWD == 1) {
4081 if (pVBInfo->LCDInfo & SetPWDEnable) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004082 if ((pVBInfo->VBType & VB_XGI302LV) ||
4083 (pVBInfo->VBType & VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304084 if (!(tempax & PWDEnable))
4085 pVBInfo->LCDInfo &= ~SetPWDEnable;
4086 }
4087 }
4088 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004089
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090 if (pVBInfo->IF_DEF_LVDS == 0) {
4091 if (tempax & (LockLCDBToA | StLCDBToA)) {
4092 if (pVBInfo->VBInfo & SetInSlaveMode) {
4093 if (!(tempax & LockLCDBToA)) {
4094 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004095 pVBInfo->VBInfo &=
4096 ~(SetSimuScanMode |
4097 SetInSlaveMode |
4098 SetCRT2ToLCD);
4099 pVBInfo->VBInfo |=
4100 SetCRT2ToLCDA |
4101 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304102 }
4103 }
4104 }
4105 }
4106 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304108 /*
4109 if (pVBInfo->IF_DEF_LVDS == 0) {
4110 if (tempax & (LockLCDBToA | StLCDBToA)) {
4111 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004112 if (!((!(tempax & LockLCDBToA)) &&
4113 (ModeNo > 0x13))) {
4114 pVBInfo->VBInfo &=
4115 ~(SetSimuScanMode |
4116 SetInSlaveMode |
4117 SetCRT2ToLCD);
4118 pVBInfo->VBInfo |=
4119 SetCRT2ToLCDA |
4120 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304121 }
4122 }
4123 }
4124 }
4125 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304127 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004128}
4129
Bill Pemberton108afbf2010-06-17 13:10:47 -04004130unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304131 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004132{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304133 if (ModeNo <= 5)
4134 ModeNo |= 1;
4135 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004136 /* for (*ModeIdIndex=0;
4137 *ModeIdIndex < sizeof(pVBInfo->SModeIDTable)
4138 / sizeof(struct XGI_StStruct);
4139 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304140 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004141 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
4142 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304143 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004144 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
4145 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304146 return 0;
4147 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304149 if (ModeNo == 0x07)
4150 (*ModeIdIndex)++; /* 400 lines */
4151 if (ModeNo <= 3)
4152 (*ModeIdIndex) += 2; /* 400 lines */
4153 /* else 350 lines */
4154 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004155 /* for (*ModeIdIndex=0;
4156 *ModeIdIndex < sizeof(pVBInfo->EModeIDTable)
4157 / sizeof(struct XGI_ExtStruct);
4158 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304159 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004160 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
4161 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304162 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004163 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
4164 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304165 return 0;
4166 }
4167 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304169 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004170}
4171
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004172/* win2000 MM adapter not support standard mode! */
4173
Randy Dunlap89229672010-08-10 08:46:44 -07004174#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07004175static unsigned char XGINew_CheckMemorySize(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304176 struct xgi_hw_device_info *HwDeviceExtension,
4177 unsigned short ModeNo,
4178 unsigned short ModeIdIndex,
4179 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004180{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304181 unsigned short memorysize, modeflag, temp, temp1, tmp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304183 /*
4184 if ((HwDeviceExtension->jChipType == XGI_650) ||
4185 (HwDeviceExtension->jChipType == XGI_650M)) {
4186 return 1;
4187 }
4188 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304190 if (ModeNo <= 0x13)
4191 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4192 else
4193 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004194
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304195 /* ModeType = modeflag&ModeInfoFlag; // Get mode type */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197 memorysize = modeflag & MemoryInfoFlag;
4198 memorysize = memorysize > MemorySizeShift;
4199 memorysize++; /* Get memory size */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004200
Aaro Koskinen58839b02011-03-13 12:26:23 +02004201 temp = xgifb_reg_get(pVBInfo->P3c4, 0x14); /* Get DRAM Size */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304202 tmp = temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004203
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304204 if (HwDeviceExtension->jChipType == XG40) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004205 /* memory size per channel SR14[7:4] */
4206 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304207 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4208 temp <<= 2;
4209 } else if ((tmp & 0x0c) == 0x08) { /* Dual channels */
4210 temp <<= 1;
4211 }
4212 } else if (HwDeviceExtension->jChipType == XG42) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004213 /* memory size per channel SR14[7:4] */
4214 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304215 if ((tmp & 0x04) == 0x04) { /* Dual channels */
4216 temp <<= 1;
4217 }
4218 } else if (HwDeviceExtension->jChipType == XG45) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004219 /* memory size per channel SR14[7:4] */
4220 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304221 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4222 temp <<= 2;
4223 } else if ((tmp & 0x0c) == 0x08) { /* triple channels */
4224 temp1 = temp;
4225 temp <<= 1;
4226 temp += temp1;
4227 } else if ((tmp & 0x0c) == 0x04) { /* Dual channels */
4228 temp <<= 1;
4229 }
4230 }
4231 if (temp < memorysize)
4232 return 0;
4233 else
4234 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004235}
Randy Dunlap89229672010-08-10 08:46:44 -07004236#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304238/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004239void XGINew_IsLowResolution(unsigned short ModeNo,
4240 unsigned short ModeIdIndex,
4241 unsigned char XGINew_CheckMemorySize(
4242 struct xgi_hw_device_info *HwDeviceExtension,
4243 unsigned short ModeNo,
4244 unsigned short ModeIdIndex,
4245 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004246{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304247 unsigned short data ;
4248 unsigned short ModeFlag ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004249
Aaro Koskinen58839b02011-03-13 12:26:23 +02004250 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304251 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004252 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304254 if (ModeNo > 0x13) {
4255 ModeFlag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4256 if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004257 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304258 data |= 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004259 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004260 data = xgifb_reg_get(pVBInfo->P3c4, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304261 data &= 0xF7;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004262 xgifb_reg_set(pVBInfo->P3c4, 0x01, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304263 }
4264 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004265}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004266*/
4267
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004268static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
4269{
4270 unsigned char ujRet = 0;
4271 unsigned char i = 0;
4272
4273 for (i = 0; i < 8; i++) {
4274 ujRet = ujRet << 1;
4275 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
4276 ujRet |= (ujDate >> i) & 1;
4277 }
4278
4279 return ujRet;
4280}
4281
4282/*----------------------------------------------------------------------------*/
4283/* output */
4284/* bl[5] : LVDS signal */
4285/* bl[1] : LVDS backlight */
4286/* bl[0] : LVDS VDD */
4287/*----------------------------------------------------------------------------*/
4288static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
4289{
4290 unsigned char CR4A, temp;
4291
Aaro Koskinen58839b02011-03-13 12:26:23 +02004292 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02004293 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004294
Aaro Koskinen58839b02011-03-13 12:26:23 +02004295 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004296
4297 temp = XG21GPIODataTransfer(temp);
4298 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004299 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004300 return temp;
4301}
4302
4303/*----------------------------------------------------------------------------*/
4304/* output */
4305/* bl[5] : LVDS signal */
4306/* bl[1] : LVDS backlight */
4307/* bl[0] : LVDS VDD */
4308/*----------------------------------------------------------------------------*/
4309static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
4310{
4311 unsigned char CR4A, CRB4, temp;
4312
Aaro Koskinen58839b02011-03-13 12:26:23 +02004313 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02004314 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004315
Aaro Koskinen58839b02011-03-13 12:26:23 +02004316 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004317
4318 temp &= 0x0C;
4319 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004320 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004321 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004322 temp |= ((CRB4 & 0x04) << 3);
4323 return temp;
4324}
4325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304326void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
4327 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004328{
4329
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004330 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304331 if (pXGIHWDE->jChipType == XG21) {
4332 if (pVBInfo->IF_DEF_LVDS == 1) {
4333 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004334 /* LVDS VDD on */
4335 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304336 XGI_XG21SetPanelDelay(2, pVBInfo);
4337 }
4338 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004339 /* LVDS signal on */
4340 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304341 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004342 /* LVDS backlight on */
4343 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304344 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004345 /* DVO/DVI signal on */
4346 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304347 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004350
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004351 /* [Billy] 07/05/23 For CH7007 */
4352 if (pVBInfo->IF_DEF_CH7007 == 1) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304353 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 if (pXGIHWDE->jChipType == XG27) {
4356 if (pVBInfo->IF_DEF_LVDS == 1) {
4357 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004358 /* LVDS VDD on */
4359 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304360 XGI_XG21SetPanelDelay(2, pVBInfo);
4361 }
4362 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004363 /* LVDS signal on */
4364 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304365 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004366 /* LVDS backlight on */
4367 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304368 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004369 /* DVO/DVI signal on */
4370 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304371 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304373 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004374}
4375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304376void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
4377 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004378{
4379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304380 if (pXGIHWDE->jChipType == XG21) {
4381 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004382 /* LVDS backlight off */
4383 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304384 XGI_XG21SetPanelDelay(3, pVBInfo);
4385 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004386 /* DVO/DVI signal off */
4387 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304388 }
4389 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304391 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/23 For CH7007 */
4392 /* if (IsCH7007TVMode(pVBInfo) == 0) */
4393 {
4394 }
4395 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304397 if (pXGIHWDE->jChipType == XG27) {
4398 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004399 /* LVDS backlight off */
4400 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304401 XGI_XG21SetPanelDelay(3, pVBInfo);
4402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304404 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004405 /* DVO/DVI signal off */
4406 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304407 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004408
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004409 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004410}
4411
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004412static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004413{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004414 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304415 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004416
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004417 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304418 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004419}
4420
Randy Dunlap89229672010-08-10 08:46:44 -07004421#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07004422static void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004423{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004424 while (!(inb(pVBInfo->P3da) & 0x01))
4425 ;
4426 while (inb(pVBInfo->P3da) & 0x01)
4427 ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004428}
Randy Dunlap89229672010-08-10 08:46:44 -07004429#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004430
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004431static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004432{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304433 if (!(pVBInfo->SetFlag & Win9xDOSMode))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004434 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004435}
4436
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004437static void XGI_SaveCRT2Info(unsigned short ModeNo,
4438 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004439{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304440 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004441
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004442 /* reserve CR34 for CRT1 Mode No */
4443 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304444 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
4445 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004446 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004447}
4448
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004449static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
4450 unsigned short ModeIdIndex,
4451 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004452{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304453 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304455 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
4456 if (ModeNo <= 0x13) {
4457 xres = pVBInfo->StResInfo[resindex].HTotal;
4458 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004459 /* si+St_ResInfo */
4460 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304461 } else {
4462 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4463 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004464 /* si+St_ModeFlag */
4465 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467 /*
4468 if (pVBInfo->IF_DEF_FSTN) {
4469 xres *= 2;
4470 yres *= 2;
4471 } else {
4472 */
4473 if (modeflag & HalfDCLK)
4474 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004475
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304476 if (modeflag & DoubleScanMode)
4477 yres *= 2;
4478 /* } */
4479 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004480
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304481 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4482 if (pVBInfo->IF_DEF_LVDS == 0) {
4483 if (pVBInfo->LCDResInfo == Panel1600x1200) {
4484 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4485 if (yres == 1024)
4486 yres = 1056;
4487 }
4488 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304490 if (pVBInfo->LCDResInfo == Panel1280x1024) {
4491 if (yres == 400)
4492 yres = 405;
4493 else if (yres == 350)
4494 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304496 if (pVBInfo->LCDInfo & LCDVESATiming) {
4497 if (yres == 360)
4498 yres = 375;
4499 }
4500 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004501
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304502 if (pVBInfo->LCDResInfo == Panel1024x768) {
4503 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4504 if (!(pVBInfo->LCDInfo
4505 & LCDNonExpanding)) {
4506 if (yres == 350)
4507 yres = 357;
4508 else if (yres == 400)
4509 yres = 420;
4510 else if (yres == 480)
4511 yres = 525;
4512 }
4513 }
4514 }
4515 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004516
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304517 if (xres == 720)
4518 xres = 640;
4519 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004520
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304521 pVBInfo->VGAHDE = xres;
4522 pVBInfo->HDE = xres;
4523 pVBInfo->VGAVDE = yres;
4524 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004525}
4526
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004527static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004528{
4529
Dan Carpentera65fd092011-01-04 09:02:27 +03004530 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
4531 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304532 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004533
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304534 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004535}
4536
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004537static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
4538 unsigned short ModeIdIndex,
4539 unsigned short RefreshRateTableIndex,
4540 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004541{
4542 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
4543 StandTableIndex, CRT1Index;
4544
4545 pVBInfo->RVBHCMAX = 1;
4546 pVBInfo->RVBHCFACT = 1;
4547
4548 if (ModeNo <= 0x13) {
4549 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4550 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
4551 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
4552 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
4553 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
4554 } else {
4555 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004556 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
4557 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004558 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004559 temp1 = (unsigned short) pVBInfo->
4560 XGINEWUB_CRT1Table[CRT1Index].CR[0];
4561 temp2 = (unsigned short) pVBInfo->
4562 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004563 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004564 tempbx = (unsigned short) pVBInfo->
4565 XGINEWUB_CRT1Table[CRT1Index].CR[8];
4566 tempcx = (unsigned short) pVBInfo->
4567 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004568 tempcx &= 0x0100;
4569 tempcx = tempcx << 2;
4570 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004571 temp1 = (unsigned short) pVBInfo->
4572 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004573 }
4574
4575 if (temp1 & 0x01)
4576 tempbx |= 0x0100;
4577
4578 if (temp1 & 0x20)
4579 tempbx |= 0x0200;
4580 tempax += 5;
4581
4582 if (modeflag & Charx8Dot)
4583 tempax *= 8;
4584 else
4585 tempax *= 9;
4586
4587 pVBInfo->VGAHT = tempax;
4588 pVBInfo->HT = tempax;
4589 tempbx++;
4590 pVBInfo->VGAVT = tempbx;
4591 pVBInfo->VT = tempbx;
4592}
4593
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004594static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304595 unsigned short RefreshRateTableIndex,
4596 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004597{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304598 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304600 struct XGI_LCDDataStruct *LCDPtr = NULL;
4601 struct XGI_TVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304603 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004604 /* si+St_ResInfo */
4605 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304606 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4607 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004608 /* si+Ext_ResInfo */
4609 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304610 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4611 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304613 pVBInfo->NewFlickerMode = 0;
4614 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004615
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304616 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4617 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4618 pVBInfo);
4619 return;
4620 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304622 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004623
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4625 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4626 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4627 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304629 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4630 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4631 pVBInfo->VGAHT = LCDPtr->VGAHT;
4632 pVBInfo->VGAVT = LCDPtr->VGAVT;
4633 pVBInfo->HT = LCDPtr->LCDHT;
4634 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304636 if (pVBInfo->LCDResInfo == Panel1024x768) {
4637 tempax = 1024;
4638 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004639
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4641 if (pVBInfo->VGAVDE == 357)
4642 tempbx = 527;
4643 else if (pVBInfo->VGAVDE == 420)
4644 tempbx = 620;
4645 else if (pVBInfo->VGAVDE == 525)
4646 tempbx = 775;
4647 else if (pVBInfo->VGAVDE == 600)
4648 tempbx = 775;
4649 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4650 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4651 else
4652 tempbx = 768;
4653 } else
4654 tempbx = 768;
4655 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4656 tempax = 1024;
4657 tempbx = 768;
4658 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4659 tempax = 1280;
4660 if (pVBInfo->VGAVDE == 360)
4661 tempbx = 768;
4662 else if (pVBInfo->VGAVDE == 375)
4663 tempbx = 800;
4664 else if (pVBInfo->VGAVDE == 405)
4665 tempbx = 864;
4666 else
4667 tempbx = 1024;
4668 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4669 tempax = 1280;
4670 tempbx = 1024;
4671 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4672 tempax = 1280;
4673 if (pVBInfo->VGAVDE == 350)
4674 tempbx = 700;
4675 else if (pVBInfo->VGAVDE == 400)
4676 tempbx = 800;
4677 else if (pVBInfo->VGAVDE == 1024)
4678 tempbx = 960;
4679 else
4680 tempbx = 960;
4681 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4682 tempax = 1400;
4683 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004684
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304685 if (pVBInfo->VGAVDE == 1024) {
4686 tempax = 1280;
4687 tempbx = 1024;
4688 }
4689 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4690 tempax = 1600;
4691 tempbx = 1200; /* alan 10/14/2003 */
4692 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4693 if (pVBInfo->VGAVDE == 350)
4694 tempbx = 875;
4695 else if (pVBInfo->VGAVDE == 400)
4696 tempbx = 1000;
4697 }
4698 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304700 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4701 tempax = pVBInfo->VGAHDE;
4702 tempbx = pVBInfo->VGAVDE;
4703 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304705 pVBInfo->HDE = tempax;
4706 pVBInfo->VDE = tempbx;
4707 return;
4708 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004709
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4711 tempbx = 4;
4712 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4713 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4714 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4717 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4718 pVBInfo->VGAHT = TVPtr->VGAHT;
4719 pVBInfo->VGAVT = TVPtr->VGAVT;
4720 pVBInfo->HDE = TVPtr->TVHDE;
4721 pVBInfo->VDE = TVPtr->TVVDE;
4722 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4723 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004724
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304725 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4726 if (resinfo == 0x08)
4727 pVBInfo->NewFlickerMode = 0x40;
4728 else if (resinfo == 0x09)
4729 pVBInfo->NewFlickerMode = 0x40;
4730 else if (resinfo == 0x12)
4731 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004732
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304733 if (pVBInfo->VGAVDE == 350)
4734 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004735
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304736 tempax = ExtHiTVHT;
4737 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304739 if (pVBInfo->VBInfo & SetInSlaveMode) {
4740 if (pVBInfo->TVInfo & TVSimuMode) {
4741 tempax = StHiTVHT;
4742 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004743
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304744 if (!(modeflag & Charx8Dot)) {
4745 tempax = StHiTextTVHT;
4746 tempbx = StHiTextTVVT;
4747 }
4748 }
4749 }
4750 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4751 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4752 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4753 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4754 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304756 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4757 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4758 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4759 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4760 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4761 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4762 if (pVBInfo->TVInfo & NTSC1024x768)
4763 tempax = NTSC1024x768HT;
4764 }
4765 } else {
4766 tempax = PALHT;
4767 tempbx = PALVT;
4768 if (!(pVBInfo->TVInfo & SetPALTV)) {
4769 tempax = NTSCHT;
4770 tempbx = NTSCVT;
4771 if (pVBInfo->TVInfo & NTSC1024x768)
4772 tempax = NTSC1024x768HT;
4773 }
4774 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 pVBInfo->HT = tempax;
4777 pVBInfo->VT = tempbx;
4778 return;
4779 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004780}
4781
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004782static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304783 unsigned short RefreshRateTableIndex,
4784 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004786 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304788 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4789 pVBInfo);
4790 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4791 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304793 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4794 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004795 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4796 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4797 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304798 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004799 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4800 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304801 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004802
Aaro Koskinen8104e322011-03-13 12:26:22 +02004803 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304805 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004806 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004808 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004809}
4810
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004811static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4812 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004813{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004814 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4815 short index;
4816 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304817
4818 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004819 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004821 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304822
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004823 index = (modeflag & ModeInfoFlag) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004825 if (index < 0)
4826 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004828 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304829}
4830
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004831static unsigned short XGI_GetOffset(unsigned short ModeNo,
4832 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304833 unsigned short RefreshRateTableIndex,
4834 struct xgi_hw_device_info *HwDeviceExtension,
4835 struct vb_device_info *pVBInfo)
4836{
4837 unsigned short temp, colordepth, modeinfo, index, infoflag,
4838 ColorDepth[] = { 0x01, 0x02, 0x04 };
4839
4840 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4841 if (ModeNo <= 0x14)
4842 infoflag = 0;
4843 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004844 infoflag = pVBInfo->
4845 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304846
4847 index = (modeinfo >> 8) & 0xFF;
4848
4849 temp = pVBInfo->ScreenOffset[index];
4850
4851 if (infoflag & InterlaceMode)
4852 temp = temp << 1;
4853
4854 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4855
4856 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4857 temp = ModeNo - 0x7C;
4858 colordepth = ColorDepth[temp];
4859 temp = 0x6B;
4860 if (infoflag & InterlaceMode)
4861 temp = temp << 1;
4862 return temp * colordepth;
4863 } else {
4864 return temp * colordepth;
4865 }
4866}
4867
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004868static void XGI_SetCRT2Offset(unsigned short ModeNo,
4869 unsigned short ModeIdIndex,
4870 unsigned short RefreshRateTableIndex,
4871 struct xgi_hw_device_info *HwDeviceExtension,
4872 struct vb_device_info *pVBInfo)
4873{
4874 unsigned short offset;
4875 unsigned char temp;
4876
4877 if (pVBInfo->VBInfo & SetInSlaveMode)
4878 return;
4879
4880 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4881 HwDeviceExtension, pVBInfo);
4882 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004883 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004884 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004885 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004886 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004887 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004888}
4889
Randy Dunlap89229672010-08-10 08:46:44 -07004890static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004891{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004892 /* threshold high ,disable auto threshold */
4893 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4894 /* threshold low default 04h */
4895 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004896}
4897
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004898static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304899 struct xgi_hw_device_info *HwDeviceExtension,
4900 unsigned short RefreshRateTableIndex,
4901 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004902{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304903 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304905 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004906 CRT1Index = pVBInfo->
4907 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908 CRT1Index &= IndexMask;
4909 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4910 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304912 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4913 HwDeviceExtension, pVBInfo);
4914 XGI_SetCRT2FIFO(pVBInfo);
4915 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304917 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004918 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004919
Aaro Koskinen8104e322011-03-13 12:26:22 +02004920 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4921 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004922}
4923
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004924static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 struct xgi_hw_device_info *HwDeviceExtension,
4926 unsigned short RefreshRateTableIndex,
4927 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004928{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304929 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4930 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304932 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004933 CRT1Index = pVBInfo->
4934 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304935 CRT1Index &= IndexMask;
4936 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004937 }
4938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304939 if (ModeNo <= 0x13)
4940 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4941 else
4942 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304944 /* bainy change table name */
4945 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004946 /* BTVGA2HT 0x08,0x09 */
4947 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004948 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304949 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004950 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004951 /* BTVGA2HDEE 0x0A,0x0C */
4952 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004953 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304954 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4955 pushbx = pVBInfo->VGAHDE / 2 + 16;
4956 tempcx = tempcx >> 1;
4957 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4958 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304960 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4961 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004962 tempbx |= ((pVBInfo->
4963 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4964 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304965 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4966 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4967 tempcx &= 0x1F;
4968 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4969 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4970 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4971 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004972
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304973 tempbx += 4;
4974 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304976 if (tempcx > (pVBInfo->VGAHT / 2))
4977 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004978
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304979 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004980
Aaro Koskinen8104e322011-03-13 12:26:22 +02004981 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304982 } else {
4983 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004984 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304985 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004986 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004987 /* BTVGA2HDEE 0x0A,0x0C */
4988 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004989 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304990 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4991 pushbx = pVBInfo->VGAHDE + 16;
4992 tempcx = tempcx >> 1;
4993 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4994 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304996 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4997 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004998 tempbx |= ((pVBInfo->
4999 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
5000 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305001 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
5002 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
5003 tempcx &= 0x1F;
5004 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
5005 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
5006 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
5007 tempbx += 16;
5008 tempcx += 16;
5009 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305011 if (tempcx > pVBInfo->VGAHT)
5012 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005013
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305014 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005015 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005017
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305018 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
5019 tempbx = pushbx;
5020 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
5021 tempax |= (tempbx & 0xFF00);
5022 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005023 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305024 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005025 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305026 tempcx = (pVBInfo->VGAVT - 1);
5027 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305029 if (pVBInfo->IF_DEF_CH7005 == 1) {
5030 if (pVBInfo->VBInfo & 0x0C)
5031 temp--;
5032 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005033
Aaro Koskinen8104e322011-03-13 12:26:22 +02005034 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305035 tempbx = pVBInfo->VGAVDE - 1;
5036 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005037 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305038 temp = ((tempbx & 0xFF00) << 3) >> 8;
5039 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005040 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305042 tempax = pVBInfo->VGAVDE;
5043 tempbx = pVBInfo->VGAVDE;
5044 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005045 /* BTVGA2VRS 0x10,0x11 */
5046 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
5047 /* BTVGA2VRE 0x11 */
5048 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305050 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
5051 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
5052 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305054 if (temp & 0x04)
5055 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305057 if (temp & 0x080)
5058 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305060 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305062 if (temp & 0x08)
5063 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305065 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
5066 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
5067 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305069 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005070 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305071 temp = ((tempbx & 0xFF00) >> 8) << 4;
5072 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005073 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305074 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005075
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305076 if (modeflag & DoubleScanMode)
5077 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005078
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305079 if (modeflag & HalfDCLK)
5080 tempax |= 0x40;
5081
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005082 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005083}
5084
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005085static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
5086{
5087 unsigned long tempax, tempbx;
5088
5089 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
5090 & 0xFFFF;
5091 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
5092 tempax = (tempax * pVBInfo->HT) / tempbx;
5093
5094 return (unsigned short) tempax;
5095}
5096
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005097static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305098 struct xgi_hw_device_info *HwDeviceExtension,
5099 unsigned short RefreshRateTableIndex,
5100 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005101{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305102 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
5103 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305105 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005106 /* si+St_ResInfo */
5107 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305108 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5109 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005110 /* si+Ext_ResInfo */
5111 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305112 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005113 CRT1Index = pVBInfo->
5114 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305115 CRT1Index &= IndexMask;
5116 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005117
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305118 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5119 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305121 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005122 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305123 /* if (modeflag & Charx8Dot) */
5124 /* tempcx = 0x08; */
5125 /* else */
5126 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305128 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
5129 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305131 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005132
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305133 if (modeflag & HalfDCLK)
5134 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305136 tempax = (tempax / tempcx) - 1;
5137 tempbx |= ((tempax & 0x00FF) << 8);
5138 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005139 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005140
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305141 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305143 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5144 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5145 | VB_XGI302LV | VB_XGI301C)))
5146 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005147
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305148 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5149 if (pVBInfo->VBType & VB_XGI301LV) {
5150 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
5151 if (resinfo == 7)
5152 temp -= 2;
5153 }
5154 } else if (resinfo == 7) {
5155 temp -= 2;
5156 }
5157 }
5158 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005159
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005160 /* 0x05 Horizontal Display Start */
5161 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
5162 /* 0x06 Horizontal Blank end */
5163 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005164
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305165 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
5166 if (pVBInfo->VBInfo & SetCRT2ToTV)
5167 tempax = pVBInfo->VGAHT;
5168 else
5169 tempax = XGI_GetVGAHT2(pVBInfo);
5170 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005171
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305172 if (tempax >= pVBInfo->VGAHT)
5173 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305175 if (modeflag & HalfDCLK)
5176 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305178 tempax = (tempax / tempcx) - 5;
5179 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
5180 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5181 temp = (tempbx & 0x00FF) - 1;
5182 if (!(modeflag & HalfDCLK)) {
5183 temp -= 6;
5184 if (pVBInfo->TVInfo & TVSimuMode) {
5185 temp -= 4;
5186 if (ModeNo > 0x13)
5187 temp -= 10;
5188 }
5189 }
5190 } else {
5191 /* tempcx = tempbx & 0x00FF ; */
5192 tempbx = (tempbx & 0xFF00) >> 8;
5193 tempcx = (tempcx + tempbx) >> 1;
5194 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005195
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305196 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5197 temp -= 1;
5198 if (!(modeflag & HalfDCLK)) {
5199 if ((modeflag & Charx8Dot)) {
5200 temp += 4;
5201 if (pVBInfo->VGAHDE >= 800)
5202 temp -= 6;
5203 }
5204 }
5205 } else {
5206 if (!(modeflag & HalfDCLK)) {
5207 temp -= 4;
5208 if (pVBInfo->LCDResInfo != Panel1280x960) {
5209 if (pVBInfo->VGAHDE >= 800) {
5210 temp -= 7;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005211 if (pVBInfo->ModeType ==
5212 ModeEGA) {
5213 if (pVBInfo->VGAVDE ==
5214 1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305215 temp += 15;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005216 if (pVBInfo->LCDResInfo != Panel1280x1024) {
5217 temp +=
5218 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305219 }
5220 }
5221 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305223 if (pVBInfo->VGAHDE >= 1280) {
5224 if (pVBInfo->LCDResInfo
5225 != Panel1280x960) {
5226 if (pVBInfo->LCDInfo
5227 & LCDNonExpanding) {
5228 temp
5229 += 28;
5230 }
5231 }
5232 }
5233 }
5234 }
5235 }
5236 }
5237 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005238
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005239 /* 0x07 Horizontal Retrace Start */
5240 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
5241 /* 0x08 Horizontal Retrace End */
5242 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005243
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305244 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5245 if (pVBInfo->TVInfo & TVSimuMode) {
5246 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
5247 == 0x11) || (ModeNo == 0x13) || (ModeNo
5248 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005249 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
5250 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305253 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
5254 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005255 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305256 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005257 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305258 0x08, 0x61);
5259 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005260 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305261 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005262 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305263 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005264 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305265 0x0C, 0xF0);
5266 }
5267 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305269 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
5270 == 0x07)) {
5271 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005272 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305273 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005274 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305275 0x08, 0x00);
5276 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005277 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305278 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005279 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305280 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005281 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305282 0x0C, 0xF0);
5283 }
5284 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005285
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305286 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
5287 == 0x0D) || (ModeNo == 0x50)) {
5288 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005289 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305290 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005291 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305292 0x08, 0x03);
5293 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005294 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305295 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005296 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305297 0x08, 0x02);
5298 }
5299 }
5300 }
5301 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005302
Aaro Koskinen8104e322011-03-13 12:26:22 +02005303 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005304 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005305 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305307 tempbx = pVBInfo->VGAVT;
5308 push1 = tempbx;
5309 tempcx = 0x121;
5310 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312 if (tempbx == 357)
5313 tempbx = 350;
5314 if (tempbx == 360)
5315 tempbx = 350;
5316 if (tempbx == 375)
5317 tempbx = 350;
5318 if (tempbx == 405)
5319 tempbx = 400;
5320 if (tempbx == 525)
5321 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005322
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305323 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305325 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5326 if (pVBInfo->LCDResInfo == Panel1024x768) {
5327 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5328 if (tempbx == 350)
5329 tempbx += 5;
5330 if (tempbx == 480)
5331 tempbx += 5;
5332 }
5333 }
5334 }
5335 tempbx--;
5336 temp = tempbx & 0x00FF;
5337 tempbx--;
5338 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005339 /* 0x10 vertical Blank Start */
5340 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305341 tempbx = push2;
5342 tempbx--;
5343 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005344 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005345
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305346 if (tempbx & 0x0100)
5347 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305349 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005350
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305351 if (modeflag & DoubleScanMode)
5352 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305354 if (tempbx & 0x0200)
5355 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305357 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005358 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305360 if (tempbx & 0x0400)
5361 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005362
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005363 /* 0x11 Vertival Blank End */
5364 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305365
5366 tempax = push1;
5367 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
5368 tempax = tempax >> 2;
5369 push1 = tempax; /* push ax */
5370
5371 if (resinfo != 0x09) {
5372 tempax = tempax << 1;
5373 tempbx += tempax;
5374 }
5375
5376 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5377 if (pVBInfo->VBType & VB_XGI301LV) {
5378 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5379 tempbx -= 10;
5380 } else {
5381 if (pVBInfo->TVInfo & TVSimuMode) {
5382 if (pVBInfo->TVInfo & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005383 if (pVBInfo->VBType &
5384 VB_XGI301LV) {
5385 if (!(pVBInfo->TVInfo &
5386 (SetYPbPrMode525p |
5387 SetYPbPrMode750p |
5388 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305389 tempbx += 40;
5390 } else {
5391 tempbx += 40;
5392 }
5393 }
5394 }
5395 }
5396 } else {
5397 tempbx -= 10;
5398 }
5399 } else {
5400 if (pVBInfo->TVInfo & TVSimuMode) {
5401 if (pVBInfo->TVInfo & SetPALTV) {
5402 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005403 if (!(pVBInfo->TVInfo &
5404 (SetYPbPrMode525p |
5405 SetYPbPrMode750p |
5406 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 tempbx += 40;
5408 } else {
5409 tempbx += 40;
5410 }
5411 }
5412 }
5413 }
5414 tempax = push1;
5415 tempax = tempax >> 2;
5416 tempax++;
5417 tempax += tempbx;
5418 push1 = tempax; /* push ax */
5419
5420 if ((pVBInfo->TVInfo & SetPALTV)) {
5421 if (tempbx <= 513) {
5422 if (tempax >= 513)
5423 tempbx = 513;
5424 }
5425 }
5426
5427 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005428 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 tempbx--;
5430 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005431 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305432
5433 if (tempbx & 0x0100)
5434 tempcx |= 0x0008;
5435
5436 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005437 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305438
5439 tempbx++;
5440
5441 if (tempbx & 0x0100)
5442 tempcx |= 0x0004;
5443
5444 if (tempbx & 0x0200)
5445 tempcx |= 0x0080;
5446
5447 if (tempbx & 0x0400)
5448 tempcx |= 0x0C00;
5449
5450 tempbx = push1; /* pop ax */
5451 temp = tempbx & 0x00FF;
5452 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005453 /* 0x0D vertical Retrace End */
5454 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305455
5456 if (tempbx & 0x0010)
5457 tempcx |= 0x2000;
5458
5459 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005460 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005462 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463 tempax = modeflag;
5464 temp = (tempax & 0xFF00) >> 8;
5465
5466 temp = (temp >> 1) & 0x09;
5467
5468 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
5469 temp |= 0x01;
5470
Aaro Koskinen8104e322011-03-13 12:26:22 +02005471 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
5472 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
5473 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305474
5475 if (pVBInfo->LCDInfo & LCDRGB18Bit)
5476 temp = 0x80;
5477 else
5478 temp = 0x00;
5479
Aaro Koskinen8104e322011-03-13 12:26:22 +02005480 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305481
5482 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005483}
5484
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005485static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305486 unsigned short RefreshRateTableIndex,
5487 struct xgi_hw_device_info *HwDeviceExtension,
5488 struct vb_device_info *pVBInfo)
5489{
5490 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
5491 modeflag, resinfo, crt2crtc;
5492 unsigned char *TimingPoint;
5493
5494 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
5495
5496 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005497 /* si+St_ResInfo */
5498 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305499 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5500 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5501 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005502 /* si+Ext_ResInfo */
5503 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305504 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005505 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
5506 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305507 }
5508
5509 tempax = 0;
5510
5511 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
5512 tempax |= 0x0800;
5513
5514 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5515 tempax |= 0x0400;
5516
5517 if (pVBInfo->VBInfo & SetCRT2ToSCART)
5518 tempax |= 0x0200;
5519
5520 if (!(pVBInfo->TVInfo & SetPALTV))
5521 tempax |= 0x1000;
5522
5523 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5524 tempax |= 0x0100;
5525
5526 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
5527 tempax &= 0xfe00;
5528
5529 tempax = (tempax & 0xff00) >> 8;
5530
Aaro Koskinen8104e322011-03-13 12:26:22 +02005531 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305532 TimingPoint = pVBInfo->NTSCTiming;
5533
5534 if (pVBInfo->TVInfo & SetPALTV)
5535 TimingPoint = pVBInfo->PALTiming;
5536
5537 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5538 TimingPoint = pVBInfo->HiTVExtTiming;
5539
5540 if (pVBInfo->VBInfo & SetInSlaveMode)
5541 TimingPoint = pVBInfo->HiTVSt2Timing;
5542
5543 if (pVBInfo->SetFlag & TVSimuMode)
5544 TimingPoint = pVBInfo->HiTVSt1Timing;
5545
5546 if (!(modeflag & Charx8Dot))
5547 TimingPoint = pVBInfo->HiTVTextTiming;
5548 }
5549
5550 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5551 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5552 TimingPoint = pVBInfo->YPbPr525iTiming;
5553
5554 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5555 TimingPoint = pVBInfo->YPbPr525pTiming;
5556
5557 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5558 TimingPoint = pVBInfo->YPbPr750pTiming;
5559 }
5560
5561 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005562 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305563
5564 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005565 /* di->temp2[j] */
5566 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305567
5568 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005569 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305570
5571 temp = pVBInfo->NewFlickerMode;
5572 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005573 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305574
5575 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5576 tempax = 950;
5577
5578 if (pVBInfo->TVInfo & SetPALTV)
5579 tempax = 520;
5580 else
5581 tempax = 440;
5582
5583 if (pVBInfo->VDE <= tempax) {
5584 tempax -= pVBInfo->VDE;
5585 tempax = tempax >> 2;
5586 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
5587 push1 = tempax;
5588 temp = (tempax & 0xFF00) >> 8;
5589 temp += (unsigned short) TimingPoint[0];
5590
5591 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5592 | VB_XGI302LV | VB_XGI301C)) {
5593 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5594 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5595 | SetCRT2ToYPbPr)) {
5596 tempcx = pVBInfo->VGAHDE;
5597 if (tempcx >= 1024) {
5598 temp = 0x17; /* NTSC */
5599 if (pVBInfo->TVInfo & SetPALTV)
5600 temp = 0x19; /* PAL */
5601 }
5602 }
5603 }
5604
Aaro Koskinen8104e322011-03-13 12:26:22 +02005605 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305606 tempax = push1;
5607 temp = (tempax & 0xFF00) >> 8;
5608 temp += TimingPoint[1];
5609
5610 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5611 | VB_XGI302LV | VB_XGI301C)) {
5612 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5613 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5614 | SetCRT2ToYPbPr))) {
5615 tempcx = pVBInfo->VGAHDE;
5616 if (tempcx >= 1024) {
5617 temp = 0x1D; /* NTSC */
5618 if (pVBInfo->TVInfo & SetPALTV)
5619 temp = 0x52; /* PAL */
5620 }
5621 }
5622 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005623 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305624 }
5625
5626 /* 301b */
5627 tempcx = pVBInfo->HT;
5628
5629 if (XGI_IsLCDDualLink(pVBInfo))
5630 tempcx = tempcx >> 1;
5631
5632 tempcx -= 2;
5633 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005634 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635
5636 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005637 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305638
5639 tempcx = pVBInfo->HT >> 1;
5640 push1 = tempcx; /* push cx */
5641 tempcx += 7;
5642
5643 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5644 tempcx -= 4;
5645
5646 temp = tempcx & 0x00FF;
5647 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005648 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305649
5650 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5651 tempbx += tempcx;
5652 push2 = tempbx;
5653 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005654 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305655 temp = (tempbx & 0xFF00) >> 8;
5656 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005657 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305658
5659 tempbx = push2;
5660 tempbx = tempbx + 8;
5661 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5662 tempbx = tempbx - 4;
5663 tempcx = tempbx;
5664 }
5665
5666 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005667 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305668
5669 j += 2;
5670 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5671 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005672 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305673 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005674 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305675
5676 tempcx += 8;
5677 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5678 tempcx -= 4;
5679
5680 temp = tempcx & 0xFF;
5681 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005682 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305683
5684 tempcx = push1; /* pop cx */
5685 j += 2;
5686 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5687 tempcx -= temp;
5688 temp = tempcx & 0x00FF;
5689 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005690 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305691
5692 tempcx -= 11;
5693
5694 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5695 tempax = XGI_GetVGAHT2(pVBInfo);
5696 tempcx = tempax - 1;
5697 }
5698 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005699 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305700
5701 tempbx = pVBInfo->VDE;
5702
5703 if (pVBInfo->VGAVDE == 360)
5704 tempbx = 746;
5705 if (pVBInfo->VGAVDE == 375)
5706 tempbx = 746;
5707 if (pVBInfo->VGAVDE == 405)
5708 tempbx = 853;
5709
5710 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005711 if (pVBInfo->VBType &
5712 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5713 if (!(pVBInfo->TVInfo &
5714 (SetYPbPrMode525p | SetYPbPrMode750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305715 tempbx = tempbx >> 1;
5716 } else
5717 tempbx = tempbx >> 1;
5718 }
5719
5720 tempbx -= 2;
5721 temp = tempbx & 0x00FF;
5722
5723 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5724 if (pVBInfo->VBType & VB_XGI301LV) {
5725 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5726 if (pVBInfo->VBInfo & SetInSlaveMode) {
5727 if (ModeNo == 0x2f)
5728 temp += 1;
5729 }
5730 }
5731 } else {
5732 if (pVBInfo->VBInfo & SetInSlaveMode) {
5733 if (ModeNo == 0x2f)
5734 temp += 1;
5735 }
5736 }
5737 }
5738
Aaro Koskinen8104e322011-03-13 12:26:22 +02005739 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305740
5741 temp = (tempcx & 0xFF00) >> 8;
5742 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5743
5744 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5745 if (pVBInfo->VBType & VB_XGI301LV) {
5746 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5747 temp |= 0x10;
5748
5749 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5750 temp |= 0x20;
5751 }
5752 } else {
5753 temp |= 0x10;
5754 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5755 temp |= 0x20;
5756 }
5757 }
5758
Aaro Koskinen8104e322011-03-13 12:26:22 +02005759 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305760
5761 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5762 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5763 tempbx = pVBInfo->VDE;
5764 tempcx = tempbx - 2;
5765
5766 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5767 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5768 | SetYPbPrMode750p)))
5769 tempbx = tempbx >> 1;
5770 }
5771
5772 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5773 temp = 0;
5774 if (tempcx & 0x0400)
5775 temp |= 0x20;
5776
5777 if (tempbx & 0x0400)
5778 temp |= 0x40;
5779
Aaro Koskinen8104e322011-03-13 12:26:22 +02005780 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305781 }
5782
5783 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005784 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305785 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005786 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305787 }
5788
5789 tempbx = tempbx & 0x00FF;
5790
5791 if (!(modeflag & HalfDCLK)) {
5792 tempcx = pVBInfo->VGAHDE;
5793 if (tempcx >= pVBInfo->HDE) {
5794 tempbx |= 0x2000;
5795 tempax &= 0x00FF;
5796 }
5797 }
5798
5799 tempcx = 0x0101;
5800
5801 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5802 if (pVBInfo->VGAHDE >= 1024) {
5803 tempcx = 0x1920;
5804 if (pVBInfo->VGAHDE >= 1280) {
5805 tempcx = 0x1420;
5806 tempbx = tempbx & 0xDFFF;
5807 }
5808 }
5809 }
5810
5811 if (!(tempbx & 0x2000)) {
5812 if (modeflag & HalfDCLK)
5813 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5814
5815 push1 = tempbx;
5816 tempeax = pVBInfo->VGAHDE;
5817 tempebx = (tempcx & 0xFF00) >> 8;
5818 longtemp = tempeax * tempebx;
5819 tempecx = tempcx & 0x00FF;
5820 longtemp = longtemp / tempecx;
5821
5822 /* 301b */
5823 tempecx = 8 * 1024;
5824
5825 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5826 | VB_XGI302LV | VB_XGI301C)) {
5827 tempecx = tempecx * 8;
5828 }
5829
5830 longtemp = longtemp * tempecx;
5831 tempecx = pVBInfo->HDE;
5832 temp2 = longtemp % tempecx;
5833 tempeax = longtemp / tempecx;
5834 if (temp2 != 0)
5835 tempeax += 1;
5836
5837 tempax = (unsigned short) tempeax;
5838
5839 /* 301b */
5840 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5841 | VB_XGI302LV | VB_XGI301C)) {
5842 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5843 }
5844 /* end 301b */
5845
5846 tempbx = push1;
5847 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5848 | (tempbx & 0x00FF));
5849 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5850 | (tempax & 0x00FF));
5851 temp = (tempax & 0xFF00) >> 8;
5852 } else {
5853 temp = (tempax & 0x00FF) >> 8;
5854 }
5855
Aaro Koskinen8104e322011-03-13 12:26:22 +02005856 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305857 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005858 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305859 temp = tempcx & 0x00FF;
5860
5861 if (tempbx & 0x2000)
5862 temp = 0;
5863
5864 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5865 temp |= 0x18;
5866
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005867 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305868 if (pVBInfo->TVInfo & SetPALTV) {
5869 tempbx = 0x0382;
5870 tempcx = 0x007e;
5871 } else {
5872 tempbx = 0x0369;
5873 tempcx = 0x0061;
5874 }
5875
5876 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005877 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305878 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005879 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305880
5881 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5882 temp = temp << 2;
5883 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5884
5885 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5886 temp |= 0x10;
5887
5888 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5889 temp |= 0x20;
5890
5891 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5892 temp |= 0x60;
5893 }
5894
Aaro Koskinen8104e322011-03-13 12:26:22 +02005895 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005896 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005897 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305898
5899 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5900 if (pVBInfo->TVInfo & NTSC1024x768) {
5901 TimingPoint = XGI_NTSC1024AdjTime;
5902 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005903 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305904 TimingPoint[j]);
5905 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005906 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305907 }
5908 }
5909
5910 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5911 if (pVBInfo->VBType & VB_XGI301C) {
5912 if (pVBInfo->TVInfo & SetPALMTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005913 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305914 0x08); /* PALM Mode */
5915 }
5916
5917 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005918 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305919 0x01);
5920 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005921 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305922
5923 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
Aaro Koskinendc505562011-03-13 12:26:26 +02005924 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305925 }
5926
5927 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5928 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005929 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305930 }
5931
5932 if (pVBInfo->VBInfo & SetCRT2ToTV)
5933 return;
5934}
5935
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005936static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305937 struct xgi_hw_device_info *HwDeviceExtension,
5938 unsigned short RefreshRateTableIndex,
5939 struct vb_device_info *pVBInfo)
5940{
5941 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5942 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5943
5944 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5945
5946 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005947 /* si+St_ResInfo */
5948 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305949 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5950 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005951 /* si+Ext_ResInfo */
5952 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305953 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005954 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5955 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305956 CRT1Index &= IndexMask;
5957 }
5958
5959 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5960 return;
5961
5962 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5963
5964 if (XGI_IsLCDDualLink(pVBInfo))
5965 tempbx = tempbx >> 1;
5966
5967 tempbx -= 1;
5968 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005969 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305970 temp = (tempbx & 0xFF00) >> 8;
5971 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005972 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305973 temp = 0x01;
5974
5975 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5976 if (pVBInfo->ModeType == ModeEGA) {
5977 if (pVBInfo->VGAHDE >= 1024) {
5978 temp = 0x02;
5979 if (pVBInfo->LCDInfo & LCDVESATiming)
5980 temp = 0x01;
5981 }
5982 }
5983 }
5984
Aaro Koskinen8104e322011-03-13 12:26:22 +02005985 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305986 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5987 push1 = tempbx;
5988 tempbx--;
5989 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005990 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305991 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005992 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305993
5994 tempcx = pVBInfo->VT - 1;
5995 push2 = tempcx + 1;
5996 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005997 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305998 temp = (tempcx & 0xFF00) >> 8;
5999 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006000 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006001 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
6002 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
6003 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
6004 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306005
6006 /* Customized LCDB Des no add */
6007 tempbx = 5;
6008 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
6009 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6010 tempah = pVBInfo->LCDResInfo;
6011 tempah &= PanelResInfo;
6012
6013 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
6014 tempbx = 1024;
6015 tempcx = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006016 } else if ((tempah == Panel1280x1024) ||
6017 (tempah == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306018 tempbx = 1280;
6019 tempcx = 1024;
6020 } else if (tempah == Panel1400x1050) {
6021 tempbx = 1400;
6022 tempcx = 1050;
6023 } else {
6024 tempbx = 1600;
6025 tempcx = 1200;
6026 }
6027
6028 if (pVBInfo->LCDInfo & EnableScalingLCD) {
6029 tempbx = pVBInfo->HDE;
6030 tempcx = pVBInfo->VDE;
6031 }
6032
6033 pushbx = tempbx;
6034 tempax = pVBInfo->VT;
6035 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
6036 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
6037 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
6038 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
6039 tempbx = pVBInfo->LCDVDES;
6040 tempcx += tempbx;
6041
6042 if (tempcx >= tempax)
6043 tempcx -= tempax; /* lcdvdes */
6044
6045 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006046 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306047 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006048 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306049 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
6050 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
6051 tempah = tempch;
6052 tempah = tempah << 3;
6053 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006054 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306055
6056 /* getlcdsync() */
6057 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
6058 tempcx = tempbx;
6059 tempax = pVBInfo->VT;
6060 tempbx = pVBInfo->LCDVRS;
6061
6062 /* if (SetLCD_Info & EnableScalingLCD) */
6063 tempcx += tempbx;
6064 if (tempcx >= tempax)
6065 tempcx -= tempax;
6066
6067 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006068 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306069 temp = (tempbx & 0xFF00) >> 8;
6070 temp = temp << 4;
6071 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006072 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306073 tempcx = pushbx;
6074 tempax = pVBInfo->HT;
6075 tempbx = pVBInfo->LCDHDES;
6076 tempbx &= 0x0FFF;
6077
6078 if (XGI_IsLCDDualLink(pVBInfo)) {
6079 tempax = tempax >> 1;
6080 tempbx = tempbx >> 1;
6081 tempcx = tempcx >> 1;
6082 }
6083
6084 if (pVBInfo->VBType & VB_XGI302LV)
6085 tempbx += 1;
6086
6087 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
6088 tempbx += 1;
6089
6090 tempcx += tempbx;
6091
6092 if (tempcx >= tempax)
6093 tempcx -= tempax;
6094
6095 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006096 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306097 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006098 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306099 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006100 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306101 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006102 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306103
6104 /* getlcdsync() */
6105 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
6106 tempcx = tempax;
6107 tempax = pVBInfo->HT;
6108 tempbx = pVBInfo->LCDHRS;
6109 /* if ( SetLCD_Info & EnableScalingLCD) */
6110 if (XGI_IsLCDDualLink(pVBInfo)) {
6111 tempax = tempax >> 1;
6112 tempbx = tempbx >> 1;
6113 tempcx = tempcx >> 1;
6114 }
6115
6116 if (pVBInfo->VBType & VB_XGI302LV)
6117 tempbx += 1;
6118
6119 tempcx += tempbx;
6120
6121 if (tempcx >= tempax)
6122 tempcx -= tempax;
6123
6124 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006125 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306126
6127 temp = (tempbx & 0xFF00) >> 8;
6128 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006129 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306130 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006131 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306132
6133 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
6134 if (pVBInfo->VGAVDE == 525) {
6135 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
6136 | VB_XGI301LV | VB_XGI302LV
6137 | VB_XGI301C)) {
6138 temp = 0xC6;
6139 } else
6140 temp = 0xC4;
6141
Aaro Koskinen8104e322011-03-13 12:26:22 +02006142 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
6143 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306144 }
6145
6146 if (pVBInfo->VGAVDE == 420) {
6147 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
6148 | VB_XGI301LV | VB_XGI302LV
6149 | VB_XGI301C)) {
6150 temp = 0x4F;
6151 } else
6152 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006153 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306154 }
6155 }
6156}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006157
6158/* --------------------------------------------------------------------- */
6159/* Function : XGI_GetTap4Ptr */
6160/* Input : */
6161/* Output : di -> Tap4 Reg. Setting Pointer */
6162/* Description : */
6163/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006164static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306165 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006166{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306167 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306169 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306171 if (tempcx == 0) {
6172 tempax = pVBInfo->VGAHDE;
6173 tempbx = pVBInfo->HDE;
6174 } else {
6175 tempax = pVBInfo->VGAVDE;
6176 tempbx = pVBInfo->VDE;
6177 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306179 if (tempax < tempbx)
6180 return &EnlargeTap4Timing[0];
6181 else if (tempax == tempbx)
6182 return &NoScaleTap4Timing[0]; /* 1:1 */
6183 else
6184 Tap4TimingPtr = NTSCTap4Timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306186 if (pVBInfo->TVInfo & SetPALTV)
6187 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306189 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
6190 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6191 Tap4TimingPtr = YPbPr525iTap4Timing;
6192 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6193 Tap4TimingPtr = YPbPr525pTap4Timing;
6194 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6195 Tap4TimingPtr = YPbPr750pTap4Timing;
6196 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306198 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
6199 Tap4TimingPtr = HiTVTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006200
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306201 i = 0;
6202 while (Tap4TimingPtr[i].DE != 0xFFFF) {
6203 if (Tap4TimingPtr[i].DE == tempax)
6204 break;
6205 i++;
6206 }
6207 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006208}
6209
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006210static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006211{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306212 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306214 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006215
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306216 if (!(pVBInfo->VBType & VB_XGI301C))
6217 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006218
6219#ifndef Tap4
Aaro Koskinendc505562011-03-13 12:26:26 +02006220 xgifb_reg_and(pVBInfo->Part2Port, 0x4E, 0xEB); /* Disable Tap4 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006221#else /* Tap4 Setting */
6222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306223 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
6224 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006225 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006226
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006227 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
6228 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
6229 /* Set Vertical Scaling */
6230 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306231 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006232 xgifb_reg_set(pVBInfo->Part2Port,
6233 i,
6234 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306235 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006236
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006237 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
6238 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
6239 /* Enable V.Scaling */
6240 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306241 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006242 /* Enable H.Scaling */
6243 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006244#endif
6245}
6246
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006247static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306248 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006249{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306250 unsigned short i;
6251 unsigned char *tempdi;
6252 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306254 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006255 /* si+St_ResInfo */
6256 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306257 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006258 /* si+Ext_ResInfo */
6259 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006260
Aaro Koskinen8104e322011-03-13 12:26:22 +02006261 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306262 if (pVBInfo->TVInfo & SetPALTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006263 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
6264 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306265 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006266 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
6267 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306268 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306270 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6271 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006272
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306273 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006274 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
6275 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
6276 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306277 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306279 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
6280 & SetCRT2ToYPbPr)) {
6281 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6282 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306284 tempdi = pVBInfo->HiTVGroup3Data;
6285 if (pVBInfo->SetFlag & TVSimuMode) {
6286 tempdi = pVBInfo->HiTVGroup3Simu;
6287 if (!(modeflag & Charx8Dot))
6288 tempdi = pVBInfo->HiTVGroup3Text;
6289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306291 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6292 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306294 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6295 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306297 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006298 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306300 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
6301 if (pVBInfo->TVInfo & SetYPbPrMode525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006302 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306303 }
6304 }
6305 return;
6306} /* {end of XGI_SetGroup3} */
6307
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006308static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306309 unsigned short RefreshRateTableIndex,
6310 struct xgi_hw_device_info *HwDeviceExtension,
6311 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006312{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306313 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006314
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306315 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006316
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306317 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006318 /* si+St_ResInfo */
6319 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306320 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006321 /* si+Ext_ResInfo */
6322 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306324 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006325 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006326
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306327 tempbx = pVBInfo->RVBHCMAX;
6328 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006329 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306330 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
6331 tempcx = pVBInfo->VGAHT - 1;
6332 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006333 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306335 temp = ((tempcx & 0xFF00) >> 8) << 3;
6336 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306338 tempcx = pVBInfo->VGAVT - 1;
6339 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6340 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306342 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006343 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306344 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006345 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006346 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306347 tempcx = pVBInfo->VBInfo;
6348 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306350 if (modeflag & HalfDCLK)
6351 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306353 if (XGI_IsLCDDualLink(pVBInfo))
6354 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306356 if (tempcx & SetCRT2ToHiVisionTV) {
6357 temp = 0;
6358 if (tempbx <= 1024)
6359 temp = 0xA0;
6360 if (tempbx == 1280)
6361 temp = 0xC0;
6362 } else if (tempcx & SetCRT2ToTV) {
6363 temp = 0xA0;
6364 if (tempbx <= 800)
6365 temp = 0x80;
6366 } else {
6367 temp = 0x80;
6368 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6369 temp = 0;
6370 if (tempbx > 800)
6371 temp = 0x60;
6372 }
6373 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306375 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
6376 temp = 0x00;
6377 if (pVBInfo->VGAHDE == 1280)
6378 temp = 0x40;
6379 if (pVBInfo->VGAHDE == 1024)
6380 temp = 0x20;
6381 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006382 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006383
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306384 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306386 if (tempcx & SetCRT2ToHiVisionTV) {
6387 if (!(temp & 0xE000))
6388 tempbx = tempbx >> 1;
6389 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306391 tempcx = pVBInfo->RVBHRS;
6392 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006393 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306395 tempeax = pVBInfo->VGAVDE;
6396 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306398 if (tempeax <= tempebx) {
6399 tempcx = (tempcx & (~0x4000));
6400 tempeax = pVBInfo->VGAVDE;
6401 } else {
6402 tempeax -= tempebx;
6403 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006404
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306405 templong = (tempeax * 256 * 1024) % tempebx;
6406 tempeax = (tempeax * 256 * 1024) / tempebx;
6407 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306409 if (templong != 0)
6410 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306412 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006413 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006414
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306415 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006416 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306417 tempbx = (unsigned short) (tempebx >> 16);
6418 temp = tempbx & 0x00FF;
6419 temp = temp << 4;
6420 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006421 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306423 /* 301b */
6424 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6425 | VB_XGI302LV | VB_XGI301C)) {
6426 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006427 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306428 tempax = pVBInfo->VGAHDE;
6429 if (modeflag & HalfDCLK)
6430 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306432 if (XGI_IsLCDDualLink(pVBInfo))
6433 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006434
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006435 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD)) ||
6436 ((pVBInfo->TVInfo&SetYPbPrMode525p) ||
6437 (pVBInfo->TVInfo&SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306438 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6439 if (tempax > 800)
6440 tempax -= 800;
6441 } else {
6442 if (pVBInfo->VGAHDE > 800) {
6443 if (pVBInfo->VGAHDE == 1024)
6444 tempax = (tempax * 25 / 32) - 1;
6445 else
6446 tempax = (tempax * 20 / 32) - 1;
6447 }
6448 }
6449 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306451 /*
6452 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6453 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006454 if (!(pVBInfo->TVInfo &
6455 (SetYPbPrMode525p |
6456 SetYPbPrMode750p |
6457 SetYPbPrMode1080i))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306458 if (pVBInfo->VGAHDE > 800) {
6459 if (pVBInfo->VGAHDE == 1024)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006460 tempax =(tempax * 25 /
6461 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306462 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006463 tempax = (tempax * 20 /
6464 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306465 }
6466 }
6467 } else {
6468 if (pVBInfo->VGAHDE > 800) {
6469 if (pVBInfo->VGAHDE == 1024)
6470 tempax = (tempax * 25 / 32) - 1;
6471 else
6472 tempax = (tempax * 20 / 32) - 1;
6473 }
6474 }
6475 }
6476 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006477
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306478 temp = (tempax & 0xFF00) >> 8;
6479 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006480 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306481 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006482 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006483
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306484 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6485 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006486 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006487
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306488 }
6489 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006490
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306491 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6492 if (!(pVBInfo->TVInfo & (NTSC1024x768
6493 | SetYPbPrMode525p | SetYPbPrMode750p
6494 | SetYPbPrMode1080i))) {
6495 temp |= 0x0001;
6496 if ((pVBInfo->VBInfo & SetInSlaveMode)
6497 && (!(pVBInfo->TVInfo
6498 & TVSimuMode)))
6499 temp &= (~0x0001);
6500 }
6501 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006502
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006503 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306504 tempbx = pVBInfo->HT;
6505 if (XGI_IsLCDDualLink(pVBInfo))
6506 tempbx = tempbx >> 1;
6507 tempbx = (tempbx >> 1) - 2;
6508 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006509 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306510 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006511 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306512 }
6513 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306515 if (pVBInfo->ISXPDOS == 0)
6516 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6517 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006518}
6519
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006520static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
6521{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006522 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006523}
6524
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006525static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306526 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006527{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306528 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006529
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306530 Pindex = pVBInfo->Part5Port;
6531 Pdata = pVBInfo->Part5Port + 1;
6532 if (pVBInfo->ModeType == ModeVGA) {
6533 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
6534 | CRT2DisplayFlag))) {
6535 XGINew_EnableCRT2(pVBInfo);
6536 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
6537 }
6538 }
6539 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006540}
6541
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006542static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306543 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006544{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006545 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006546}
6547
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006548static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306549 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006550{
6551
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006552 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006553}
6554
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006555/*----------------------------------------------------------------------------*/
6556/* input */
6557/* bl[5] : 1;LVDS signal on */
6558/* bl[1] : 1;LVDS backlight on */
6559/* bl[0] : 1:LVDS VDD on */
6560/* bh: 100000b : clear bit 5, to set bit5 */
6561/* 000010b : clear bit 1, to set bit1 */
6562/* 000001b : clear bit 0, to set bit0 */
6563/*----------------------------------------------------------------------------*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306564void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6565 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006566{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306567 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006568
Aaro Koskinen58839b02011-03-13 12:26:23 +02006569 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306570 tempbh &= 0x23;
6571 tempbl &= 0x23;
Aaro Koskinendc505562011-03-13 12:26:26 +02006572 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006573
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306574 if (tempbh & 0x20) {
6575 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006576
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006577 /* CR B4[1] */
6578 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006579
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006581
Aaro Koskinen58839b02011-03-13 12:26:23 +02006582 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006583
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306584 temp = XG21GPIODataTransfer(temp);
6585 temp &= ~tempbh;
6586 temp |= tempbl;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006587 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006588}
6589
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306590void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6591 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006592{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306593 unsigned char CR4A, temp;
6594 unsigned short tempbh0, tempbl0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306596 tempbh0 = tempbh;
6597 tempbl0 = tempbl;
6598 tempbh0 &= 0x20;
6599 tempbl0 &= 0x20;
6600 tempbh0 >>= 3;
6601 tempbl0 >>= 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306603 if (tempbh & 0x20) {
6604 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006605
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006606 /* CR B4[1] */
6607 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006608
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306609 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006610 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006611
Aaro Koskinen58839b02011-03-13 12:26:23 +02006612 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306613 tempbh &= 0x03;
6614 tempbl &= 0x03;
6615 tempbh <<= 2;
6616 tempbl <<= 2; /* GPIOC,GPIOD */
Aaro Koskinendc505562011-03-13 12:26:26 +02006617 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006618 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006619}
6620
6621/* --------------------------------------------------------------------- */
Bill Pemberton80adad82010-06-17 13:10:51 -04006622unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006623{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306624 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006625
Aaro Koskinen58839b02011-03-13 12:26:23 +02006626 index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306627 if (index < sizeof(XGI21_LCDCapList)
6628 / sizeof(struct XGI21_LVDSCapStruct))
6629 return index;
6630 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006631}
6632
6633/* --------------------------------------------------------------------- */
6634/* Function : XGI_XG21SetPanelDelay */
6635/* Input : */
6636/* Output : */
6637/* Description : */
6638/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6639/* : bl : 2 ; T2 : the duration signal on and Vdd on */
6640/* : bl : 3 ; T3 : the duration between CPL off and signal off */
6641/* : bl : 4 ; T4 : the duration signal off and Vdd off */
6642/* --------------------------------------------------------------------- */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306643void XGI_XG21SetPanelDelay(unsigned short tempbl,
6644 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006645{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306646 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306648 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6649 if (tempbl == 1)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006650 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306652 if (tempbl == 2)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006653 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306655 if (tempbl == 3)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006656 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306658 if (tempbl == 4)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006659 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006660}
6661
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006662unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306663 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006664{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306665 unsigned short xres, yres, colordepth, modeflag, resindex,
6666 lvdstableindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306668 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6669 if (ModeNo <= 0x13) {
6670 xres = pVBInfo->StResInfo[resindex].HTotal;
6671 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006672 /* si+St_ResInfo */
6673 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306674 } else {
6675 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6676 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006677 /* si+St_ModeFlag */
6678 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306681 if (!(modeflag & Charx8Dot)) {
6682 xres /= 9;
6683 xres *= 8;
6684 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306686 if (ModeNo > 0x13) {
6687 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6688 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006689
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306690 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6691 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306693 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306695 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6696 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6697 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04006698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306699 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6700 return 0;
6701
6702 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006703 if ((xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6704 LVDSHDE)) ||
6705 (yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6706 LVDSVDE))) {
6707 colordepth = XGI_GetColorDepth(ModeNo,
6708 ModeIdIndex,
6709 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306710 if (colordepth > 2)
6711 return 0;
6712
6713 }
6714 }
6715 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006716}
6717
Bill Pemberton80adad82010-06-17 13:10:51 -04006718void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006719{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306720 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006721
Aaro Koskinen58839b02011-03-13 12:26:23 +02006722 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306723 temp = (temp & 1) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006724 /* SR06[6] 18bit Dither */
6725 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
6726 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
6727 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006728
6729}
6730
Bill Pemberton80adad82010-06-17 13:10:51 -04006731void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006732{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306733 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006734
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006735 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
6736 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306737 temp = (temp & 3) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006738 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
6739 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
6740 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
6741 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006742
6743}
6744
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006745static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
6746 unsigned short ModeIdIndex,
6747 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006748{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306749 unsigned char temp, Miscdata;
6750 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6751 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6752 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6753 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306755 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006756
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006757 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6758 LVDS_Capability &
6759 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306760 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006761 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006762
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006763 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006764
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006765 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6766 LVDS_Capability & LCDPolarity);
6767 /* SR35[7] FP VSync polarity */
6768 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6769 /* SR30[5] FP HSync polarity */
6770 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306772 XGI_SetXG21FPBits(pVBInfo);
6773 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6774 if (ModeNo <= 0x13) {
6775 xres = pVBInfo->StResInfo[resindex].HTotal;
6776 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006777 /* si+St_ResInfo */
6778 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306779 } else {
6780 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6781 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006782 /* si+St_ModeFlag */
6783 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306784 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306786 if (!(modeflag & Charx8Dot))
6787 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306789 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306791 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6792 - xres) / 2;
6793 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6794 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306796 if (LVDSHBS > LVDSHT)
6797 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306799 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6800 if (LVDSHRS > LVDSHT)
6801 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006802
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306803 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6804 if (LVDSHRE > LVDSHT)
6805 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306807 LVDSHBE = LVDSHBS + LVDSHT
6808 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306810 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006811
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306812 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6813 - yres) / 2;
6814 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6815 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306817 if (LVDSVBS > LVDSVT)
6818 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306820 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6821 if (LVDSVRS > LVDSVT)
6822 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306824 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
6825 if (LVDSVRE > LVDSVT)
6826 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006827
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306828 LVDSVBE = LVDSVBS + LVDSVT
6829 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006830
Aaro Koskinen58839b02011-03-13 12:26:23 +02006831 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006832 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306834 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006835 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006836
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306837 /* HT SR0B[1:0] CR00 */
6838 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006839 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006840 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306842 /* HBS SR0B[5:4] CR02 */
6843 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006844 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006845 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306847 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6848 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006849 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6850 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6851 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306853 /* HRS SR0B[7:6] CR04 */
6854 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006855 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006856 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306858 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6859 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006860 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006861 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006862
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306863 /* HRE SR0C[2] CR05[4:0] */
6864 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006865 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6866 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306868 /* Panel HRE SR2F[7:2] */
6869 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006870 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306872 /* VT SR0A[0] CR07[5][0] CR06 */
6873 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006874 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6875 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6876 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006877 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006878
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306879 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6880 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006881 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6882 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6883 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006884 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006885
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306886 /* VBE SR0A[4] CR16 */
6887 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006888 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006889 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306891 /* VRS SR0A[3] CR7[7][2] CR10 */
6892 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006893 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6894 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6895 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006896 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306898 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006899 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03, (value & 0x600) >> 9);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006900 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006901 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006902
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306903 /* VRE SR0A[5] CR11[3:0] */
6904 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006905 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6906 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306908 /* Panel VRE SR3F[7:2] *//* SR3F[7] has to be 0, h/w bug */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006909 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306911 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006912
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006913 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006914 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006915 0x2B,
6916 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6917 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006918 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006919 0x2C,
6920 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6921 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306922 value += 0x10;
6923 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306925 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006926 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006927 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006928 /* set data, panning = 0, shift left 1 dot*/
6929 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006930
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006931 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006932 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306933
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006934 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306935 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006936
6937}
6938
6939/* no shadow case */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006940static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
6941 unsigned short ModeIdIndex,
6942 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006943{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306944 unsigned char temp, Miscdata;
6945 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6946 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6947 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6948 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006949
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306950 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006951 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6952 LVDS_Capability &
6953 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306954 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006955 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006956
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006957 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006958
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006959 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6960 LVDS_Capability & LCDPolarity);
6961 /* SR35[7] FP VSync polarity */
6962 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6963 /* SR30[5] FP HSync polarity */
6964 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006965
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306966 XGI_SetXG27FPBits(pVBInfo);
6967 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6968 if (ModeNo <= 0x13) {
6969 xres = pVBInfo->StResInfo[resindex].HTotal;
6970 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006971 /* si+St_ResInfo */
6972 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306973 } else {
6974 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6975 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006976 /* si+St_ModeFlag */
6977 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306978 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006979
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306980 if (!(modeflag & Charx8Dot))
6981 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306983 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006984
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306985 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6986 - xres) / 2;
6987 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6988 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006989
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306990 if (LVDSHBS > LVDSHT)
6991 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306993 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6994 if (LVDSHRS > LVDSHT)
6995 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306997 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6998 if (LVDSHRE > LVDSHT)
6999 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307001 LVDSHBE = LVDSHBS + LVDSHT
7002 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307004 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307006 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
7007 - yres) / 2;
7008 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
7009 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307011 if (LVDSVBS > LVDSVT)
7012 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007013
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307014 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
7015 if (LVDSVRS > LVDSVT)
7016 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007017
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007018 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].
7019 LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307020 if (LVDSVRE > LVDSVT)
7021 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007022
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307023 LVDSVBE = LVDSVBS + LVDSVT
7024 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007025
Aaro Koskinen58839b02011-03-13 12:26:23 +02007026 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007027 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307029 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007030 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307032 /* HT SR0B[1:0] CR00 */
7033 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007034 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007035 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307037 /* HBS SR0B[5:4] CR02 */
7038 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007039 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007040 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307042 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
7043 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007044 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
7045 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
7046 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307048 /* HRS SR0B[7:6] CR04 */
7049 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007050 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007051 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007052
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307053 /* Panel HRS SR2F[1:0] SR2E[7:0] */
7054 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007055 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007056 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007057
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307058 /* HRE SR0C[2] CR05[4:0] */
7059 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007060 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
7061 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307063 /* Panel HRE SR2F[7:2] */
7064 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007065 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007066
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307067 /* VT SR0A[0] CR07[5][0] CR06 */
7068 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007069 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
7070 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
7071 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007072 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307074 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
7075 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007076 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
7077 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
7078 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007079 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007080
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307081 /* VBE SR0A[4] CR16 */
7082 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007083 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007084 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307086 /* VRS SR0A[3] CR7[7][2] CR10 */
7087 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007088 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
7089 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
7090 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007091 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007092
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307093 /* Panel VRS SR35[2:0] SR34[7:0] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007094 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007095 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007096
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307097 /* VRE SR0A[5] CR11[3:0] */
7098 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007099 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
7100 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007101
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307102 /* Panel VRE SR3F[7:2] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007103 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0xFC);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307105 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007106
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007107 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007108 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007109 0x2B,
7110 pVBInfo->XG21_LVDSCapList[lvdstableindex].
7111 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007112 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007113 0x2C,
7114 pVBInfo->XG21_LVDSCapList[lvdstableindex].
7115 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307116 value += 0x10;
7117 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307119 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007120 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007121 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007122 /* set data, panning = 0, shift left 1 dot*/
7123 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007124
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007125 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007126 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307127
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007128 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307129 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007130
7131}
7132
7133/* --------------------------------------------------------------------- */
7134/* Function : XGI_IsLCDON */
7135/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04007136/* Output : 0 : Skip PSC Control */
7137/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007138/* Description : */
7139/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007140static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007141{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307142 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307144 tempax = pVBInfo->VBInfo;
7145 if (tempax & SetCRT2ToDualEdge)
7146 return 0;
7147 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
7148 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307150 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007151}
7152
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007153/* --------------------------------------------------------------------- */
7154/* Function : XGI_DisableChISLCD */
7155/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04007156/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007157/* Description : */
7158/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007159static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007160{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307161 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007162
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307163 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007164 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307166 if (tempbx & (EnableChA | DisableChA)) {
7167 if (!(tempah & 0x08)) /* Chk LCDA Mode */
7168 return 0;
7169 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307171 if (!(tempbx & (EnableChB | DisableChB)))
7172 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007173
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307174 if (tempah & 0x01) /* Chk LCDB Mode */
7175 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007176
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307177 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007178}
7179
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007180/* --------------------------------------------------------------------- */
7181/* Function : XGI_EnableChISLCD */
7182/* Input : */
7183/* Output : 0 -> Not LCD mode */
7184/* Description : */
7185/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007186static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007187{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307188 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307190 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007191 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307193 if (tempbx & (EnableChA | DisableChA)) {
7194 if (!(tempah & 0x08)) /* Chk LCDA Mode */
7195 return 0;
7196 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307198 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04007199 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007200
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307201 if (tempah & 0x01) /* Chk LCDB Mode */
7202 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007203
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307204 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007205}
7206
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307207void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
7208 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007209{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02007210 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007211
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307212 if (pVBInfo->SetFlag == Win9xDOSMode)
7213 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307215 /*
7216 if (CH7017) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007217 if (!(pVBInfo->VBInfo &
7218 (SetCRT2ToLCD | SetCRT2toLCDA)) ||
7219 (XGI_DisableChISLCD(pVBInfo))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307220 if (!XGI_IsLCDON(pVBInfo)) {
7221 if (DISCHARGE) {
7222 tempbx = XGINew_GetCH7005(0x61);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007223 // first time we power up
7224 if (tempbx < 0x01)
7225 // and disable power sequence
7226 XGINew_SetCH7005(0x0066);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307227 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007228 // leave VDD on - disable power
7229 XGINew_SetCH7005(0x5f66);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307230 }
7231 }
7232 }
7233 }
7234 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307236 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7237 | VB_XGI302LV | VB_XGI301C)) {
7238 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007239 if (!(pVBInfo->VBInfo &
7240 (DisableCRT2Display | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307241 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7242 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7243 tempah = 0x7F; /* Disable Channel A */
7244 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007245 /* Disable Channel B */
7246 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307248 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007249 /* force to disable Cahnnel */
7250 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007251
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307252 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007253 /* Force to disable Channel B */
7254 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307255 }
7256 }
7257 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007258
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007259 /* disable part4_1f */
7260 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307262 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7263 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
7264 || (XGI_DisableChISLCD(pVBInfo))
7265 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007266 /* LVDS Driver power down */
7267 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307268 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307270 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
7271 & (DisableCRT2Display | SetCRT2ToLCDA
7272 | SetSimuScanMode))) {
7273 if (pVBInfo->SetFlag & GatingCRT)
7274 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
7275 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7276 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307278 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7279 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
7280 & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007281 /* Power down */
7282 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307283 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007284
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007285 /* disable TV as primary VGA swap */
7286 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007287
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307288 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02007289 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007290
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007291 if ((pVBInfo->SetFlag & DisableChB) ||
7292 (pVBInfo->VBInfo &
7293 (DisableCRT2Display | SetSimuScanMode)) ||
7294 ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) &&
7295 (pVBInfo->VBInfo &
7296 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
7297 /* BScreenOff=1 */
7298 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007299
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007300 if ((pVBInfo->SetFlag & DisableChB) ||
7301 (pVBInfo->VBInfo &
7302 (DisableCRT2Display | SetSimuScanMode)) ||
7303 (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) ||
7304 (pVBInfo->VBInfo &
7305 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
7306 /* save Part1 index 0 */
7307 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
7308 /* BTDAC = 1, avoid VB reset */
7309 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
7310 /* disable CRT2 */
7311 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
7312 /* restore Part1 index 0 */
7313 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307314 }
7315 } else { /* {301} */
7316 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007317 /* BScreenOff=1 */
7318 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
7319 /* Disable CRT2 */
7320 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
7321 /* Disable TV asPrimary VGA swap */
7322 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307323 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307325 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
7326 | SetSimuScanMode))
7327 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7328 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007329}
7330
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007331/* --------------------------------------------------------------------- */
7332/* Function : XGI_GetTVPtrIndex */
7333/* Input : */
7334/* Output : */
7335/* Description : bx 0 : ExtNTSC */
7336/* 1 : StNTSC */
7337/* 2 : ExtPAL */
7338/* 3 : StPAL */
7339/* 4 : ExtHiTV */
7340/* 5 : StHiTV */
7341/* 6 : Ext525i */
7342/* 7 : St525i */
7343/* 8 : Ext525p */
7344/* 9 : St525p */
7345/* A : Ext750p */
7346/* B : St750p */
7347/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007348static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007349{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307350 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307352 if (pVBInfo->TVInfo & SetPALTV)
7353 tempbx = 2;
7354 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
7355 tempbx = 4;
7356 if (pVBInfo->TVInfo & SetYPbPrMode525i)
7357 tempbx = 6;
7358 if (pVBInfo->TVInfo & SetYPbPrMode525p)
7359 tempbx = 8;
7360 if (pVBInfo->TVInfo & SetYPbPrMode750p)
7361 tempbx = 10;
7362 if (pVBInfo->TVInfo & TVSimuMode)
7363 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307365 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007366}
7367
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007368/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007369/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007370/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007371/* Output : bx 0 : NTSC */
7372/* 1 : PAL */
7373/* 2 : PALM */
7374/* 3 : PALN */
7375/* 4 : NTSC1024x768 */
7376/* 5 : PAL-M 1024x768 */
7377/* 6-7: reserved */
7378/* cl 0 : YFilter1 */
7379/* 1 : YFilter2 */
7380/* ch 0 : 301A */
7381/* 1 : 301B/302B/301LV/302LV */
7382/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007383/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007384static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
7385 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007386{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007387 *tempbx = 0;
7388 *tempcl = 0;
7389 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007390
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007391 if (pVBInfo->TVInfo & SetPALTV)
7392 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007393
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007394 if (pVBInfo->TVInfo & SetPALMTV)
7395 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007396
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007397 if (pVBInfo->TVInfo & SetPALNTV)
7398 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007399
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007400 if (pVBInfo->TVInfo & NTSC1024x768) {
7401 *tempbx = 4;
7402 if (pVBInfo->TVInfo & SetPALMTV)
7403 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307404 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007405
7406 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7407 | VB_XGI302LV | VB_XGI301C)) {
7408 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
7409 & TVSimuMode)) {
7410 *tempbx += 8;
7411 *tempcl += 1;
7412 }
7413 }
7414
7415 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7416 | VB_XGI302LV | VB_XGI301C))
7417 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007418}
7419
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007420static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007421{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307422 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007423
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307424 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307426 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7427 | VB_XGI302LV | VB_XGI301C)) {
7428 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
7429 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
7430 tempbl = 0;
7431 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007432
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307433 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
7434 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307436 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7437 | VB_XGI301LV | VB_XGI302LV
7438 | VB_XGI301C))
7439 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307441 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7442 tempbl = tempbl >> 4;
7443 /*
7444 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
7445 tempbl = CRT2Delay1; // Get CRT2 Delay
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007446 if (pVBInfo->VBType &
7447 (VB_XGI301B |
7448 VB_XGI302B |
7449 VB_XGI301LV |
7450 VB_XGI302LV |
7451 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307452 tempbl = CRT2Delay2;
7453 */
7454 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007455 /* Get LCD Delay */
7456 index = XGI_GetLCDCapPtr(pVBInfo);
7457 tempbh = pVBInfo->LCDCapList[index].
7458 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307460 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
7461 tempbl = tempbh;
7462 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007463
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307464 tempbl &= 0x0F;
7465 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02007466 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307468 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
7469 | SetCRT2ToTV)) { /* Channel B */
7470 tempah &= 0xF0;
7471 tempah |= tempbl;
7472 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007473
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307474 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
7475 tempah &= 0x0F;
7476 tempah |= tempbh;
7477 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007478 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307479 }
7480 } else if (pVBInfo->IF_DEF_LVDS == 1) {
7481 tempbl = 0;
7482 tempbh = 0;
7483 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007484 /* / Get LCD Delay */
7485 tempah = pVBInfo->LCDCapList[
7486 XGI_GetLCDCapPtr(pVBInfo)].
7487 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307488 tempah &= 0x0f;
7489 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007490 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307491 tempah);
7492 }
7493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007494}
7495
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007496static void XGI_SetLCDCap_A(unsigned short tempcx,
7497 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007498{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307499 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007500
Aaro Koskinen58839b02011-03-13 12:26:23 +02007501 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307503 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007504 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007505 /* Enable Dither */
7506 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007507 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307508 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007509 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307510 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007511 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307512 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007513
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307514 /*
7515 if (tempcx & EnableLCD24bpp) { // 24bits
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007516 xgifb_reg_and_or(pVBInfo->Part1Port,
7517 0x19,
7518 0x0F,
7519 (unsigned short)(0x30 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007520 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307521 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007522 xgifb_reg_and_or(pVBInfo->Part1Port,
7523 0x19,
7524 0x0F,
7525 // Enable Dither
7526 (unsigned short)(0x20 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007527 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307528 }
7529 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007530}
7531
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007532/* --------------------------------------------------------------------- */
7533/* Function : XGI_SetLCDCap_B */
7534/* Input : cx -> LCD Capability */
7535/* Output : */
7536/* Description : */
7537/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007538static void XGI_SetLCDCap_B(unsigned short tempcx,
7539 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007540{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307541 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007542 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307543 (unsigned short) (((tempcx & 0x00ff) >> 6)
7544 | 0x0c));
7545 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007546 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307547 (unsigned short) (((tempcx & 0x00ff) >> 6)
7548 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007549}
7550
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007551static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007552{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307553 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007554
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307555 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007556
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007557 /* disable down spectrum D[4] */
7558 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307559 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007560 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307561 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007562
Aaro Koskinen8104e322011-03-13 12:26:22 +02007563 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307564 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007565 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307566 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007567 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307568 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007569 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307570 pVBInfo->LCDCapList[index].Spectrum_34);
7571 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007572 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007573}
7574
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007575static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
7576{
7577 unsigned short tempcx;
7578
7579 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
7580
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007581 if (pVBInfo->VBType &
7582 (VB_XGI301B |
7583 VB_XGI302B |
7584 VB_XGI301LV |
7585 VB_XGI302LV |
7586 VB_XGI301C)) { /* 301LV/302LV only */
7587 if (pVBInfo->VBType &
7588 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007589 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007590 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007591 (unsigned char) (tempcx & 0x1F));
7592 }
7593 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007594 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007595 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
7596 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
7597 | EnablePLLSPLOW)) >> 8));
7598 }
7599
7600 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7601 | VB_XGI302LV | VB_XGI301C)) {
7602 if (pVBInfo->VBInfo & SetCRT2ToLCD)
7603 XGI_SetLCDCap_B(tempcx, pVBInfo);
7604 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7605 XGI_SetLCDCap_A(tempcx, pVBInfo);
7606
7607 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7608 if (tempcx & EnableSpectrum)
7609 SetSpectrum(pVBInfo);
7610 }
7611 } else {
7612 /* LVDS,CH7017 */
7613 XGI_SetLCDCap_A(tempcx, pVBInfo);
7614 }
7615}
7616
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007617/* --------------------------------------------------------------------- */
7618/* Function : XGI_SetAntiFlicker */
7619/* Input : */
7620/* Output : */
7621/* Description : Set TV Customized Param. */
7622/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007623static void XGI_SetAntiFlicker(unsigned short ModeNo,
7624 unsigned short ModeIdIndex,
7625 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007626{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307627 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307629 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007630
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307631 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
7632 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307634 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7635 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307637 if (ModeNo <= 0x13)
7638 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
7639 else
7640 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307642 tempbx += index;
7643 tempah = TVAntiFlickList[tempbx];
7644 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007645
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007646 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007647}
7648
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007649static void XGI_SetEdgeEnhance(unsigned short ModeNo,
7650 unsigned short ModeIdIndex,
7651 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007652{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307653 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307655 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307657 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7658 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007659
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307660 if (ModeNo <= 0x13)
7661 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
7662 else
7663 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007664
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307665 tempbx += index;
7666 tempah = TVEdgeList[tempbx];
7667 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007668
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007669 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007670}
7671
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007672static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007673{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307674 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007675
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307676 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007677
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307678 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007679
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307680 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
7681 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007682
Aaro Koskinen8104e322011-03-13 12:26:22 +02007683 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307684 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007685 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307686 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007687 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307688 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007689 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307690 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007691}
7692
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007693static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307694 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007695{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307696 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007697
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307698 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307700 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307702 switch (tempbx) {
7703 case 0x00:
7704 case 0x04:
7705 filterPtr = NTSCYFilter1;
7706 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307708 case 0x01:
7709 filterPtr = PALYFilter1;
7710 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307712 case 0x02:
7713 case 0x05:
7714 case 0x0D:
7715 filterPtr = PALMYFilter1;
7716 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007717
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307718 case 0x03:
7719 filterPtr = PALNYFilter1;
7720 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007721
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307722 case 0x08:
7723 case 0x0C:
7724 filterPtr = NTSCYFilter2;
7725 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007726
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307727 case 0x0A:
7728 filterPtr = PALMYFilter2;
7729 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007730
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307731 case 0x0B:
7732 filterPtr = PALNYFilter2;
7733 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307735 case 0x09:
7736 filterPtr = PALYFilter2;
7737 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307739 default:
7740 return;
7741 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307743 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007744 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
7745 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307746 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007747 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
7748 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307750 if (tempcl == 0)
7751 index = tempal * 4;
7752 else
7753 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307755 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007756 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
7757 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
7758 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
7759 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307760 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007761 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
7762 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
7763 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
7764 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307765 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307767 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7768 | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007769 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
7770 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
7771 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307772 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007773}
7774
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007775/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007776/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007777/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007778/* Output : */
7779/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007780/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007781static void XGI_OEM310Setting(unsigned short ModeNo,
7782 unsigned short ModeIdIndex,
7783 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007784{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007785 if (pVBInfo->SetFlag & Win9xDOSMode)
7786 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007787
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007788 /* GetPart1IO(); */
7789 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007790
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007791 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
7792 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007793
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007794 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7795 /* GetPart2IO() */
7796 XGI_SetPhaseIncr(pVBInfo);
7797 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
7798 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007799
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007800 if (pVBInfo->VBType & VB_XGI301)
7801 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307802 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007803}
7804
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007805/* --------------------------------------------------------------------- */
7806/* Function : XGI_SetCRT2ModeRegs */
7807/* Input : */
7808/* Output : */
7809/* Description : Origin code for crt2group */
7810/* --------------------------------------------------------------------- */
Bill Pemberton82d6eb52010-06-17 13:10:46 -04007811void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307812 struct xgi_hw_device_info *HwDeviceExtension,
7813 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007814{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307815 unsigned short tempbl;
7816 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307818 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007819
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007820 /* // fix write part1 index 0 BTDRAM bit Bug
7821 * xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307822 tempah = 0;
7823 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007824 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307825 tempah &= ~0x10; /* BTRAMDAC */
7826 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007827
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307828 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7829 | SetCRT2ToLCD)) {
7830 tempah = 0x40; /* BTDRAM */
7831 if (ModeNo > 0x13) {
7832 tempcl = pVBInfo->ModeType;
7833 tempcl -= ModeVGA;
7834 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007835 /* BT Color */
7836 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307837 if (tempah == 0)
7838 tempah = 1;
7839 tempah |= 0x040;
7840 }
7841 }
7842 if (pVBInfo->VBInfo & SetInSlaveMode)
7843 tempah ^= 0x50; /* BTDAC */
7844 }
7845 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007846
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307847 /* 0210 shampoo
7848 if (pVBInfo->VBInfo & DisableCRT2Display) {
7849 tempah = 0;
7850 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007851
Aaro Koskinen8104e322011-03-13 12:26:22 +02007852 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307853 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7854 tempcl = pVBInfo->ModeType;
7855 if (ModeNo > 0x13) {
7856 tempcl -= ModeVGA;
7857 if ((tempcl > 0) || (tempcl == 0)) {
7858 tempah=(0x008>>tempcl) ;
7859 if (tempah == 0)
7860 tempah = 1;
7861 tempah |= 0x040;
7862 }
7863 } else {
7864 tempah = 0x040;
7865 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307867 if (pVBInfo->VBInfo & SetInSlaveMode) {
7868 tempah = (tempah ^ 0x050);
7869 }
7870 }
7871 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007872
Aaro Koskinen8104e322011-03-13 12:26:22 +02007873 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307874 tempah = 0x08;
7875 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307877 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007878 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307879 } else {
7880 tempah = 0x00;
7881 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307883 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7884 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007885 if ((pVBInfo->VBInfo & SetCRT2ToLCDA) &&
7886 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307887 tempbl &= 0xf7;
7888 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007889 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307890 tempbl, tempah);
7891 } else {
7892 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7893 tempbl &= 0xf7;
7894 tempah |= 0x01;
7895 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007896
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007897 if (pVBInfo->VBInfo &
7898 (SetCRT2ToRAMDAC |
7899 SetCRT2ToTV |
7900 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307901 tempbl &= 0xf8;
7902 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307904 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7905 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007906
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007907 if (!(pVBInfo->VBInfo &
7908 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307909 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007910 if (!(pVBInfo->VBInfo &
7911 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307912 tempah = tempah ^ 0x01;
7913 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007914
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007915 if (!(pVBInfo->VBInfo &
7916 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307917 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007918 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307919 0x2e, tempbl, tempah);
7920 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007921 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307922 0x2e, tempbl, tempah);
7923 }
7924 }
7925 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007926 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307927 tempah);
7928 }
7929 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307931 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7932 | SetCRT2ToLCDA)) {
7933 tempah &= (~0x08);
7934 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7935 & SetInSlaveMode))) {
7936 tempah |= 0x010;
7937 }
7938 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007939
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307940 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007941 /* if (!(pVBInfo->TVInfo &
7942 (SetYPbPrMode525p | SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307943 tempah |= 0x020;
7944 if (ModeNo > 0x13) {
7945 if (pVBInfo->VBInfo & DriverMode)
7946 tempah = tempah ^ 0x20;
7947 }
7948 /* } */
7949 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007950
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007951 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307952 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007953
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307954 if (pVBInfo->LCDInfo & SetLCDDualLink)
7955 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307957 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007958 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) &&
7959 (!(pVBInfo->TVInfo &
7960 (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307961 if (pVBInfo->TVInfo & RPLLDIV2XO)
7962 tempah |= 0x40;
7963 /* } */
7964 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007965
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307966 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7967 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7968 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307970 if (pVBInfo->LCDResInfo == Panel1280x960)
7971 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007972
Aaro Koskinen8104e322011-03-13 12:26:22 +02007973 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307974 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307976 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7977 | VB_XGI302LV | VB_XGI301C)) {
7978 tempah = 0;
7979 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307981 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7982 tempbl = 0xff;
7983 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7984 tempah |= 0x04; /* shampoo 0129 */
7985 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007986
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007987 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307988 tempah = 0x00;
7989 tempbl = 0xcf;
7990 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7991 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7992 tempah |= 0x30;
7993 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007994
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007995 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307996 tempah = 0;
7997 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307999 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
8000 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
8001 tempah |= 0xc0;
8002 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008003 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308004 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308006 tempah = 0;
8007 tempbl = 0x7f;
8008 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
8009 tempbl = 0xff;
8010 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
8011 tempah |= 0x80;
8012 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008013
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008014 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308016 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
8017 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02008018 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
8019 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308020 }
8021 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008022}
8023
Aaro Koskinen063b9c42011-03-08 22:16:13 +02008024static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308025 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008026{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308027 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308029 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308031 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
8032 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008033
8034}
8035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308036void XGI_OpenCRTC(struct xgi_hw_device_info *HwDeviceExtension,
8037 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008038{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308039 unsigned short tempbx;
8040 tempbx = 0;
8041}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008042
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308043void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
8044 struct vb_device_info *pVBInfo)
8045{
8046
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008047 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008048
8049}
8050
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308051void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
8052 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008053{
8054
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008055 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008056
8057}
8058
Bill Pemberton80adad82010-06-17 13:10:51 -04008059unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008060{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308061 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308063 if (pVBInfo->IF_DEF_LVDS == 1) {
8064 return 1;
8065 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008066 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308067 if ((flag == 1) || (flag == 2))
8068 return 1; /* 301b */
8069 else
8070 return 0;
8071 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008072}
8073
Bill Pemberton80adad82010-06-17 13:10:51 -04008074void XGI_LongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008075{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308076 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008077
Aaro Koskinen58839b02011-03-13 12:26:23 +02008078 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308080 if (!(i & 0xC0)) {
8081 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008082 if (!(inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308083 break;
8084 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308086 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008087 if ((inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308088 break;
8089 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008090 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008091}
8092
Aaro Koskinen063b9c42011-03-08 22:16:13 +02008093static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008094{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308095 unsigned short tempal, temp, i, j;
8096 return;
8097 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
8098 temp = 0;
8099 for (i = 0; i < 3; i++) {
8100 for (j = 0; j < 100; j++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008101 tempal = inb(pVBInfo->P3da);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308102 if (temp & 0x01) { /* VBWaitMode2 */
8103 if ((tempal & 0x08))
8104 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308106 if (!(tempal & 0x08))
8107 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308109 } else { /* VBWaitMode1 */
8110 if (!(tempal & 0x08))
8111 continue;
8112
8113 if ((tempal & 0x08))
8114 break;
8115 }
8116 }
8117 temp = temp ^ 0x01;
8118 }
8119 } else {
8120 XGI_LongWait(pVBInfo);
8121 }
8122 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008123}
8124
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008125unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
8126 unsigned short ModeNo, unsigned short ModeIdIndex,
8127 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008128{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008129 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
8130 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
8131 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008132
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008133 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008134
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008135 if (ModeNo <= 0x13)
8136 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
8137 else
8138 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
8139
8140 if (pVBInfo->IF_DEF_CH7005 == 1) {
8141 if (pVBInfo->VBInfo & SetCRT2ToTV) {
8142 if (modeflag & HalfDCLK)
8143 return 0;
8144 }
8145 }
8146
8147 if (ModeNo < 0x14)
8148 return 0xFFFF;
8149
Aaro Koskinen58839b02011-03-13 12:26:23 +02008150 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008151 index = index >> pVBInfo->SelectCRT2Rate;
8152 index &= 0x0F;
8153
8154 if (pVBInfo->LCDInfo & LCDNonExpanding)
8155 index = 0;
8156
8157 if (index > 0)
8158 index--;
8159
8160 if (pVBInfo->SetFlag & ProgrammingCRT2) {
8161 if (pVBInfo->IF_DEF_CH7005 == 1) {
8162 if (pVBInfo->VBInfo & SetCRT2ToTV)
8163 index = 0;
8164 }
8165
8166 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
8167 if (pVBInfo->IF_DEF_LVDS == 0) {
8168 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
8169 | VB_XGI301LV | VB_XGI302LV
8170 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008171 /* 301b */
8172 temp = LCDARefreshIndex[
8173 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008174 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008175 temp = LCDRefreshIndex[
8176 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008177
8178 if (index > temp)
8179 index = temp;
8180 } else {
8181 index = 0;
8182 }
8183 }
8184 }
8185
8186 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
8187 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
8188 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
8189 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008190 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag &
8191 XG2xNotSupport) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008192 index++;
8193 }
8194 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008195 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
8196 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008197 index++;
8198 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008199 /* Alan 10/19/2007;
8200 * do the similar adjustment like XGISearchCRT1Rate() */
8201 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
8202 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008203 index++;
8204 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008205 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
8206 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008207 index++;
8208 }
8209 }
8210
8211 i = 0;
8212 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008213 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
8214 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008215 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008216 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
8217 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008218 temp &= ModeInfoFlag;
8219 if (temp < pVBInfo->ModeType)
8220 break;
8221 i++;
8222 index--;
8223
8224 } while (index != 0xFFFF);
8225 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
8226 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008227 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
8228 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008229 if (temp & InterlaceMode)
8230 i++;
8231 }
8232 }
8233 i--;
8234 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
8235 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
8236 RefreshRateTableIndex, &i, pVBInfo);
8237 }
8238 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008239}
8240
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008241static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05308242 struct xgi_hw_device_info *HwDeviceExtension,
8243 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008244{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008245 unsigned short RefreshRateTableIndex;
8246 /* unsigned short temp ; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008247
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008248 /* pVBInfo->SelectCRT2Rate = 0; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008249
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008250 pVBInfo->SetFlag |= ProgrammingCRT2;
8251 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8252 ModeIdIndex, pVBInfo);
8253 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
8254 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8255 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8256 HwDeviceExtension, pVBInfo);
8257 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8258 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008259}
8260
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008261unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
8262 struct xgi_hw_device_info *HwDeviceExtension,
8263 struct vb_device_info *pVBInfo)
8264{
8265 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
8266
8267 tempbx = pVBInfo->VBInfo;
8268 pVBInfo->SetFlag |= ProgrammingCRT2;
8269 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8270 pVBInfo->SelectCRT2Rate = 4;
8271 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8272 ModeIdIndex, pVBInfo);
8273 XGI_SaveCRT2Info(ModeNo, pVBInfo);
8274 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
8275 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8276 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
8277 RefreshRateTableIndex, pVBInfo);
8278 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
8279 RefreshRateTableIndex, pVBInfo);
8280 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
8281 RefreshRateTableIndex, pVBInfo);
8282 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8283 HwDeviceExtension, pVBInfo);
8284 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
8285 RefreshRateTableIndex, pVBInfo);
8286 XGI_SetTap4Regs(pVBInfo);
8287 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
8288 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8289 HwDeviceExtension, pVBInfo);
8290 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8291 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
8292 XGI_AutoThreshold(pVBInfo);
8293 return 1;
8294}
8295
8296void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
8297{
8298 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
8299 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
8300 0x05, 0x00 };
8301
8302 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
8303
8304 unsigned char CR17, CR63, SR31;
8305 unsigned short temp;
8306 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
8307
8308 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02008309 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008310
8311 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008312 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02008313 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008314 pVBInfo->P3d4, 0x53) | 0x02));
8315
Aaro Koskinen58839b02011-03-13 12:26:23 +02008316 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
8317 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
8318 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008319
Aaro Koskinen8104e322011-03-13 12:26:22 +02008320 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
8321 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008322
Aaro Koskinen58839b02011-03-13 12:26:23 +02008323 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02008324 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008325
Aaro Koskinen58839b02011-03-13 12:26:23 +02008326 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02008327 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008328
Aaro Koskinen58839b02011-03-13 12:26:23 +02008329 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02008330 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02008331 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02008332 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008333
Aaro Koskinen8104e322011-03-13 12:26:22 +02008334 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008335
8336 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02008337 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008338
8339 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02008340 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008341 CRTCData[i]);
8342
8343 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02008344 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008345 CRTCData[i]);
8346
8347 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02008348 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008349 CRTCData[i]);
8350
Aaro Koskinen8104e322011-03-13 12:26:22 +02008351 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008352 & 0xE0));
8353
Aaro Koskinen8104e322011-03-13 12:26:22 +02008354 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
8355 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8356 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008357
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008358 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008359
8360 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008361 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
8362 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
8363 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008364 }
8365
8366 XGI_VBLongWait(pVBInfo);
8367 XGI_VBLongWait(pVBInfo);
8368 XGI_VBLongWait(pVBInfo);
8369
8370 mdelay(1);
8371
8372 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008373 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008374
8375 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008376 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008377 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008378 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008379
8380 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008381 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008382
8383 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008384 outb(0, (pVBInfo->P3c8 + 1));
8385 outb(0, (pVBInfo->P3c8 + 1));
8386 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008387 }
8388
Aaro Koskinen8104e322011-03-13 12:26:22 +02008389 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
8390 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
8391 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008392
8393 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02008394 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008395 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02008396 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008397}
8398
8399void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
8400 struct vb_device_info *pVBInfo)
8401{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02008402 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008403
8404 if (pVBInfo->SetFlag == Win9xDOSMode) {
8405 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8406 | VB_XGI302LV | VB_XGI301C)) {
8407 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8408 return;
8409 } else
8410 /* LVDS or CH7017 */
8411 return;
8412 }
8413
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008414 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8415 | VB_XGI302LV | VB_XGI301C)) {
8416 if (!(pVBInfo->SetFlag & DisableChA)) {
8417 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008418 /* Power on */
8419 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008420 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008421 /* SetCRT2ToLCDA ) */
8422 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
8423 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008424 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008425 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008426 }
8427 }
8428 }
8429
8430 if (!(pVBInfo->SetFlag & DisableChB)) {
8431 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
8432 & (SetCRT2ToLCD | SetCRT2ToTV
8433 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008434 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008435 pVBInfo->P3c4, 0x32);
8436 tempah &= 0xDF;
8437 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008438 if (!(pVBInfo->VBInfo &
8439 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008440 tempah |= 0x20;
8441 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02008442 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02008443 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008444
Aaro Koskinen58839b02011-03-13 12:26:23 +02008445 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008446 pVBInfo->Part1Port, 0x2E);
8447
8448 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008449 /* BVBDOENABLE = 1 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02008450 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008451 0x2E, 0x80);
8452 /* BScreenOFF = 0 */
8453 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008454 }
8455 }
8456
8457 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
8458 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008459 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008460 0x20); /* shampoo 0129 */
8461 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
8462 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008463 if (XGI_EnableChISLCD(pVBInfo) ||
8464 (pVBInfo->VBInfo &
8465 (SetCRT2ToLCD | SetCRT2ToLCDA)))
8466 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02008467 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008468 pVBInfo->Part4Port,
8469 0x2A,
8470 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008471 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008472 /* LVDS Driver power on */
8473 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008474 }
8475 }
8476
8477 tempah = 0x00;
8478
8479 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
8480 tempah = 0xc0;
8481
8482 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
8483 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008484 if (pVBInfo->VBInfo &
8485 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008486 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008487 if (pVBInfo->VBInfo &
8488 SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008489 tempah = tempah ^ 0xC0;
8490
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008491 if (pVBInfo->SetFlag &
8492 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008493 tempah &= 0xBF;
8494
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008495 if (pVBInfo->SetFlag &
8496 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008497 tempah &= 0x7F;
8498
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008499 if (pVBInfo->SetFlag &
8500 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008501 tempah |= 0x40;
8502
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008503 if (pVBInfo->SetFlag &
8504 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008505 tempah |= 0x80;
8506 }
8507 }
8508 }
8509 }
8510
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008511 /* EnablePart4_1F */
8512 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008513
8514 if (pVBInfo->SetFlag & Win9xDOSMode) {
8515 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8516 return;
8517 }
8518
8519 if (!(pVBInfo->SetFlag & DisableChA)) {
8520 XGI_VBLongWait(pVBInfo);
8521 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008522 XGI_DisableGatingCRT(HwDeviceExtension,
8523 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008524 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8525 XGI_VBLongWait(pVBInfo);
8526 }
8527 }
8528 } /* 301 */
8529 else { /* LVDS */
8530 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
8531 | SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008532 /* enable CRT2 */
8533 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008534
Aaro Koskinen58839b02011-03-13 12:26:23 +02008535 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008536 0x2E);
8537 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008538 /* BVBDOENABLE = 1 */
8539 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008540
Aaro Koskinendc505562011-03-13 12:26:26 +02008541 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008542 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8543 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008544}
8545
8546static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
8547 unsigned short ModeNo, unsigned short ModeIdIndex,
8548 struct vb_device_info *pVBInfo)
8549{
8550 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
8551
8552 unsigned short XGINew_P3cc = pVBInfo->P3cc;
8553
8554 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
8555 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
8556 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
8557 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
8558 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8559 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
8560 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
8561 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8562 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
8563 XGI_ClearExt1Regs(pVBInfo);
8564
8565 /* if (pVBInfo->IF_DEF_ExpLink) */
8566 if (HwDeviceExtension->jChipType == XG27) {
8567 if (pVBInfo->IF_DEF_LVDS == 0)
8568 XGI_SetDefaultVCLK(pVBInfo);
8569 }
8570
8571 temp = ~ProgrammingCRT2;
8572 pVBInfo->SetFlag &= temp;
8573 pVBInfo->SelectCRT2Rate = 0;
8574
8575 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8576 | VB_XGI302LV | VB_XGI301C)) {
8577 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
8578 | SetInSlaveMode)) {
8579 pVBInfo->SetFlag |= ProgrammingCRT2;
8580 }
8581 }
8582
8583 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8584 ModeIdIndex, pVBInfo);
8585 if (RefreshRateTableIndex != 0xFFFF) {
8586 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
8587 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8588 pVBInfo, HwDeviceExtension);
8589 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
8590 RefreshRateTableIndex, pVBInfo);
8591 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8592 HwDeviceExtension, pVBInfo);
8593 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
8594 RefreshRateTableIndex, pVBInfo);
8595 }
8596
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008597 if ((HwDeviceExtension->jChipType >= XG20) &&
8598 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008599 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008600 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
8601 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008602 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008603 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008604 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
8605 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008606 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8607 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008608 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008609 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008610 }
8611 }
8612
8613 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008614 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008615 if (temp & 0xA0) {
8616
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008617 /* Enable write GPIOF */
8618 /* xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); */
8619 /* P. DWN */
8620 /* xgifb_reg_and(pVBInfo->P3d4, 0x48, ~0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008621 /* XG21 CRT1 Timing */
8622 if (HwDeviceExtension->jChipType == XG27)
8623 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
8624 RefreshRateTableIndex, pVBInfo);
8625 else
8626 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
8627 RefreshRateTableIndex, pVBInfo);
8628
8629 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
8630 RefreshRateTableIndex);
8631
8632 if (HwDeviceExtension->jChipType == XG27)
8633 XGI_SetXG27LCD(pVBInfo, RefreshRateTableIndex,
8634 ModeNo);
8635 else
8636 XGI_SetXG21LCD(pVBInfo, RefreshRateTableIndex,
8637 ModeNo);
8638
8639 if (pVBInfo->IF_DEF_LVDS == 1) {
8640 if (HwDeviceExtension->jChipType == XG27)
8641 XGI_SetXG27LVDSPara(ModeNo,
8642 ModeIdIndex, pVBInfo);
8643 else
8644 XGI_SetXG21LVDSPara(ModeNo,
8645 ModeIdIndex, pVBInfo);
8646 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008647 /* P. ON */
8648 /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008649 }
8650 }
8651
8652 pVBInfo->SetFlag &= (~ProgrammingCRT2);
8653 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
8654 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
8655 RefreshRateTableIndex, pVBInfo);
8656
8657 /* XGI_LoadCharacter(); //dif ifdef TVFont */
8658
8659 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
8660 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
8661}
8662
8663unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
8664 unsigned short ModeNo)
8665{
8666 unsigned short ModeIdIndex;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008667 /* unsigned char *pVBInfo->FBAddr =
8668 HwDeviceExtension->pjVideoMemoryAddress; */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008669 struct vb_device_info VBINF;
8670 struct vb_device_info *pVBInfo = &VBINF;
8671 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
8672 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
8673 pVBInfo->IF_DEF_LVDS = 0;
8674 pVBInfo->IF_DEF_CH7005 = 0;
8675 pVBInfo->IF_DEF_LCDA = 1;
8676 pVBInfo->IF_DEF_CH7017 = 0;
8677 pVBInfo->IF_DEF_CH7007 = 0; /* [Billy] 2007/05/14 */
8678 pVBInfo->IF_DEF_VideoCapture = 0;
8679 pVBInfo->IF_DEF_ScaleLCD = 0;
8680 pVBInfo->IF_DEF_OEMUtil = 0;
8681 pVBInfo->IF_DEF_PWD = 0;
8682
8683 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
8684 pVBInfo->IF_DEF_YPbPr = 0;
8685 pVBInfo->IF_DEF_HiVision = 0;
8686 pVBInfo->IF_DEF_CRT2Monitor = 0;
8687 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008688 } else {
8689 pVBInfo->IF_DEF_YPbPr = 1;
8690 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02008691 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008692 }
8693
8694 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
8695 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
8696 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
8697 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
8698 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
8699 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
8700 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
8701 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
8702 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
8703 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
8704 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
8705 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
8706 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
8707 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
8708 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
8709 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
8710 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
8711 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
8712
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008713 /* for x86 Linux, XG21 LVDS */
8714 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008715 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008716 pVBInfo->IF_DEF_LVDS = 1;
8717 }
8718 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008719 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
8720 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008721 pVBInfo->IF_DEF_LVDS = 1;
8722 }
8723 }
8724
8725 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
8726 XGI_GetVBType(pVBInfo);
8727
8728 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
8729 if (ModeNo & 0x80) {
8730 ModeNo = ModeNo & 0x7F;
8731 /* XGINew_flag_clearbuffer = 0; */
8732 }
8733 /* else {
8734 XGINew_flag_clearbuffer = 1;
8735 }
8736 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008737 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008738
8739 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
8740 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
8741
8742 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8743
8744 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
8745
8746 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8747 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
8748 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
8749 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
8750 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
8751 /* XGI_OpenCRTC(HwDeviceExtension, pVBInfo); */
8752
8753 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
8754 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8755 ModeIdIndex, pVBInfo);
8756
8757 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8758 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8759 HwDeviceExtension, pVBInfo);
8760 }
8761 } else {
8762 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
8763 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8764 ModeIdIndex, pVBInfo);
8765 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8766 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8767 HwDeviceExtension,
8768 pVBInfo);
8769 }
8770 }
8771 }
8772
8773 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
8774 switch (HwDeviceExtension->ujVBChipID) {
8775 case VB_CHIP_301:
8776 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8777 pVBInfo); /*add for CRT2 */
8778 break;
8779
8780 case VB_CHIP_302:
8781 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8782 pVBInfo); /*add for CRT2 */
8783 break;
8784
8785 default:
8786 break;
8787 }
8788 }
8789
8790 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
8791 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
8792 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
8793 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
8794 } /* !XG20 */
8795 else {
8796 if (pVBInfo->IF_DEF_LVDS == 1)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008797 if (!XGI_XG21CheckLVDSMode(ModeNo,
8798 ModeIdIndex,
8799 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008800 return 0;
8801
8802 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008803 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
8804 St_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008805 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008806 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
8807 Ext_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008808 }
8809
8810 pVBInfo->SetFlag = 0;
8811 if (pVBInfo->IF_DEF_CH7007 != 1)
8812 pVBInfo->VBInfo = DisableCRT2Display;
8813
8814 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
8815
8816 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
8817 pVBInfo);
8818
8819 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8820 /*
8821 if (HwDeviceExtension->jChipType == XG21)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008822 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008823 */
8824 }
8825
8826 /*
8827 if (ModeNo <= 0x13) {
8828 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
8829 } else {
8830 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
8831 }
8832 pVBInfo->ModeType = modeflag&ModeInfoFlag;
8833 pVBInfo->SetFlag = 0x00;
8834 pVBInfo->VBInfo = DisableCRT2Display;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008835 temp = XGINew_CheckMemorySize(HwDeviceExtension,
8836 ModeNo,
8837 ModeIdIndex,
8838 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008839
8840 if (temp == 0)
8841 return (0);
8842
8843 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
8844 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
8845 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8846 */
8847
8848 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
8849
8850 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8851 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
8852 }
8853
8854 return 1;
8855}