blob: 9b2871ee6ab883fcf652b052049e46f068354932 [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002#include <linux/io.h>
Aaro Koskinend80aaa02011-02-17 23:29:14 +02003#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include <linux/types.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
8#include "vb_def.h"
9#include "vgatypes.h"
10#include "vb_struct.h"
11#include "vb_util.h"
12#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020013#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020014
15
16#define IndexMask 0xff
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020017
Randy Dunlap89229672010-08-10 08:46:44 -070018static unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
21 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
22 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
25 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
26 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020027
Randy Dunlap89229672010-08-10 08:46:44 -070028static unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040029 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
30 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
31 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
32 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
33 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
34 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
35 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
36 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020037
Randy Dunlap89229672010-08-10 08:46:44 -070038static unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040039 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
40 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
41 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
42 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
43 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
44 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
45 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
46 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020047
Randy Dunlap89229672010-08-10 08:46:44 -070048static unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040049 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
50 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
51 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
52 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
53 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
54 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
55 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
56 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
57 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
58 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020059
Bill Pemberton80adad82010-06-17 13:10:51 -040060void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020061{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053062 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
63 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
64 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
65 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
66 pVBInfo->XGINEWUB_CRT1Table
67 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053069 /* add for new UNIVGABIOS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +080070 /* XGINew_UBLCDDataTable =
71 * (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053072 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Aaro Koskinen06587332011-03-13 12:26:10 +020074 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
75 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053076 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
77 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
78 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
79 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
80 pVBInfo->ModeResInfo
81 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053083 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
84 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
85 pVBInfo->pSR07 = &XGI330_SR07;
86 pVBInfo->LCDResInfo = 0;
87 pVBInfo->LCDTypeInfo = 0;
88 pVBInfo->LCDInfo = 0;
89 pVBInfo->VBInfo = 0;
90 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053092 pVBInfo->SR15 = XGI340_SR13;
93 pVBInfo->CR40 = XGI340_cr41;
94 pVBInfo->SR25 = XGI330_sr25;
95 pVBInfo->pSR31 = &XGI330_sr31;
96 pVBInfo->pSR32 = &XGI330_sr32;
97 pVBInfo->CR6B = XGI340_CR6B;
98 pVBInfo->CR6E = XGI340_CR6E;
99 pVBInfo->CR6F = XGI340_CR6F;
100 pVBInfo->CR89 = XGI340_CR89;
101 pVBInfo->AGPReg = XGI340_AGPReg;
102 pVBInfo->SR16 = XGI340_SR16;
103 pVBInfo->pCRCF = &XG40_CRCF;
104 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530106 pVBInfo->CR49 = XGI330_CR49;
107 pVBInfo->pSR1F = &XGI330_SR1F;
108 pVBInfo->pSR21 = &XGI330_SR21;
109 pVBInfo->pSR22 = &XGI330_SR22;
110 pVBInfo->pSR23 = &XGI330_SR23;
111 pVBInfo->pSR24 = &XGI330_SR24;
112 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530114 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
115 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
116 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
117 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
118 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
119 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
120 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
121 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
122 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
123 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530125 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
126 pVBInfo->PALTiming = XGI330_PALTiming;
127 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
128 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
129 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
130 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
131 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
132 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
133 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
134 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
135 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
136 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
137 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
138 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530140 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
141 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
142 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530144 /* 310 customization related */
145 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
146 pVBInfo->LCDCapList = XGI_LCDDLCapList;
147 else
148 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530150 if ((ChipType == XG21) || (ChipType == XG27))
151 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530153 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
154 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530156 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 if (ChipType >= XG20)
159 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530161 if (ChipType == XG27) {
162 pVBInfo->MCLKData
163 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
164 pVBInfo->CR40 = XGI27_cr41;
165 pVBInfo->pXGINew_CR97 = &XG27_CR97;
166 pVBInfo->pSR36 = &XG27_SR36;
167 pVBInfo->pCR8F = &XG27_CR8F;
168 pVBInfo->pCRD0 = XG27_CRD0;
169 pVBInfo->pCRDE = XG27_CRDE;
170 pVBInfo->pSR40 = &XG27_SR40;
171 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530175 if (ChipType >= XG20) {
176 pVBInfo->pDVOSetting = &XG21_DVOSetting;
177 pVBInfo->pCR2E = &XG21_CR2E;
178 pVBInfo->pCR2F = &XG21_CR2F;
179 pVBInfo->pCR46 = &XG21_CR46;
180 pVBInfo->pCR47 = &XG21_CR47;
181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200182
183}
184
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800185static unsigned char XGI_GetModePtr(unsigned short ModeNo,
186 unsigned short ModeIdIndex,
187 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200188{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530189 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200190
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530191 if (ModeNo <= 0x13)
192 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
193 else {
194 if (pVBInfo->ModeType <= 0x02)
195 index = 0x1B; /* 02 -> ModeEGA */
196 else
197 index = 0x0F;
198 }
199 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200200}
201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530202/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800203unsigned char XGI_SetBIOSData(unsigned short ModeNo,
204 unsigned short ModeIdIndex) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530205 return (0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206}
207*/
208
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800209/* unsigned char XGI_ClearBankRegs(unsigned short ModeNo,
210 unsigned short ModeIdIndex) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530211 return( 0 ) ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212}
213*/
214
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800215static void XGI_SetSeqRegs(unsigned short ModeNo,
216 unsigned short StandTableIndex,
217 unsigned short ModeIdIndex,
218 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200219{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530220 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530221 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530223 if (ModeNo <= 0x13)
224 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
225 else
226 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227
Aaro Koskinen8104e322011-03-13 12:26:22 +0200228 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530229 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530231 i = SetCRT2ToLCDA;
232 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
233 tempah |= 0x01;
234 } else {
235 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
236 if (pVBInfo->VBInfo & SetInSlaveMode)
237 tempah |= 0x01;
238 }
239 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530241 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200242 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200243
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530244 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800245 /* Get SR2,3,4 from file */
246 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200247 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530248 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200249}
250
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200251static void XGI_SetMiscRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800252 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200253{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530254 unsigned char Miscdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200255
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800256 /* Get Misc from file */
257 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530258 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800259 if (pVBInfo->VBType & (VB_XGI301B |
260 VB_XGI302B |
261 VB_XGI301LV |
262 VB_XGI302LV |
263 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530264 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
265 Miscdata |= 0x0C;
266 }
267 }
268 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200269
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200270 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200271}
272
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200273static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800274 unsigned short StandTableIndex,
275 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200276{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530277 unsigned char CRTCdata;
278 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200279
Aaro Koskinen58839b02011-03-13 12:26:23 +0200280 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530281 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200282 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530284 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800285 /* Get CRTC from file */
286 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200287 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530288 }
289 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800290 if ((HwDeviceExtension->jChipType == XGI_630) &&
291 (HwDeviceExtension->jChipRevision == 0x30)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530292 if (pVBInfo->VBInfo & SetInSlaveMode) {
293 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200294 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530295 }
296 }
297 }
298 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200299}
300
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800301static void XGI_SetATTRegs(unsigned short ModeNo,
302 unsigned short StandTableIndex,
303 unsigned short ModeIdIndex,
304 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200305{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530306 unsigned char ARdata;
307 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200308
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530309 if (ModeNo <= 0x13)
310 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
311 else
312 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 for (i = 0; i <= 0x13; i++) {
315 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
316 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
317 if (i == 0x13) {
318 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
319 ARdata = 0;
320 } else {
321 if (pVBInfo->VBInfo & (SetCRT2ToTV
322 | SetCRT2ToLCD)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800323 if (pVBInfo->VBInfo &
324 SetInSlaveMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530325 ARdata = 0;
326 }
327 }
328 }
329 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200330
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200331 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200332 outb(i, pVBInfo->P3c0); /* set index */
333 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200335
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200336 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200337 outb(0x14, pVBInfo->P3c0); /* set index */
338 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200339 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200340 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200341}
342
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200343static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800344 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200345{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530346 unsigned char GRdata;
347 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530349 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800350 /* Get GR from file */
351 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200352 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530355 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200356 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530357 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200358 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530359 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200360}
361
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200362static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200363{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530364 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530366 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200367 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368}
369
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200370static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200371{
372
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200373 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200374 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
375 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200376
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200377 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200378 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
379 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200380
Aaro Koskinendc505562011-03-13 12:26:26 +0200381 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530382 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200383}
384
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200385static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530386 unsigned short ModeIdIndex,
387 unsigned short RefreshRateTableIndex, unsigned short *i,
388 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200389{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530392 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800393 /* si+St_ModeFlag */
394 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530395 else
396 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530398 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
399 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
400 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200401
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530402 if (pVBInfo->IF_DEF_LVDS == 0) {
403 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
404 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 if (pVBInfo->VBType & VB_XGI301C)
407 tempax |= SupportCRT2in301C;
408 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200409
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800410 /* 301b */
411 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530414 if (pVBInfo->LCDResInfo != Panel1280x1024) {
415 if (pVBInfo->LCDResInfo != Panel1280x960) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800416 if (pVBInfo->LCDInfo &
417 LCDNonExpanding) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530418 if (resinfo >= 9) {
419 tempax = 0;
420 return 0;
421 }
422 }
423 }
424 }
425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530427 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800428 if ((pVBInfo->VBType & VB_XGI301LV) &&
429 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530430 tempax |= SupportYPbPr;
431 if (pVBInfo->VBInfo & SetInSlaveMode) {
432 if (resinfo == 4)
433 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530435 if (resinfo == 3)
436 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530438 if (resinfo > 7)
439 return 0;
440 }
441 } else {
442 tempax |= SupportHiVisionTV;
443 if (pVBInfo->VBInfo & SetInSlaveMode) {
444 if (resinfo == 4)
445 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530447 if (resinfo == 3) {
448 if (pVBInfo->SetFlag
449 & TVSimuMode)
450 return 0;
451 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530453 if (resinfo > 7)
454 return 0;
455 }
456 }
457 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800458 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
459 SetCRT2ToSVIDEO |
460 SetCRT2ToSCART |
461 SetCRT2ToYPbPr |
462 SetCRT2ToHiVisionTV)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530463 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200464
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530465 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
466 | VB_XGI301LV | VB_XGI302LV
467 | VB_XGI301C)) {
468 tempax |= SupportTV1024;
469 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200470
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530471 if (!(pVBInfo->VBInfo & SetPALTV)) {
472 if (modeflag & NoSupportSimuTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800473 if (pVBInfo->VBInfo &
474 SetInSlaveMode) {
475 if (!(pVBInfo->VBInfo &
476 SetNotSimuMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530477 return 0;
478 }
479 }
480 }
481 }
482 }
483 }
484 } else { /* for LVDS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530485 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
486 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200487
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530488 if (resinfo > 0x08)
489 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200490
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530491 if (pVBInfo->LCDResInfo < Panel1024x768) {
492 if (resinfo > 0x07)
493 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530495 if (resinfo == 0x04)
496 return 0; /* 512x384 */
497 }
498 }
499 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200500
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800501 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
502 tempbx; (*i)--) {
503 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
504 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530505 if (infoflag & tempax)
506 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530508 if ((*i) == 0)
509 break;
510 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530512 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800513 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
514 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530515 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
516 != tempbx) {
517 return 0;
518 }
519
520 if (infoflag & tempax)
521 return 1;
522 }
523 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200524}
525
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200526static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530527 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200528{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530529 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200530
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800531 /* di+0x00 */
532 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530533 sync &= 0xC0;
534 temp = 0x2F;
535 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200536 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200537}
538
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200539static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530540 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200541{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530542 unsigned char data, data1, pushax;
543 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200544
Aaro Koskinen8104e322011-03-13 12:26:22 +0200545 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
546 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200547 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200548
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800549 /* unlock cr0-7 */
550 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530551 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200552 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530554 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200555 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200556
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530557 for (i = 0x01; i <= 0x04; i++) {
558 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200559 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530560 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530562 for (i = 0x05; i <= 0x06; i++) {
563 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200564 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530565 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566
Aaro Koskinen58839b02011-03-13 12:26:23 +0200567 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530568 j &= 0x1F;
569 data = pVBInfo->TimingH[0].data[7];
570 data &= 0xE0;
571 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200572 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200573
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530574 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200575 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530576 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200577 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200578 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530579 data1 = data;
580 data1 &= 0xE0;
581 data &= 0x1F;
582 if (data == 0) {
583 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200584 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530585 0x0c);
586 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200587 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530588 data = pushax;
589 }
590 data = data - 1;
591 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200592 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200593 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530594 data = data >> 5;
595 data = data + 3;
596 if (data > 7)
597 data = data - 7;
598 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200599 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530600 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200601}
602
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800603static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
604 unsigned short ModeNo,
605 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530607 unsigned char data;
608 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200609
Aaro Koskinen8104e322011-03-13 12:26:22 +0200610 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
611 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200612 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200613
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530614 for (i = 0x00; i <= 0x01; i++) {
615 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200616 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530617 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200618
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530619 for (i = 0x02; i <= 0x03; i++) {
620 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200621 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530622 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200623
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530624 for (i = 0x04; i <= 0x05; i++) {
625 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200626 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530627 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200628
Aaro Koskinen58839b02011-03-13 12:26:23 +0200629 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530630 j &= 0xC0;
631 data = pVBInfo->TimingV[0].data[6];
632 data &= 0x3F;
633 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200634 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530636 data = pVBInfo->TimingV[0].data[6];
637 data &= 0x80;
638 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200639
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530640 if (ModeNo <= 0x13)
641 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
642 else
643 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530645 i &= DoubleScanMode;
646 if (i)
647 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200648
Aaro Koskinen58839b02011-03-13 12:26:23 +0200649 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530650 j &= 0x5F;
651 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200652 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200653}
654
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200655static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
656 unsigned short RefreshRateTableIndex,
657 struct vb_device_info *pVBInfo,
658 struct xgi_hw_device_info *HwDeviceExtension)
659{
660 unsigned char index, data;
661 unsigned short i;
662
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800663 /* Get index */
664 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200665 index = index & IndexMask;
666
Aaro Koskinen58839b02011-03-13 12:26:23 +0200667 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200668 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200669 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200670
671 for (i = 0; i < 8; i++)
672 pVBInfo->TimingH[0].data[i]
673 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
674
675 for (i = 0; i < 7; i++)
676 pVBInfo->TimingV[0].data[i]
677 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
678
679 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
680
681 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
682
683 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200684 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200685}
686
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200687/* --------------------------------------------------------------------- */
688/* Function : XGI_SetXG21CRTC */
689/* Input : Stand or enhance CRTC table */
690/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
691/* Description : Set LCD timing */
692/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200693static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530694 unsigned short RefreshRateTableIndex,
695 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200696{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530697 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
698 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530700 if (ModeNo <= 0x13) {
701 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800702 /* CR04 HRS */
703 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
704 /* SR2E [7:0]->HRS */
705 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
706 /* Tempbx: CR05 HRE */
707 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530708 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
709 Tempcx = Tempax;
710 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
711 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
712 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
713 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
714 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800715 /* SR2F [7:2]->HRE */
716 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200717 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200718
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800719 /* Tempax: CR16 VRS */
720 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530721 Tempbx = Tempax; /* Tempbx=Tempax */
722 Tempax &= 0x01; /* Tempax: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200723 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800724
725 /* Tempax: CR7 VRS */
726 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530727 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
728 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
729 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
730 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800731 /* SR34[7:0]: VRS[8:1] */
732 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200733
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800734 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
735 Temp1 = Tempcx << 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530736 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
737 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
738 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
739 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200740
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800741 /* CR16 VRE */
742 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530743 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
744 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
745 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
746 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
747 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
748 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
749 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
750 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
751 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
752 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
753 Temp1 >>= 9; /* [10:9]->[1:0] */
754 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
755 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
756 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800757 /* SR3F D[7:2]->VRE D[1:0]->VRS */
758 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530759 } else {
760 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800761 /* Tempax: CR4 HRS */
762 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530763 Tempcx = Tempax; /* Tempcx: HRS */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800764 /* SR2E[7:0]->HRS */
765 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530767 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
768 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
769 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
770 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
771 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530773 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
774 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530776 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
777 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
778 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
779 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530781 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
782 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530784 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
785 if (Tempax < Tempcx) /* HRE < HRS */
786 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530788 Temp2 &= 0xFF;
789 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
790 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
791 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
792 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800793 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
794 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200795 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200796
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800797 /* CR10 VRS */
798 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530799 Tempbx = Tempax; /* Tempbx: VRS */
800 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200801 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800802 /* CR7[2][7] VRE */
803 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530804 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
805 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
806 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
807 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200808 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530810 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
811 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
812 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
813 Tempax &= 0x80;
814 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
815 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800816 /* Tempax: SRA */
817 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530818 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
819 Temp2 = Tempax;
820 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
821 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800823 /* Tempax: CR11 VRE */
824 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530825 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800826 /* Tempbx: SRA */
827 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530828 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
829 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
830 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
831 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
832 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530834 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
835 if (Tempax < Temp3) /* VRE < VRS */
836 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530838 Temp2 &= 0xFF;
839 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
840 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
841 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
842 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
843 Tempbx = (unsigned char) Temp1;
844 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
845 Tempax &= 0x7F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800846 /* SR3F D[7:2]->VRE D[1:0]->VRS */
847 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530848 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200849}
850
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800851static void XGI_SetXG27CRTC(unsigned short ModeNo,
852 unsigned short ModeIdIndex,
853 unsigned short RefreshRateTableIndex,
854 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200855{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400856 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530858 if (ModeNo <= 0x13) {
859 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800860 /* CR04 HRS */
861 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
862 /* SR2E [7:0]->HRS */
863 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
864 /* Tempbx: CR05 HRE */
865 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530866 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
867 Tempcx = Tempax;
868 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
869 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
870 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
871 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
872 Tempdx <<= 2; /* Tempdx << 2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800873 /* SR2F [7:2]->HRE */
874 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200875 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200876
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800877 /* Tempax: CR10 VRS */
878 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200879 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530880 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800881 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
882 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530883 Tempbx = Tempax; /* Tempbx=CR07 */
884 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
885 Tempax >>= 2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800886 /* SR35 D[0]->VRS D[8] */
887 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530888 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
889 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200890
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800891 /* CR11 VRE */
892 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530893 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
894 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
895 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
896 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
897 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
898 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800899 /* Tempax[7:0]: VRE[7:0] */
900 Tempax = (unsigned char) Tempbx & 0xFF;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
902 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800903 /* SR3F D[7:2]->VRE D[5:0] */
904 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
905 /* SR35 D[2:1]->VRS[10:9] */
906 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530907 } else {
908 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800909 /* Tempax: CR4 HRS */
910 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530911 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800912 /* SR2E[7:0]->HRS */
913 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200914
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800915 /* SR0B */
916 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530917 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
918 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530920 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
921 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
922 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530924 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
925 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
926 Tempax <<= 3; /* Tempax[5]: HRE[5] */
927 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200928
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530929 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
930 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200931
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800932 /* Tempax: CR4 HRS */
933 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530934 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
935 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
936 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200937
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530938 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
939 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
940 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
941 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800942 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
943 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200944 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200945
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800946 /* CR10 VRS */
947 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
948 /* SR34[7:0]->VRS[7:0] */
949 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530951 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800952 /* CR7[7][2] VRS[9][8] */
953 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530954 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
955 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
956 Tempax >>= 2; /* Tempax[0]: VRS[8] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800957 /* SR35[0]: VRS[8] */
958 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530959 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
960 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800961 /* Tempax: SR0A */
962 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530963 Tempax &= 0x08; /* SR0A[3] VRS[10] */
964 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200965
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800966 /* Tempax: CR11 VRE */
967 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530968 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800969 /* Tempbx: SR0A */
970 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530971 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
972 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
973 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
974 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
975 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
976 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530978 if (Tempbx <= Tempcx) /* VRE <= VRS */
979 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200980
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800981 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
982 Tempax = (Tempbx << 2) & 0xFF;
983 /* SR3F[7:2]:VRE[5:0] */
984 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530985 Tempax = Tempcx >> 8;
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800986 /* SR35[2:0]:VRS[10:8] */
987 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530988 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200989}
990
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300991static void xgifb_set_lcd(int chip_id,
992 struct vb_device_info *pVBInfo,
993 unsigned short RefreshRateTableIndex,
994 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200995{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400996 unsigned short Data, Temp, b3CC;
997 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530999 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001000
Aaro Koskinen8104e322011-03-13 12:26:22 +02001001 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1002 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1003 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1004 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001005
1006 if (chip_id == XG27) {
1007 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1008 if ((Temp & 0x03) == 0) { /* dual 12 */
1009 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
1010 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
1011 }
1012 }
1013
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301014 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001015 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1016 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1017 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1018 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301019 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001020
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001021 if (chip_id == XG27) {
1022 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301023 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +03001024 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1025 if (Temp & 0x01) {
1026 /* 18 bits FP */
1027 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
1028 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
1029 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301030 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001031
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001032 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001033
Aaro Koskinendc505562011-03-13 12:26:26 +02001034 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1035 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301037 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001038 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301039 if (b3CC & 0x40)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001040 /* Hsync polarity */
1041 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301042 if (b3CC & 0x80)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001043 /* Vsync polarity */
1044 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301045 } else {
1046 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1047 if (Data & 0x4000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001048 /* Hsync polarity */
1049 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301050 if (Data & 0x8000)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001051 /* Vsync polarity */
1052 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301053 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001054}
1055
1056/* --------------------------------------------------------------------- */
1057/* Function : XGI_UpdateXG21CRTC */
1058/* Input : */
1059/* Output : CRT1 CRTC */
1060/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1061/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001062static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1063 struct vb_device_info *pVBInfo,
1064 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001065{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301066 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001067
Aaro Koskinendc505562011-03-13 12:26:26 +02001068 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301069 if (ModeNo <= 0x13) {
1070 for (i = 0; i < 12; i++) {
1071 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1072 index = i;
1073 }
1074 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001075 if (ModeNo == 0x2E &&
1076 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1077 RES640x480x60))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301078 index = 12;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001079 else if (ModeNo == 0x2E &&
1080 (pVBInfo->RefIndex[RefreshRateTableIndex].
1081 Ext_CRT1CRTC == RES640x480x72))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301082 index = 13;
1083 else if (ModeNo == 0x2F)
1084 index = 14;
1085 else if (ModeNo == 0x50)
1086 index = 15;
1087 else if (ModeNo == 0x59)
1088 index = 16;
1089 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301091 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001092 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301093 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001094 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301095 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001096 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301097 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001098 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301099 pVBInfo->UpdateCRT1[index].CR16);
1100 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001101}
1102
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001103static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301104 unsigned short ModeNo, unsigned short ModeIdIndex,
1105 unsigned short RefreshRateTableIndex,
1106 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001108 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301110 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301112 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301114 if (ModeNo <= 0x13) {
1115 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1116 tempax = pVBInfo->StResInfo[resindex].HTotal;
1117 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1118 } else {
1119 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1120 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1121 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1122 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001123
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301124 if (modeflag & HalfDCLK)
1125 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301127 if (ModeNo > 0x13) {
1128 if (modeflag & HalfDCLK)
1129 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301131 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001132
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301133 if (temp & InterlaceMode)
1134 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301136 if (modeflag & DoubleScanMode)
1137 tempbx = tempbx << 1;
1138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301140 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301142 /* if (!(modeflag & Charx8Dot)) */
1143 /* tempcx = 9; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301145 tempax /= tempcx;
1146 tempax -= 1;
1147 tempbx -= 1;
1148 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001149 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1150 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301151 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001152 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1153 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001154 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301155 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001156 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301157 tempax = 0;
1158 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301160 if (tempbx & 0x01)
1161 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001162
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301163 if (tempbx & 0x02)
1164 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001165
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001166 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001167 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301168 data &= 0xFF;
1169 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 if (tempbx & 0x04)
1172 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001173
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001174 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001175 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001176}
1177
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001178unsigned short XGI_GetResInfo(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301179 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001180{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001181 unsigned short resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301183 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001184 /* si+St_ResInfo */
1185 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301186 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001187 /* si+Ext_ResInfo */
1188 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301189 return resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001190}
1191
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001192static void XGI_SetCRT1Offset(unsigned short ModeNo,
1193 unsigned short ModeIdIndex,
1194 unsigned short RefreshRateTableIndex,
1195 struct xgi_hw_device_info *HwDeviceExtension,
1196 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001197{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301198 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301200 /* GetOffset */
1201 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1202 temp = temp >> 8;
1203 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001204
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301205 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1206 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301208 if (temp2)
1209 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301211 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001212
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301213 switch (temp2) {
1214 case 0:
1215 temp2 = 1;
1216 break;
1217 case 1:
1218 temp2 = 2;
1219 break;
1220 case 2:
1221 temp2 = 4;
1222 break;
1223 case 3:
1224 temp2 = 4;
1225 break;
1226 case 4:
1227 temp2 = 6;
1228 break;
1229 case 5:
1230 temp2 = 8;
1231 break;
1232 default:
1233 break;
1234 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301236 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1237 temp = temp * temp2 + temp2 / 2;
1238 else
1239 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301241 /* SetOffset */
1242 DisplayUnit = temp;
1243 temp2 = temp;
1244 temp = temp >> 8; /* ah */
1245 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001246 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301247 i &= 0xF0;
1248 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001249 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001250
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301251 temp = (unsigned char) temp2;
1252 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001253 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001254
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301255 /* SetDisplayUnit */
1256 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1257 temp2 &= InterlaceMode;
1258 if (temp2)
1259 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001260
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301261 DisplayUnit = DisplayUnit << 5;
1262 ah = (DisplayUnit & 0xff00) >> 8;
1263 al = DisplayUnit & 0x00ff;
1264 if (al == 0)
1265 ah += 1;
1266 else
1267 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301269 if (HwDeviceExtension->jChipType >= XG20)
1270 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1271 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001272
Aaro Koskinen8104e322011-03-13 12:26:22 +02001273 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001274}
1275
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001276static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1277 unsigned short ModeIdIndex,
1278 unsigned short RefreshRateTableIndex,
1279 struct xgi_hw_device_info *HwDeviceExtension,
1280 struct vb_device_info *pVBInfo)
1281{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001282 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2,
1283 VCLK65 + 2,
1284 VCLK65 + 2,
1285 VCLK65 + 2 };
1286 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5,
1287 VCLK108_2 + 5,
1288 VCLK108_2 + 5,
1289 VCLK108_2 + 5 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001290 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001291 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2,
1292 VCLK65 + 2,
1293 VCLK65 + 2,
1294 VCLK65 + 2 };
1295 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2,
1296 VCLK65 + 2,
1297 VCLK65 + 2,
1298 VCLK65 + 2 };
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001299
1300 unsigned short CRT2Index, VCLKIndex;
1301 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001302
1303 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001304 /* si+St_ResInfo */
1305 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001306 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1307 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1308 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001309 /* si+Ext_ResInfo */
1310 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001311 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001312 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1313 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001314 }
1315
1316 if (pVBInfo->IF_DEF_LVDS == 0) {
1317 CRT2Index = CRT2Index >> 6; /* for LCD */
1318 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1319 if (pVBInfo->LCDResInfo != Panel1024x768)
1320 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1321 else
1322 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1323 } else { /* for TV */
1324 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1325 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1326 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1327 VCLKIndex = HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001328 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001329 } else {
1330 VCLKIndex = HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001331 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001332 }
1333
1334 if (pVBInfo->SetFlag & TVSimuMode) {
1335 if (modeflag & Charx8Dot) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001336 VCLKIndex =
1337 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001338 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001339 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001340 VCLKIndex =
1341 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001342 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001343 }
1344 }
1345
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001346 /* 301lv */
1347 if (pVBInfo->VBType & VB_XGI301LV) {
1348 if (!(pVBInfo->VBExtInfo ==
1349 VB_YPbPr1080i)) {
1350 VCLKIndex =
1351 YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001352 if (!(pVBInfo->VBExtInfo
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001353 ==
1354 VB_YPbPr750p)) {
1355 VCLKIndex =
1356 YPbPr525pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001357 if (!(pVBInfo->VBExtInfo
1358 == VB_YPbPr525p)) {
1359 VCLKIndex
1360 = YPbPr525iVCLK_2;
1361 if (!(pVBInfo->SetFlag
1362 & RPLLDIV2XO))
1363 VCLKIndex
1364 = YPbPr525iVCLK;
1365 }
1366 }
1367 }
1368 }
1369 } else {
1370 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001371 if (pVBInfo->SetFlag &
1372 RPLLDIV2XO) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001373 VCLKIndex = TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001374 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001375 } else {
1376 VCLKIndex = TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001377 VCLKIndex += 25;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001378 }
1379 }
1380 }
1381 } else { /* for CRT2 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001382 /* Port 3cch */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001383 VCLKIndex = (unsigned char) inb(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001384 (pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001385 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1386 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001387 /* di+Ext_CRTVCLK */
1388 VCLKIndex =
1389 pVBInfo->RefIndex[
1390 RefreshRateTableIndex].
1391 Ext_CRTVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001392 VCLKIndex &= IndexMask;
1393 }
1394 }
1395 }
1396 } else { /* LVDS */
1397 if (ModeNo <= 0x13)
1398 VCLKIndex = CRT2Index;
1399 else
1400 VCLKIndex = CRT2Index;
1401
Aaro Koskinen4c14bfd2011-08-31 21:45:57 +03001402 VCLKIndex = VCLKIndex >> 6;
1403 if ((pVBInfo->LCDResInfo == Panel800x600) ||
1404 (pVBInfo->LCDResInfo == Panel320x480))
1405 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
1406 else if ((pVBInfo->LCDResInfo == Panel1024x768) ||
1407 (pVBInfo->LCDResInfo == Panel1024x768x75))
1408 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1409 else
1410 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001411 }
1412 /* VCLKIndex = VCLKIndex&IndexMask; */
1413
1414 return VCLKIndex;
1415}
1416
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001417static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1418 unsigned short ModeIdIndex,
1419 struct xgi_hw_device_info *HwDeviceExtension,
1420 unsigned short RefreshRateTableIndex,
1421 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001422{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001423 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301424 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301426 if (pVBInfo->IF_DEF_LVDS == 1) {
1427 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001428 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001429 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1430 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301431 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001432 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301433 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001434 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301435 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1436 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1437 & SetCRT2ToLCDA)) {
1438 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1439 RefreshRateTableIndex, HwDeviceExtension,
1440 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001441 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001442 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301443 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001444 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301445 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001446 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1447 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301448 } else {
1449 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001450 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001451 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1452 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301453 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001454 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301455 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001456 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301457 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001458
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301459 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001460 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1461 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001462 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001463 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001464 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301465 index = data;
1466 index &= 0xE0;
1467 data &= 0x1F;
1468 data = data << 1;
1469 data += 1;
1470 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001471 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301472 }
1473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001474}
1475
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001476static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301477 struct xgi_hw_device_info *HwDeviceExtension,
1478 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001479{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301480 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001481
Aaro Koskinen58839b02011-03-13 12:26:23 +02001482 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301483 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001484 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301486 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001487 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001488 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301489 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001490 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001491 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301492 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001493 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301494 } else {
1495 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001496 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001497 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301498 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001499 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301500 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001501 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001502 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301503 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001504 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301505 }
1506 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301508 if (HwDeviceExtension->jChipType == XG21)
1509 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001510}
1511
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001512static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1513 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1514 struct vb_device_info *pVBInfo)
1515{
1516 unsigned short data, data2 = 0;
1517 short VCLK;
1518
1519 unsigned char index;
1520
1521 if (ModeNo <= 0x13)
1522 VCLK = 0;
1523 else {
1524 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1525 index &= IndexMask;
1526 VCLK = pVBInfo->VCLKData[index].CLOCK;
1527 }
1528
Aaro Koskinen58839b02011-03-13 12:26:23 +02001529 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001530 data &= 0xf3;
1531 if (VCLK >= 200)
1532 data |= 0x0c; /* VCLK > 200 */
1533
1534 if (HwDeviceExtension->jChipType >= XG20)
1535 data &= ~0x04; /* 2 pixel mode */
1536
Aaro Koskinen8104e322011-03-13 12:26:22 +02001537 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001538
1539 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001540 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001541 data &= 0xE7;
1542 if (VCLK < 200)
1543 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001544 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001545 }
1546
1547 /* Jong for Adavantech LCD ripple issue
1548 if ((VCLK >= 0) && (VCLK < 135))
1549 data2 = 0x03;
1550 else if ((VCLK >= 135) && (VCLK < 160))
1551 data2 = 0x02;
1552 else if ((VCLK >= 160) && (VCLK < 260))
1553 data2 = 0x01;
1554 else if (VCLK > 260)
1555 data2 = 0x00;
1556 */
1557 data2 = 0x00;
1558
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001559 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001560 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001561 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001562
1563}
1564
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001565static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301566 unsigned short ModeNo, unsigned short ModeIdIndex,
1567 unsigned short RefreshRateTableIndex,
1568 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001569{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301570 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1571 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001572
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301573 if (ModeNo > 0x13) {
1574 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001575 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1576 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301577 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001578 /* si+St_ModeFlag */
1579 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001580
Aaro Koskinen58839b02011-03-13 12:26:23 +02001581 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001582 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001583
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301584 if (ModeNo > 0x13)
1585 data = infoflag;
1586 else
1587 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301589 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301591 if (ModeNo > 0x13) {
1592 if (pVBInfo->ModeType > 0x02) {
1593 data2 |= 0x02;
1594 data3 = pVBInfo->ModeType - ModeVGA;
1595 data3 = data3 << 2;
1596 data2 |= data3;
1597 }
1598 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301600 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301602 if (data)
1603 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001604
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001605 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001606 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301607 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1608 if (ModeNo <= 0x13)
1609 xres = pVBInfo->StResInfo[resindex].HTotal;
1610 else
1611 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301613 data = 0x0000;
1614 if (infoflag & InterlaceMode) {
1615 if (xres == 1024)
1616 data = 0x0035;
1617 else if (xres == 1280)
1618 data = 0x0048;
1619 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001620
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301621 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001622 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301623 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001624 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301626 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001627 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301629 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001630
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301631 if (modeflag & LineCompareOff)
1632 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301634 if (ModeNo > 0x13) {
1635 if (pVBInfo->ModeType == ModeEGA)
1636 data2 |= 0x40;
1637 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001638
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001639 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301640 data = 0x60;
1641 if (pVBInfo->ModeType != ModeText) {
1642 data = data ^ 0x60;
1643 if (pVBInfo->ModeType != ModeEGA)
1644 data = data ^ 0xA0;
1645 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001646 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301648 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1649 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301651 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1652 /* if (XGINew_IF_DEF_NEW_LOWRES) */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001653 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex);
1654 * //030305 fix lowresolution bug */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001655
Aaro Koskinen58839b02011-03-13 12:26:23 +02001656 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301658 if (HwDeviceExtension->jChipType == XG27) {
1659 if (data & 0x40)
1660 data = 0x2c;
1661 else
1662 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001663 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001664 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301665 } else if (HwDeviceExtension->jChipType >= XG20) {
1666 if (data & 0x40)
1667 data = 0x33;
1668 else
1669 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001670 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1671 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301672 } else {
1673 if (data & 0x40)
1674 data = 0x2c;
1675 else
1676 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001677 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301678 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001679
1680}
1681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301682/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001683void XGI_VesaLowResolution(unsigned short ModeNo,
1684 unsigned short ModeIdIndex,
1685 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001686{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301687 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301689 if (ModeNo > 0x13)
1690 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1691 else
1692 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301694 if (ModeNo > 0x13) {
1695 if (modeflag & DoubleScanMode) {
1696 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001697 if (pVBInfo->VBType & VB_XGI301B |
1698 VB_XGI302B |
1699 VB_XGI301LV |
1700 VB_XGI302LV |
1701 VB_XGI301C)) {
1702 if (!(pVBInfo->VBInfo &
1703 SetCRT2ToRAMDAC)) {
1704 if (pVBInfo->VBInfo &
1705 SetInSlaveMode) {
1706 xgifb_reg_and_or(
1707 pVBInfo->P3c4,
1708 0x01,
1709 0xf7,
1710 0x00);
1711 xgifb_reg_and_or(
1712 pVBInfo->P3c4,
1713 0x0f,
1714 0x7f,
1715 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301716 return;
1717 }
1718 }
1719 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001720 xgifb_reg_and_or(pVBInfo->P3c4,
1721 0x0f,
1722 0xff,
1723 0x80);
1724 xgifb_reg_and_or(pVBInfo->P3c4,
1725 0x01,
1726 0xf7,
1727 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301728 return;
1729 }
1730 }
1731 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001732 xgifb_reg_and_or(pVBInfo->P3c4, 0x0f, 0x7f, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001733}
1734*/
1735
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001736static void XGI_WriteDAC(unsigned short dl,
1737 unsigned short ah,
1738 unsigned short al,
1739 unsigned short dh,
1740 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001741{
1742 unsigned short temp, bh, bl;
1743
1744 bh = ah;
1745 bl = al;
1746
1747 if (dl != 0) {
1748 temp = bh;
1749 bh = dh;
1750 dh = temp;
1751 if (dl == 1) {
1752 temp = bl;
1753 bl = dh;
1754 dh = temp;
1755 } else {
1756 temp = bl;
1757 bl = bh;
1758 bh = temp;
1759 }
1760 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001761 outb((unsigned short) dh, pVBInfo->P3c9);
1762 outb((unsigned short) bh, pVBInfo->P3c9);
1763 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001764}
1765
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001766static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301767 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001768{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301769 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
1770 ah, dh, *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301772 if (ModeNo <= 0x13)
1773 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1774 else
1775 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301777 data &= DACInfoFlag;
1778 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301780 if (data == 0x00)
1781 table = XGINew_MDA_DAC;
1782 else if (data == 0x08)
1783 table = XGINew_CGA_DAC;
1784 else if (data == 0x10)
1785 table = XGINew_EGA_DAC;
1786 else if (data == 0x18) {
1787 time = 256;
1788 table = XGINew_VGA_DAC;
1789 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301791 if (time == 256)
1792 j = 16;
1793 else
1794 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001795
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001796 outb(0xFF, pVBInfo->P3c6);
1797 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301799 for (i = 0; i < j; i++) {
1800 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301802 for (k = 0; k < 3; k++) {
1803 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301805 if (data & 0x01)
1806 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301808 if (data & 0x02)
1809 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001810
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001811 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301812 data = data >> 2;
1813 }
1814 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301816 if (time == 256) {
1817 for (i = 16; i < 32; i++) {
1818 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301820 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001821 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301822 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301824 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301826 for (m = 0; m < 9; m++) {
1827 di = si;
1828 bx = si + 0x04;
1829 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301831 for (n = 0; n < 3; n++) {
1832 for (o = 0; o < 5; o++) {
1833 dh = table[si];
1834 ah = table[di];
1835 al = table[bx];
1836 si++;
1837 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1838 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001839
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301840 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301842 for (o = 0; o < 3; o++) {
1843 dh = table[bx];
1844 ah = table[di];
1845 al = table[si];
1846 si--;
1847 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1848 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301850 dl++;
1851 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301853 si += 5;
1854 }
1855 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001856}
1857
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001858static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1859 unsigned short ModeIdIndex,
1860 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001861{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301862 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301864 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001865 /* si+St_ResInfo */
1866 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301867 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001868 /* si+Ext_ResInfo */
1869 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301871 /* if (ModeNo > 0x13) */
1872 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1873 /* else */
1874 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301876 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001877 /* si+St_ResInfo */
1878 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301879 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001880 /* si+Ext_ResInfo */
1881 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301883 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301885 if (ModeNo <= 0x13) {
1886 xres = pVBInfo->StResInfo[resindex].HTotal;
1887 yres = pVBInfo->StResInfo[resindex].VTotal;
1888 } else {
1889 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1890 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1891 }
1892 if (ModeNo > 0x13) {
1893 if (modeflag & HalfDCLK)
1894 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001895
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301896 if (modeflag & DoubleScanMode)
1897 yres = yres << 1;
1898 }
1899 /* if (modeflag & Charx8Dot) */
1900 /* { */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301902 if (xres == 720)
1903 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301905 /* } */
1906 pVBInfo->VGAHDE = xres;
1907 pVBInfo->HDE = xres;
1908 pVBInfo->VGAVDE = yres;
1909 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001910}
1911
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001912static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1913 unsigned short ModeIdIndex,
1914 unsigned short RefreshRateTableIndex,
1915 struct vb_device_info *pVBInfo)
1916{
1917 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1918
1919 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1920
1921 tempbx = BX;
1922
1923 if (ModeNo <= 0x13) {
1924 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1925 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1926 } else {
1927 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1928 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1929 }
1930
1931 tempal = tempal & 0x0f;
1932
1933 if (tempbx <= 1) { /* ExpLink */
1934 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001935 /* find no Ext_CRT2CRTC2 */
1936 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001937 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001938 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1939 Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001940 }
1941
1942 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
1943 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001944 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1945 St_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001946 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001947 tempal = pVBInfo->RefIndex[
1948 RefreshRateTableIndex].
1949 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001950 }
1951
1952 if (tempbx & 0x01)
1953 tempal = (tempal >> 4);
1954
1955 tempal = (tempal & 0x0f);
1956 }
1957
1958 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
1959
1960 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1961 if ((tempbx == 5) || (tempbx) == 7)
1962 tempcx = LCDDesDataLen2;
1963 else if ((tempbx == 3) || (tempbx == 8))
1964 tempcx = LVDSDesDataLen2;
1965 }
1966 /* mov di, word ptr cs:LCDDataList[bx] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001967 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] |
1968 (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001969
1970 switch (tempbx) {
1971 case 0:
1972 tempdi = XGI_EPLLCDCRT1Ptr_H;
1973 break;
1974 case 1:
1975 tempdi = XGI_EPLLCDCRT1Ptr_V;
1976 break;
1977 case 2:
1978 tempdi = XGI_EPLLCDDataPtr;
1979 break;
1980 case 3:
1981 tempdi = XGI_EPLLCDDesDataPtr;
1982 break;
1983 case 4:
1984 tempdi = XGI_LCDDataTable;
1985 break;
1986 case 5:
1987 tempdi = XGI_LCDDesDataTable;
1988 break;
1989 case 6:
1990 tempdi = XGI_EPLCHLCDRegPtr;
1991 break;
1992 case 7:
1993 case 8:
1994 case 9:
1995 tempdi = NULL;
1996 break;
1997 default:
1998 break;
1999 }
2000
2001 if (tempdi == NULL) /* OEMUtil */
2002 return NULL;
2003
2004 table = tempbx;
2005 i = 0;
2006
2007 while (tempdi[i].PANELID != 0xff) {
2008 tempdx = pVBInfo->LCDResInfo;
2009 if (tempbx & 0x0080) { /* OEMUtil */
2010 tempbx &= (~0x0080);
2011 tempdx = pVBInfo->LCDTypeInfo;
2012 }
2013
2014 if (pVBInfo->LCDInfo & EnableScalingLCD)
2015 tempdx &= (~PanelResInfo);
2016
2017 if (tempdi[i].PANELID == tempdx) {
2018 tempbx = tempdi[i].MASK;
2019 tempdx = pVBInfo->LCDInfo;
2020
2021 if (ModeNo <= 0x13) /* alan 09/10/2003 */
2022 tempdx |= SetLCDStdMode;
2023
2024 if (modeflag & HalfDCLK)
2025 tempdx |= SetLCDLowResolution;
2026
2027 tempbx &= tempdx;
2028 if (tempbx == tempdi[i].CAP)
2029 break;
2030 }
2031 i++;
2032 }
2033
2034 if (table == 0) {
2035 switch (tempdi[i].DATAPTR) {
2036 case 0:
2037 return &XGI_LVDSCRT11024x768_1_H[tempal];
2038 break;
2039 case 1:
2040 return &XGI_LVDSCRT11024x768_2_H[tempal];
2041 break;
2042 case 2:
2043 return &XGI_LVDSCRT11280x1024_1_H[tempal];
2044 break;
2045 case 3:
2046 return &XGI_LVDSCRT11280x1024_2_H[tempal];
2047 break;
2048 case 4:
2049 return &XGI_LVDSCRT11400x1050_1_H[tempal];
2050 break;
2051 case 5:
2052 return &XGI_LVDSCRT11400x1050_2_H[tempal];
2053 break;
2054 case 6:
2055 return &XGI_LVDSCRT11600x1200_1_H[tempal];
2056 break;
2057 case 7:
2058 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
2059 break;
2060 case 8:
2061 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
2062 break;
2063 case 9:
2064 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
2065 break;
2066 case 10:
2067 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
2068 break;
2069 default:
2070 break;
2071 }
2072 } else if (table == 1) {
2073 switch (tempdi[i].DATAPTR) {
2074 case 0:
2075 return &XGI_LVDSCRT11024x768_1_V[tempal];
2076 break;
2077 case 1:
2078 return &XGI_LVDSCRT11024x768_2_V[tempal];
2079 break;
2080 case 2:
2081 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2082 break;
2083 case 3:
2084 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2085 break;
2086 case 4:
2087 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2088 break;
2089 case 5:
2090 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2091 break;
2092 case 6:
2093 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2094 break;
2095 case 7:
2096 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2097 break;
2098 case 8:
2099 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2100 break;
2101 case 9:
2102 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2103 break;
2104 case 10:
2105 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2106 break;
2107 default:
2108 break;
2109 }
2110 } else if (table == 2) {
2111 switch (tempdi[i].DATAPTR) {
2112 case 0:
2113 return &XGI_LVDS1024x768Data_1[tempal];
2114 break;
2115 case 1:
2116 return &XGI_LVDS1024x768Data_2[tempal];
2117 break;
2118 case 2:
2119 return &XGI_LVDS1280x1024Data_1[tempal];
2120 break;
2121 case 3:
2122 return &XGI_LVDS1280x1024Data_2[tempal];
2123 break;
2124 case 4:
2125 return &XGI_LVDS1400x1050Data_1[tempal];
2126 break;
2127 case 5:
2128 return &XGI_LVDS1400x1050Data_2[tempal];
2129 break;
2130 case 6:
2131 return &XGI_LVDS1600x1200Data_1[tempal];
2132 break;
2133 case 7:
2134 return &XGI_LVDSNoScalingData[tempal];
2135 break;
2136 case 8:
2137 return &XGI_LVDS1024x768Data_1x75[tempal];
2138 break;
2139 case 9:
2140 return &XGI_LVDS1024x768Data_2x75[tempal];
2141 break;
2142 case 10:
2143 return &XGI_LVDS1280x1024Data_1x75[tempal];
2144 break;
2145 case 11:
2146 return &XGI_LVDS1280x1024Data_2x75[tempal];
2147 break;
2148 case 12:
2149 return &XGI_LVDSNoScalingDatax75[tempal];
2150 break;
2151 default:
2152 break;
2153 }
2154 } else if (table == 3) {
2155 switch (tempdi[i].DATAPTR) {
2156 case 0:
2157 return &XGI_LVDS1024x768Des_1[tempal];
2158 break;
2159 case 1:
2160 return &XGI_LVDS1024x768Des_3[tempal];
2161 break;
2162 case 2:
2163 return &XGI_LVDS1024x768Des_2[tempal];
2164 break;
2165 case 3:
2166 return &XGI_LVDS1280x1024Des_1[tempal];
2167 break;
2168 case 4:
2169 return &XGI_LVDS1280x1024Des_2[tempal];
2170 break;
2171 case 5:
2172 return &XGI_LVDS1400x1050Des_1[tempal];
2173 break;
2174 case 6:
2175 return &XGI_LVDS1400x1050Des_2[tempal];
2176 break;
2177 case 7:
2178 return &XGI_LVDS1600x1200Des_1[tempal];
2179 break;
2180 case 8:
2181 return &XGI_LVDSNoScalingDesData[tempal];
2182 break;
2183 case 9:
2184 return &XGI_LVDS1024x768Des_1x75[tempal];
2185 break;
2186 case 10:
2187 return &XGI_LVDS1024x768Des_3x75[tempal];
2188 break;
2189 case 11:
2190 return &XGI_LVDS1024x768Des_2x75[tempal];
2191 break;
2192 case 12:
2193 return &XGI_LVDS1280x1024Des_1x75[tempal];
2194 break;
2195 case 13:
2196 return &XGI_LVDS1280x1024Des_2x75[tempal];
2197 break;
2198 case 14:
2199 return &XGI_LVDSNoScalingDesDatax75[tempal];
2200 break;
2201 default:
2202 break;
2203 }
2204 } else if (table == 4) {
2205 switch (tempdi[i].DATAPTR) {
2206 case 0:
2207 return &XGI_ExtLCD1024x768Data[tempal];
2208 break;
2209 case 1:
2210 return &XGI_StLCD1024x768Data[tempal];
2211 break;
2212 case 2:
2213 return &XGI_CetLCD1024x768Data[tempal];
2214 break;
2215 case 3:
2216 return &XGI_ExtLCD1280x1024Data[tempal];
2217 break;
2218 case 4:
2219 return &XGI_StLCD1280x1024Data[tempal];
2220 break;
2221 case 5:
2222 return &XGI_CetLCD1280x1024Data[tempal];
2223 break;
2224 case 6:
2225 return &XGI_ExtLCD1400x1050Data[tempal];
2226 break;
2227 case 7:
2228 return &XGI_StLCD1400x1050Data[tempal];
2229 break;
2230 case 8:
2231 return &XGI_CetLCD1400x1050Data[tempal];
2232 break;
2233 case 9:
2234 return &XGI_ExtLCD1600x1200Data[tempal];
2235 break;
2236 case 10:
2237 return &XGI_StLCD1600x1200Data[tempal];
2238 break;
2239 case 11:
2240 return &XGI_NoScalingData[tempal];
2241 break;
2242 case 12:
2243 return &XGI_ExtLCD1024x768x75Data[tempal];
2244 break;
2245 case 13:
2246 return &XGI_ExtLCD1024x768x75Data[tempal];
2247 break;
2248 case 14:
2249 return &XGI_CetLCD1024x768x75Data[tempal];
2250 break;
2251 case 15:
2252 return &XGI_ExtLCD1280x1024x75Data[tempal];
2253 break;
2254 case 16:
2255 return &XGI_StLCD1280x1024x75Data[tempal];
2256 break;
2257 case 17:
2258 return &XGI_CetLCD1280x1024x75Data[tempal];
2259 break;
2260 case 18:
2261 return &XGI_NoScalingDatax75[tempal];
2262 break;
2263 default:
2264 break;
2265 }
2266 } else if (table == 5) {
2267 switch (tempdi[i].DATAPTR) {
2268 case 0:
2269 return &XGI_ExtLCDDes1024x768Data[tempal];
2270 break;
2271 case 1:
2272 return &XGI_StLCDDes1024x768Data[tempal];
2273 break;
2274 case 2:
2275 return &XGI_CetLCDDes1024x768Data[tempal];
2276 break;
2277 case 3:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002278 if ((pVBInfo->VBType & VB_XGI301LV) ||
2279 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002280 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2281 else
2282 return &XGI_ExtLCDDes1280x1024Data[tempal];
2283 break;
2284 case 4:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002285 if ((pVBInfo->VBType & VB_XGI301LV) ||
2286 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002287 return &XGI_StLCDDLDes1280x1024Data[tempal];
2288 else
2289 return &XGI_StLCDDes1280x1024Data[tempal];
2290 break;
2291 case 5:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002292 if ((pVBInfo->VBType & VB_XGI301LV) ||
2293 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002294 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2295 else
2296 return &XGI_CetLCDDes1280x1024Data[tempal];
2297 break;
2298 case 6:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002299 if ((pVBInfo->VBType & VB_XGI301LV) ||
2300 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002301 return &XGI_ExtLCDDLDes1400x1050Data[tempal];
2302 else
2303 return &XGI_ExtLCDDes1400x1050Data[tempal];
2304 break;
2305 case 7:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002306 if ((pVBInfo->VBType & VB_XGI301LV) ||
2307 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002308 return &XGI_StLCDDLDes1400x1050Data[tempal];
2309 else
2310 return &XGI_StLCDDes1400x1050Data[tempal];
2311 break;
2312 case 8:
2313 return &XGI_CetLCDDes1400x1050Data[tempal];
2314 break;
2315 case 9:
2316 return &XGI_CetLCDDes1400x1050Data2[tempal];
2317 break;
2318 case 10:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002319 if ((pVBInfo->VBType & VB_XGI301LV) ||
2320 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002321 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2322 else
2323 return &XGI_ExtLCDDes1600x1200Data[tempal];
2324 break;
2325 case 11:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002326 if ((pVBInfo->VBType & VB_XGI301LV) ||
2327 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002328 return &XGI_StLCDDLDes1600x1200Data[tempal];
2329 else
2330 return &XGI_StLCDDes1600x1200Data[tempal];
2331 break;
2332 case 12:
2333 return &XGI_NoScalingDesData[tempal];
2334 break;
2335 case 13:
2336 return &XGI_ExtLCDDes1024x768x75Data[tempal];
2337 break;
2338 case 14:
2339 return &XGI_StLCDDes1024x768x75Data[tempal];
2340 break;
2341 case 15:
2342 return &XGI_CetLCDDes1024x768x75Data[tempal];
2343 break;
2344 case 16:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002345 if ((pVBInfo->VBType & VB_XGI301LV) ||
2346 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002347 return &XGI_ExtLCDDLDes1280x1024x75Data[tempal];
2348 else
2349 return &XGI_ExtLCDDes1280x1024x75Data[tempal];
2350 break;
2351 case 17:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002352 if ((pVBInfo->VBType & VB_XGI301LV) ||
2353 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002354 return &XGI_StLCDDLDes1280x1024x75Data[tempal];
2355 else
2356 return &XGI_StLCDDes1280x1024x75Data[tempal];
2357 break;
2358 case 18:
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002359 if ((pVBInfo->VBType & VB_XGI301LV) ||
2360 (pVBInfo->VBType & VB_XGI302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002361 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2362 else
2363 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2364 break;
2365 case 19:
2366 return &XGI_NoScalingDesDatax75[tempal];
2367 break;
2368 default:
2369 break;
2370 }
2371 } else if (table == 6) {
2372 switch (tempdi[i].DATAPTR) {
2373 case 0:
2374 return &XGI_CH7017LV1024x768[tempal];
2375 break;
2376 case 1:
2377 return &XGI_CH7017LV1400x1050[tempal];
2378 break;
2379 default:
2380 break;
2381 }
2382 }
2383 return NULL;
2384}
2385
2386static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2387 unsigned short ModeIdIndex,
2388 unsigned short RefreshRateTableIndex,
2389 struct vb_device_info *pVBInfo)
2390{
2391 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2392 struct XGI330_TVDataTablStruct *tempdi = NULL;
2393
2394 tempbx = BX;
2395
2396 if (ModeNo <= 0x13) {
2397 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2398 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2399 } else {
2400 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2401 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2402 }
2403
2404 tempal = tempal & 0x3f;
2405 table = tempbx;
2406
2407 switch (tempbx) {
2408 case 0:
2409 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002410 break;
2411 case 1:
2412 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002413 break;
2414 case 2:
2415 tempdi = XGI_EPLCHTVDataPtr;
2416 break;
2417 case 3:
2418 tempdi = NULL;
2419 break;
2420 case 4:
2421 tempdi = XGI_TVDataTable;
2422 break;
2423 case 5:
2424 tempdi = NULL;
2425 break;
2426 case 6:
2427 tempdi = XGI_EPLCHTVRegPtr;
2428 break;
2429 default:
2430 break;
2431 }
2432
2433 if (tempdi == NULL) /* OEMUtil */
2434 return NULL;
2435
2436 tempdx = pVBInfo->TVInfo;
2437
2438 if (pVBInfo->VBInfo & SetInSlaveMode)
2439 tempdx = tempdx | SetTVLockMode;
2440
2441 if (modeflag & HalfDCLK)
2442 tempdx = tempdx | SetTVLowResolution;
2443
2444 i = 0;
2445
2446 while (tempdi[i].MASK != 0xffff) {
2447 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2448 break;
2449 i++;
2450 }
2451
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002452 /* 07/05/22 */
2453 if (table == 0x00) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002454 } else if (table == 0x01) {
2455 } else if (table == 0x04) {
2456 switch (tempdi[i].DATAPTR) {
2457 case 0:
2458 return &XGI_ExtPALData[tempal];
2459 break;
2460 case 1:
2461 return &XGI_ExtNTSCData[tempal];
2462 break;
2463 case 2:
2464 return &XGI_StPALData[tempal];
2465 break;
2466 case 3:
2467 return &XGI_StNTSCData[tempal];
2468 break;
2469 case 4:
2470 return &XGI_ExtHiTVData[tempal];
2471 break;
2472 case 5:
2473 return &XGI_St2HiTVData[tempal];
2474 break;
2475 case 6:
2476 return &XGI_ExtYPbPr525iData[tempal];
2477 break;
2478 case 7:
2479 return &XGI_ExtYPbPr525pData[tempal];
2480 break;
2481 case 8:
2482 return &XGI_ExtYPbPr750pData[tempal];
2483 break;
2484 case 9:
2485 return &XGI_StYPbPr525iData[tempal];
2486 break;
2487 case 10:
2488 return &XGI_StYPbPr525pData[tempal];
2489 break;
2490 case 11:
2491 return &XGI_StYPbPr750pData[tempal];
2492 break;
2493 case 12: /* avoid system hang */
2494 return &XGI_ExtNTSCData[tempal];
2495 break;
2496 case 13:
2497 return &XGI_St1HiTVData[tempal];
2498 break;
2499 default:
2500 break;
2501 }
2502 } else if (table == 0x02) {
2503 switch (tempdi[i].DATAPTR) {
2504 case 0:
2505 return &XGI_CHTVUNTSCData[tempal];
2506 break;
2507 case 1:
2508 return &XGI_CHTVONTSCData[tempal];
2509 break;
2510 case 2:
2511 return &XGI_CHTVUPALData[tempal];
2512 break;
2513 case 3:
2514 return &XGI_CHTVOPALData[tempal];
2515 break;
2516 default:
2517 break;
2518 }
2519 } else if (table == 0x06) {
2520 }
2521 return NULL;
2522}
2523
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002524static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302525 unsigned short RefreshRateTableIndex,
2526 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002527{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302528 unsigned short tempbx;
2529 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302531 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002532
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302533 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2534 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2535 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2536 pVBInfo);
2537 pVBInfo->VGAHT = LCDPtr->VGAHT;
2538 pVBInfo->VGAVT = LCDPtr->VGAVT;
2539 pVBInfo->HT = LCDPtr->LCDHT;
2540 pVBInfo->VT = LCDPtr->LCDVT;
2541 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002542
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302543 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2544 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2545 | EnableScalingLCD))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002546 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2547 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302548 pVBInfo->HDE = 1024;
2549 pVBInfo->VDE = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002550 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2551 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302552 pVBInfo->HDE = 1280;
2553 pVBInfo->VDE = 1024;
2554 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2555 pVBInfo->HDE = 1400;
2556 pVBInfo->VDE = 1050;
2557 } else {
2558 pVBInfo->HDE = 1600;
2559 pVBInfo->VDE = 1200;
2560 }
2561 }
2562 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002563}
2564
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002565static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302566 unsigned short RefreshRateTableIndex,
2567 struct xgi_hw_device_info *HwDeviceExtension,
2568 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002569{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302570 unsigned char index;
2571 unsigned short tempbx, i;
2572 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2573 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302575 if (ModeNo <= 0x13)
2576 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2577 else
2578 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002579
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302580 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002581
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002582 if ((pVBInfo->IF_DEF_ScaleLCD == 0) ||
2583 ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2584 (!(pVBInfo->LCDInfo & EnableScalingLCD)))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302585 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302587 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002588 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2589 XGI_GetLcdPtr(tempbx, ModeNo,
2590 ModeIdIndex,
2591 RefreshRateTableIndex,
2592 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302594 for (i = 0; i < 8; i++)
2595 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
2596 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302598 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302600 tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002603 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2604 XGI_GetLcdPtr(
2605 tempbx,
2606 ModeNo,
2607 ModeIdIndex,
2608 RefreshRateTableIndex,
2609 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302610 for (i = 0; i < 7; i++)
2611 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2612 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002613
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302614 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302615 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002616}
2617
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002618static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2619{
2620 unsigned char tempal, tempah, tempbl, i;
2621
Aaro Koskinen58839b02011-03-13 12:26:23 +02002622 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002623 tempal = tempah & 0x0F;
2624 tempah = tempah & 0xF0;
2625 i = 0;
2626 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2627
2628 while (tempbl != 0xFF) {
2629 if (tempbl & 0x80) { /* OEMUtil */
2630 tempal = tempah;
2631 tempbl = tempbl & ~(0x80);
2632 }
2633
2634 if (tempal == tempbl)
2635 break;
2636
2637 i++;
2638
2639 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2640 }
2641
2642 return i;
2643}
2644
2645static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2646{
2647 unsigned short tempah, tempal, tempbl, i;
2648
2649 tempal = pVBInfo->LCDResInfo;
2650 tempah = pVBInfo->LCDTypeInfo;
2651
2652 i = 0;
2653 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2654
2655 while (tempbl != 0xFF) {
2656 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2657 tempal = tempah;
2658 tempbl &= ~0x80;
2659 }
2660
2661 if (tempal == tempbl)
2662 break;
2663
2664 i++;
2665 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2666 }
2667
2668 if (tempbl == 0xFF) {
2669 pVBInfo->LCDResInfo = Panel1024x768;
2670 pVBInfo->LCDTypeInfo = 0;
2671 i = 0;
2672 }
2673
2674 return i;
2675}
2676
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002677static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2678 unsigned short *VSyncWidth,
2679 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002680{
2681 unsigned short Index;
2682
2683 Index = XGI_GetLCDCapPtr(pVBInfo);
2684 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2685 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2686
2687 return;
2688}
2689
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002690static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302691 unsigned short RefreshRateTableIndex,
2692 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002693{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302694 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2695 unsigned long temp, temp1, temp2, temp3, push3;
2696 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2697 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302699 if (ModeNo > 0x13)
2700 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2701 else
2702 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302704 if (!(pVBInfo->SetFlag & Win9xDOSMode)) {
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002705 if (pVBInfo->IF_DEF_OEMUtil == 1) {
2706 tempbx = 8;
2707 LCDPtr = (struct XGI330_LCDDataDesStruct *)
2708 XGI_GetLcdPtr(tempbx,
2709 ModeNo,
2710 ModeIdIndex,
2711 RefreshRateTableIndex,
2712 pVBInfo);
2713 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002714
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002715 if ((pVBInfo->IF_DEF_OEMUtil == 0) ||
2716 (LCDPtr == NULL)) {
2717 tempbx = 3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302718 if (pVBInfo->LCDInfo & EnableScalingLCD)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002719 LCDPtr1 =
2720 (struct XGI330_LCDDataDesStruct2 *)
2721 XGI_GetLcdPtr(
2722 tempbx,
2723 ModeNo,
2724 ModeIdIndex,
2725 RefreshRateTableIndex,
2726 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302727 else
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002728 LCDPtr =
2729 (struct XGI330_LCDDataDesStruct *)
2730 XGI_GetLcdPtr(
2731 tempbx,
2732 ModeNo,
2733 ModeIdIndex,
2734 RefreshRateTableIndex,
2735 pVBInfo);
2736 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002737
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002738 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2739 push1 = tempbx;
2740 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002741
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002742 /* GetLCDResInfo */
2743 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2744 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
2745 tempax = 1024;
2746 tempbx = 768;
2747 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2748 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
2749 tempax = 1280;
2750 tempbx = 1024;
2751 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2752 tempax = 1400;
2753 tempbx = 1050;
2754 } else {
2755 tempax = 1600;
2756 tempbx = 1200;
2757 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002758
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002759 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2760 pVBInfo->HDE = tempax;
2761 pVBInfo->VDE = tempbx;
2762 pVBInfo->VGAHDE = tempax;
2763 pVBInfo->VGAVDE = tempbx;
2764 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002765
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002766 if ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2767 (pVBInfo->LCDInfo & EnableScalingLCD)) {
2768 tempax = pVBInfo->HDE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302769 tempbx = pVBInfo->VDE;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002770 }
2771
2772 tempax = pVBInfo->HT;
2773
2774 if (pVBInfo->LCDInfo & EnableScalingLCD)
2775 tempbx = LCDPtr1->LCDHDES;
2776 else
2777 tempbx = LCDPtr->LCDHDES;
2778
2779 tempcx = pVBInfo->HDE;
2780 tempbx = tempbx & 0x0fff;
2781 tempcx += tempbx;
2782
2783 if (tempcx >= tempax)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302784 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002785
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002786 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002787
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002788 tempcx = tempcx >> 3;
2789 tempbx = tempbx >> 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002790
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002791 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2792 (unsigned short) (tempbx & 0xff));
2793 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2794 (unsigned short) (tempcx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002795
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002796 tempax = pVBInfo->HT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002798 if (pVBInfo->LCDInfo & EnableScalingLCD)
2799 tempbx = LCDPtr1->LCDHRS;
2800 else
2801 tempbx = LCDPtr->LCDHRS;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002802
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002803 tempcx = push2;
2804
2805 if (pVBInfo->LCDInfo & EnableScalingLCD)
2806 tempcx = LCDPtr1->LCDHSync;
2807
2808 tempcx += tempbx;
2809
2810 if (tempcx >= tempax)
2811 tempcx -= tempax;
2812
2813 tempax = tempbx & 0x07;
2814 tempax = tempax >> 5;
2815 tempcx = tempcx >> 3;
2816 tempbx = tempbx >> 3;
2817
2818 tempcx &= 0x1f;
2819 tempax |= tempcx;
2820
2821 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2822 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2823 (unsigned short) (tempbx & 0xff));
2824
2825 tempax = pVBInfo->VT;
2826 if (pVBInfo->LCDInfo & EnableScalingLCD)
2827 tempbx = LCDPtr1->LCDVDES;
2828 else
2829 tempbx = LCDPtr->LCDVDES;
2830 tempcx = pVBInfo->VDE;
2831
2832 tempbx = tempbx & 0x0fff;
2833 tempcx += tempbx;
2834 if (tempcx >= tempax)
2835 tempcx -= tempax;
2836
2837 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2838 (unsigned short) (tempbx & 0xff));
2839 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2840 (unsigned short) (tempcx & 0xff));
2841
2842 tempbx = (tempbx >> 8) & 0x07;
2843 tempcx = (tempcx >> 8) & 0x07;
2844
2845 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2846 (unsigned short) ((tempcx << 3)
2847 | tempbx));
2848
2849 tempax = pVBInfo->VT;
2850 if (pVBInfo->LCDInfo & EnableScalingLCD)
2851 tempbx = LCDPtr1->LCDVRS;
2852 else
2853 tempbx = LCDPtr->LCDVRS;
2854
2855 /* tempbx = tempbx >> 4; */
2856 tempcx = push1;
2857
2858 if (pVBInfo->LCDInfo & EnableScalingLCD)
2859 tempcx = LCDPtr1->LCDVSync;
2860
2861 tempcx += tempbx;
2862 if (tempcx >= tempax)
2863 tempcx -= tempax;
2864
2865 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2866 (unsigned short) (tempbx & 0xff));
2867 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2868 (unsigned short) (tempcx & 0x0f));
2869
2870 tempax = ((tempbx >> 8) & 0x07) << 3;
2871
2872 tempbx = pVBInfo->VGAVDE;
2873 if (tempbx != pVBInfo->VDE)
2874 tempax |= 0x40;
2875
2876 if (pVBInfo->LCDInfo & EnableLVDSDDA)
2877 tempax |= 0x40;
2878
2879 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2880 tempax);
2881
2882 tempcx = pVBInfo->VGAVT;
2883 tempbx = pVBInfo->VDE;
2884 tempax = pVBInfo->VGAVDE;
2885 tempcx -= tempax;
2886
2887 temp = tempax; /* 0430 ylshieh */
2888 temp1 = (temp << 18) / tempbx;
2889
2890 tempdx = (unsigned short) ((temp << 18) % tempbx);
2891
2892 if (tempdx != 0)
2893 temp1 += 1;
2894
2895 temp2 = temp1;
2896 push3 = temp2;
2897
2898 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2899 (unsigned short) (temp2 & 0xff));
2900 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2901 (unsigned short) ((temp2 >> 8) & 0xff));
2902
2903 tempbx = (unsigned short) (temp2 >> 16);
2904 tempax = tempbx & 0x03;
2905
2906 tempbx = pVBInfo->VGAVDE;
2907 if (tempbx == pVBInfo->VDE)
2908 tempax |= 0x04;
2909
2910 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2911
2912 if (pVBInfo->VBType & VB_XGI301C) {
2913 temp2 = push3;
2914 xgifb_reg_set(pVBInfo->Part4Port,
2915 0x3c,
2916 (unsigned short) (temp2 & 0xff));
2917 xgifb_reg_set(pVBInfo->Part4Port,
2918 0x3b,
2919 (unsigned short) ((temp2 >> 8) &
2920 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302921 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002922 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2923 ~0xc0,
2924 (unsigned short) ((tempbx &
2925 0xff) << 6));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002926
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002927 tempcx = pVBInfo->VGAVDE;
2928 if (tempcx == pVBInfo->VDE)
2929 xgifb_reg_and_or(pVBInfo->Part4Port,
2930 0x30, ~0x0c, 0x00);
2931 else
2932 xgifb_reg_and_or(pVBInfo->Part4Port,
2933 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302934 }
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002935
2936 tempcx = pVBInfo->VGAHDE;
2937 tempbx = pVBInfo->HDE;
2938
2939 temp1 = tempcx << 16;
2940
2941 tempax = (unsigned short) (temp1 / tempbx);
2942
2943 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2944 tempax = 65535;
2945
2946 temp3 = tempax;
2947 temp1 = pVBInfo->VGAHDE << 16;
2948
2949 temp1 /= temp3;
2950 temp3 = temp3 << 16;
2951 temp1 -= 1;
2952
2953 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2954
2955 tempax = (unsigned short) (temp3 & 0xff);
2956 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2957
2958 temp1 = pVBInfo->VGAVDE << 18;
2959 temp1 = temp1 / push3;
2960 tempbx = (unsigned short) (temp1 & 0xffff);
2961
2962 if (pVBInfo->LCDResInfo == Panel1024x768)
2963 tempbx -= 1;
2964
2965 tempax = ((tempbx >> 8) & 0xff) << 3;
2966 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2967 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2968 (unsigned short) (tempax & 0xff));
2969 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2970 (unsigned short) (tempbx & 0xff));
2971
2972 temp3 = temp3 >> 16;
2973
2974 if (modeflag & HalfDCLK)
2975 temp3 = temp3 >> 1;
2976
2977 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2978 (unsigned short) ((temp3 >> 8) & 0xff));
2979 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2980 (unsigned short) (temp3 & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302981 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002982}
2983
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002984/* --------------------------------------------------------------------- */
2985/* Function : XGI_GETLCDVCLKPtr */
2986/* Input : */
2987/* Output : al -> VCLK Index */
2988/* Description : */
2989/* --------------------------------------------------------------------- */
2990static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2991 struct vb_device_info *pVBInfo)
2992{
2993 unsigned short index;
2994
2995 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2996 if (pVBInfo->IF_DEF_ScaleLCD == 1) {
2997 if (pVBInfo->LCDInfo & EnableScalingLCD)
2998 return;
2999 }
3000
3001 /* index = XGI_GetLCDCapPtr(pVBInfo); */
3002 index = XGI_GetLCDCapPtr1(pVBInfo);
3003
3004 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
3005 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
3006 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
3007 } else { /* LCDA */
3008 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
3009 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
3010 }
3011 }
3012 return;
3013}
3014
3015static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
3016 unsigned short ModeNo, unsigned short ModeIdIndex,
3017 struct vb_device_info *pVBInfo)
3018{
3019
3020 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003021 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003022
3023 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003024 /* si+St_ResInfo */
3025 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003026 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003027 /* si+Ext_ResInfo */
3028 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003029
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003030 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
3031 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003032 index = XGI_GetLCDCapPtr(pVBInfo);
3033 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
3034
3035 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
3036 return tempal;
3037
3038 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003039 if (pVBInfo->VBType &
3040 (VB_XGI301B |
3041 VB_XGI302B |
3042 VB_XGI301LV |
3043 VB_XGI302LV |
3044 VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003045 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3046 tempal = HiTVVCLKDIV2;
3047 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3048 tempal = HiTVVCLK;
3049 if (pVBInfo->TVInfo & TVSimuMode) {
3050 tempal = HiTVSimuVCLK;
3051 if (!(modeflag & Charx8Dot))
3052 tempal = HiTVTextVCLK;
3053
3054 }
3055 return tempal;
3056 }
3057
3058 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
3059 tempal = YPbPr750pVCLK;
3060 return tempal;
3061 }
3062
3063 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
3064 tempal = YPbPr525pVCLK;
3065 return tempal;
3066 }
3067
3068 tempal = NTSC1024VCLK;
3069
3070 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
3071 tempal = TVVCLKDIV2;
3072 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3073 tempal = TVVCLK;
3074 }
3075
3076 if (pVBInfo->VBInfo & SetCRT2ToTV)
3077 return tempal;
3078 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003079 } /* {End of VB} */
3080
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003081 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003082 tempal = tempal >> 2;
3083 tempal &= 0x03;
3084
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003085 /* for Dot8 Scaling LCD */
3086 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003087 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
3088
3089 if (ModeNo <= 0x13)
3090 return tempal;
3091
3092 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
3093 return tempal;
3094}
3095
3096static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
3097 unsigned char *di_1, struct vb_device_info *pVBInfo)
3098{
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003099 if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003100 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
3101 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
3102 & ProgrammingCRT2)) {
3103 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
3104 *di_1 = XGI_VBVCLKData[tempal].SR2C;
3105 }
3106 } else {
3107 *di_0 = XGI_VCLKData[tempal].SR2B;
3108 *di_1 = XGI_VCLKData[tempal].SR2C;
3109 }
3110}
3111
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003112static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303113 unsigned short RefreshRateTableIndex,
3114 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003115{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303116 unsigned char di_0, di_1, tempal;
3117 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303119 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3120 pVBInfo);
3121 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3122 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003123
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303124 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003125 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303126 (unsigned short) (0x10 * i));
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003127 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303128 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003129 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3130 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303131 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003132 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3133 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303134 }
3135 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003136}
3137
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003138static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303139 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003140{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303141 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303143 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3144 | VB_XGI302LV | VB_XGI301C)) {
3145 tempcl = 0;
3146 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003147 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303149 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003150 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303151 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003152 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303153 if (!(temp & 0x40))
3154 tempcl |= ActiveCRT1;
3155 }
3156 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003157
Aaro Koskinen58839b02011-03-13 12:26:23 +02003158 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303159 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303161 if (!(temp == 0x08)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003162 /* Check ChannelA by Part1_13 [2003/10/03] */
3163 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303164 if (tempax & 0x04)
3165 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303167 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303169 if (!(tempcl & ActiveLCD))
3170 if (temp == 0x01)
3171 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 if (temp == 0x04)
3174 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003177 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303179 if (!(temp & 0x08))
3180 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003181
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303182 if (!(temp & 0x04))
3183 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003184
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303185 if (temp & 0x02)
3186 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303188 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3189 if (temp & 0x01)
3190 tempch |= ActiveHiTV;
3191 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003194 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303195 pVBInfo->Part2Port,
3196 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303198 if (temp & 0x10)
3199 tempch |= ActiveYPbPr;
3200 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003201
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303202 if (tempch != 0)
3203 tempcl |= ActiveTV;
3204 }
3205 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003206
Aaro Koskinen58839b02011-03-13 12:26:23 +02003207 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303208 if (tempcl & ActiveLCD) {
3209 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3210 if (temp & ActiveTV)
3211 tempcl |= ActiveTV;
3212 }
3213 }
3214 temp = tempcl;
3215 tempbl = ~ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003216 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003217
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303218 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003219 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303220 } else {
3221 return;
3222 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003223}
3224
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303225void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3226 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003227{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303228 /*
3229 if ( HwDeviceExtension->jChipType >= XG20 ) {
3230 pVBInfo->Set_VGAType = XG20;
Aaro Koskinen06587332011-03-13 12:26:10 +02003231 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303232 pVBInfo->Set_VGAType = VGA_XGI340;
3233 }
3234 */
3235 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003236}
3237
Bill Pemberton80adad82010-06-17 13:10:51 -04003238void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003239{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303240 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303242 if (pVBInfo->IF_DEF_LVDS == 0) {
3243 tempbx = VB_XGI302B;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003244 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 if (flag != 0x02) {
3246 tempbx = VB_XGI301;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003247 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303248 if (flag >= 0xB0) {
3249 tempbx = VB_XGI301B;
3250 if (flag >= 0xC0) {
3251 tempbx = VB_XGI301C;
3252 if (flag >= 0xD0) {
3253 tempbx = VB_XGI301LV;
3254 if (flag >= 0xE0) {
3255 tempbx = VB_XGI302LV;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003256 tempah = xgifb_reg_get(
3257 pVBInfo->Part4Port,
3258 0x39);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303259 if (tempah != 0xFF)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003260 tempbx =
3261 VB_XGI301C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303262 }
3263 }
3264 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303266 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003267 flag = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303268 pVBInfo->Part4Port,
3269 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303271 if (!(flag & 0x02))
3272 tempbx = tempbx | VB_NoLCD;
3273 }
3274 }
3275 }
3276 pVBInfo->VBType = tempbx;
3277 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003278}
3279
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303280void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3281 struct xgi_hw_device_info *HwDeviceExtension,
3282 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003283{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303284 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003285
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303286 if (ModeNo <= 0x13)
3287 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3288 else
3289 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 pVBInfo->SetFlag = 0;
3292 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3293 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003294
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303295 if (pVBInfo->VBType & 0xFFFF) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003296 /* Check Display Device */
3297 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303298 tempbx = tempbx | temp;
Aaro Koskinen58839b02011-03-13 12:26:23 +02003299 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 push = temp;
3301 push = push << 8;
3302 tempax = temp << 8;
3303 tempbx = tempbx | tempax;
3304 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3305 | SetInSlaveMode | DisableCRT2Display);
3306 temp = 0xFFFF ^ temp;
3307 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003308
Aaro Koskinen58839b02011-03-13 12:26:23 +02003309 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003310
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303311 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 if ((pVBInfo->Set_VGAType >= XG20)
3314 || (pVBInfo->Set_VGAType >= XG40)) {
3315 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003316 /* if ((pVBInfo->VBType & VB_XGI302B)
3317 || (pVBInfo->VBType & VB_XGI301LV)
3318 || (pVBInfo->VBType & VB_XGI302LV)
3319 || (pVBInfo->VBType & VB_XGI301C))
3320 */
3321 if (pVBInfo->VBType &
3322 (VB_XGI302B |
3323 VB_XGI301LV |
3324 VB_XGI302LV |
3325 VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303326 if (temp & EnableDualEdge) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003327 tempbx |=
3328 SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003329
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303330 if (temp & SetToLCDA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003331 tempbx |=
3332 SetCRT2ToLCDA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303333 }
3334 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303335 }
3336 }
3337 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003338
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303339 if (pVBInfo->IF_DEF_YPbPr == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003340 /* [Billy] 07/05/04 */
3341 if (((pVBInfo->IF_DEF_LVDS == 0) &&
3342 ((pVBInfo->VBType & VB_XGI301LV) ||
3343 (pVBInfo->VBType & VB_XGI302LV) ||
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003344 (pVBInfo->VBType & VB_XGI301C)))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303345 if (temp & SetYPbPr) { /* temp = CR38 */
3346 if (pVBInfo->IF_DEF_HiVision == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003347 /* shampoo add for new
3348 * scratch */
Aaro Koskinen58839b02011-03-13 12:26:23 +02003349 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350 pVBInfo->P3d4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003351 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303352 temp &= YPbPrMode;
3353 tempbx |= SetCRT2ToHiVisionTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303355 if (temp != YPbPrMode1080i) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003356 tempbx &=
3357 (~SetCRT2ToHiVisionTV);
3358 tempbx |=
3359 SetCRT2ToYPbPr;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303360 }
3361 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303363 /* tempbx |= SetCRT2ToYPbPr; */
3364 }
3365 }
3366 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003367
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303368 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003369
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303370 if (pVBInfo->IF_DEF_LVDS == 0) {
3371 if (pVBInfo->IF_DEF_YPbPr == 1) {
3372 if (pVBInfo->IF_DEF_HiVision == 1)
3373 temp = 0x09FC;
3374 else
3375 temp = 0x097C;
3376 } else {
3377 if (pVBInfo->IF_DEF_HiVision == 1)
3378 temp = 0x01FC;
3379 else
3380 temp = 0x017C;
3381 }
3382 } else { /* 3nd party chip */
Aaro Koskinen83f76a92011-08-31 21:45:58 +03003383 temp = SetCRT2ToLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303384 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303386 if (!(tempbx & temp)) {
3387 tempax |= DisableCRT2Display;
3388 tempbx = 0;
3389 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303391 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3392 if (!(pVBInfo->VBType & VB_NoLCD)) {
3393 if (tempbx & SetCRT2ToLCDA) {
3394 if (tempbx & SetSimuScanMode)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003395 tempbx &= (~(SetCRT2ToLCD |
3396 SetCRT2ToRAMDAC |
3397 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303398 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003399 tempbx &= (~(SetCRT2ToLCD |
3400 SetCRT2ToRAMDAC |
3401 SetCRT2ToTV |
3402 SwitchToCRT2));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303403 }
3404 }
3405 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303407 /* shampoo add */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003408 /* for driver abnormal */
3409 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303410 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3411 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003412 tempbx &= (0xFF00 |
3413 SetCRT2ToRAMDAC |
3414 SwitchToCRT2 |
3415 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303416 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3417 }
3418 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003419 tempbx &= (~(SetCRT2ToRAMDAC |
3420 SetCRT2ToLCD |
3421 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303422 }
3423 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303425 if (!(pVBInfo->VBType & VB_NoLCD)) {
3426 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003427 tempbx &= (0xFF00 |
3428 SetCRT2ToLCD |
3429 SwitchToCRT2 |
3430 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303431 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3432 }
3433 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303435 if (tempbx & SetCRT2ToSCART) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003436 tempbx &= (0xFF00 |
3437 SetCRT2ToSCART |
3438 SwitchToCRT2 |
3439 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303440 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3441 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303443 if (pVBInfo->IF_DEF_YPbPr == 1) {
3444 if (tempbx & SetCRT2ToYPbPr)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003445 tempbx &= (0xFF00 |
3446 SwitchToCRT2 |
3447 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303448 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303450 if (pVBInfo->IF_DEF_HiVision == 1) {
3451 if (tempbx & SetCRT2ToHiVisionTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003452 tempbx &= (0xFF00 |
3453 SetCRT2ToHiVisionTV |
3454 SwitchToCRT2 |
3455 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303456 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303458 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3459 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3460 tempbx = DisableCRT2Display;
3461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303463 if (!(tempbx & DisableCRT2Display)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003464 if ((!(tempbx & DriverMode)) ||
3465 (!(modeflag & CRT2Mode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303466 if (pVBInfo->IF_DEF_LCDA == 1) {
3467 if (!(tempbx & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003468 tempbx |= (SetInSlaveMode |
3469 SetSimuScanMode);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303470 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303472 if (pVBInfo->IF_DEF_VideoCapture == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003473 if (((HwDeviceExtension->jChipType ==
3474 XG40) &&
3475 (pVBInfo->Set_VGAType == XG40)) ||
3476 ((HwDeviceExtension->jChipType ==
3477 XG41) &&
3478 (pVBInfo->Set_VGAType == XG41)) ||
3479 ((HwDeviceExtension->jChipType ==
3480 XG42) &&
3481 (pVBInfo->Set_VGAType == XG42)) ||
3482 ((HwDeviceExtension->jChipType ==
3483 XG45) &&
3484 (pVBInfo->Set_VGAType == XG45))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303485 if (ModeNo <= 13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003486 if (!(tempbx &
3487 SetCRT2ToRAMDAC)) {
3488 /*CRT2 not need
3489 * to support*/
3490 tempbx &=
3491 (0x00FF |
3492 (~SetInSlaveMode));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303493 pVBInfo->SetFlag
3494 |= EnableVCMode;
3495 }
3496 }
3497 }
3498 }
3499 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003500
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003501 /* LCD+TV can't support in slave mode
3502 * (Force LCDA+TV->LCDB) */
3503 if ((tempbx & SetInSlaveMode) &&
3504 (tempbx & SetCRT2ToLCDA)) {
3505 tempbx ^= (SetCRT2ToLCD |
3506 SetCRT2ToLCDA |
3507 SetCRT2ToDualEdge);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303508 pVBInfo->SetFlag |= ReserveTVOption;
3509 }
3510 }
3511 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303513 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003514}
3515
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303516void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3517 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003518{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303519 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003520
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303521 tempbx = 0;
3522 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303524 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3525 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003526 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3527 St_ModeFlag; /* si+St_ModeFlag */
3528 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3529 St_ResInfo; /* si+St_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303530 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003531 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3532 Ext_ModeFlag;
3533 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3534 Ext_RESINFO; /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303535 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003536
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303537 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003538 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303539 tempbx = temp;
3540 if (tempbx & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003541 tempbx &= (SetCHTVOverScan |
3542 SetPALMTV |
3543 SetPALNTV |
3544 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303545 if (tempbx & SetPALMTV)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003546 /* set to NTSC if PAL-M */
3547 tempbx &= ~SetPALTV;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303548 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003549 tempbx &= (SetCHTVOverScan |
3550 SetNTSCJ |
3551 SetPALTV);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303552 /*
3553 if (pVBInfo->IF_DEF_LVDS == 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003554 //PAL-M/PAL-N Info
3555 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3556 //00:PAL, 01:PAL-M, 10:PAL-N
3557 temp2 = (index1 & 0xC0) >> 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303558 tempbx |= temp2;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003559 if (temp2 & 0x02) //PAL-M
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303560 tempbx &= (~SetPALTV);
3561 }
3562 */
3563 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303565 if (pVBInfo->IF_DEF_LVDS == 0) {
3566 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3567 tempbx |= SetPALTV;
3568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303570 if (pVBInfo->IF_DEF_YPbPr == 1) {
3571 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003572 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303573 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303575 if (index1 == YPbPrMode525i)
3576 tempbx |= SetYPbPrMode525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303578 if (index1 == YPbPrMode525p)
3579 tempbx = tempbx | SetYPbPrMode525p;
3580 if (index1 == YPbPrMode750p)
3581 tempbx = tempbx | SetYPbPrMode750p;
3582 }
3583 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303585 if (pVBInfo->IF_DEF_HiVision == 1) {
3586 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3587 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
3588 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003589
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303590 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003591 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3592 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303593 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003594
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003595 if (!(tempbx & SetPALTV) &&
3596 (modeflag > 13) &&
3597 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303598 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303600 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303602 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3603 if (pVBInfo->VBInfo & SetInSlaveMode)
3604 tempbx &= (~RPLLDIV2XO);
3605 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003606 if (tempbx &
3607 (SetYPbPrMode525p | SetYPbPrMode750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303608 tempbx &= (~RPLLDIV2XO);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003609 else if (!(pVBInfo->VBType &
3610 (VB_XGI301B |
3611 VB_XGI302B |
3612 VB_XGI301LV |
3613 VB_XGI302LV |
3614 VB_XGI301C))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303615 if (tempbx & TVSimuMode)
3616 tempbx &= (~RPLLDIV2XO);
3617 }
3618 }
3619 }
3620 }
3621 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003622}
3623
Bill Pemberton108afbf2010-06-17 13:10:47 -04003624unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303625 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003626{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303627 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303629 pVBInfo->LCDResInfo = 0;
3630 pVBInfo->LCDTypeInfo = 0;
3631 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303633 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003634 /* si+St_ModeFlag // */
3635 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303636 } else {
3637 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003638 /* si+Ext_ResInfo // */
3639 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003641
Aaro Koskinen58839b02011-03-13 12:26:23 +02003642 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303643 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303645 if (tempbx == 0)
3646 tempbx = Panel1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303648 /* LCD75 [2003/8/22] Vicent */
3649 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3650 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003651 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303652 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3653 tempax &= 0x0F;
3654 else
3655 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303657 if ((resinfo == 6) || (resinfo == 9)) {
3658 if (tempax >= 3)
3659 tempbx |= PanelRef75Hz;
3660 } else if ((resinfo == 7) || (resinfo == 8)) {
3661 if (tempax >= 4)
3662 tempbx |= PanelRef75Hz;
3663 }
3664 }
3665 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303667 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303669 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303671 if (pVBInfo->IF_DEF_OEMUtil == 1)
3672 pVBInfo->LCDTypeInfo = (temp & 0xf0) >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303674 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
3675 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003676
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303677 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003678
Aaro Koskinen58839b02011-03-13 12:26:23 +02003679 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303681 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303683 if ((pVBInfo->IF_DEF_ScaleLCD == 1) && (temp & LCDNonExpanding))
3684 temp &= ~EnableScalingLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303686 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303688 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003689
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303690 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303692 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3693 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3694 & VB_XGI301C)) && (tempax & LCDDualLink)) {
3695 tempbx |= SetLCDDualLink;
3696 }
3697 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303699 if (pVBInfo->IF_DEF_LVDS == 0) {
3700 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
3701 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3702 == 9) && (!(tempbx & EnableScalingLCD)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003703 /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3704 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303705 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303707 /*
3708 if (tempax & LCDBToA) {
3709 tempbx |= SetLCDBToA;
3710 }
3711 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003712
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303713 if (pVBInfo->IF_DEF_ExpLink == 1) {
3714 if (modeflag & HalfDCLK) {
3715 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
3716 if (!(tempbx & SetLCDtoNonExpanding)) {
3717 tempbx |= EnableLVDSDDA;
3718 } else {
3719 if (ModeNo > 0x13) {
3720 if (pVBInfo->LCDResInfo
3721 == Panel1024x768) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003722 if (resinfo == 4) {/* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303723 tempbx |= EnableLVDSDDA;
3724 }
3725 }
3726 }
3727 }
3728 }
3729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003730
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303731 if (pVBInfo->VBInfo & SetInSlaveMode) {
3732 if (pVBInfo->VBInfo & SetNotSimuMode)
3733 tempbx |= LCDVESATiming;
3734 } else {
3735 tempbx |= LCDVESATiming;
3736 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303738 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303740 if (pVBInfo->IF_DEF_PWD == 1) {
3741 if (pVBInfo->LCDInfo & SetPWDEnable) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003742 if ((pVBInfo->VBType & VB_XGI302LV) ||
3743 (pVBInfo->VBType & VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303744 if (!(tempax & PWDEnable))
3745 pVBInfo->LCDInfo &= ~SetPWDEnable;
3746 }
3747 }
3748 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303750 if (pVBInfo->IF_DEF_LVDS == 0) {
3751 if (tempax & (LockLCDBToA | StLCDBToA)) {
3752 if (pVBInfo->VBInfo & SetInSlaveMode) {
3753 if (!(tempax & LockLCDBToA)) {
3754 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003755 pVBInfo->VBInfo &=
3756 ~(SetSimuScanMode |
3757 SetInSlaveMode |
3758 SetCRT2ToLCD);
3759 pVBInfo->VBInfo |=
3760 SetCRT2ToLCDA |
3761 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303762 }
3763 }
3764 }
3765 }
3766 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003767
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303768 /*
3769 if (pVBInfo->IF_DEF_LVDS == 0) {
3770 if (tempax & (LockLCDBToA | StLCDBToA)) {
3771 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003772 if (!((!(tempax & LockLCDBToA)) &&
3773 (ModeNo > 0x13))) {
3774 pVBInfo->VBInfo &=
3775 ~(SetSimuScanMode |
3776 SetInSlaveMode |
3777 SetCRT2ToLCD);
3778 pVBInfo->VBInfo |=
3779 SetCRT2ToLCDA |
3780 SetCRT2ToDualEdge;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303781 }
3782 }
3783 }
3784 }
3785 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303787 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003788}
3789
Bill Pemberton108afbf2010-06-17 13:10:47 -04003790unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303791 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003792{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303793 if (ModeNo <= 5)
3794 ModeNo |= 1;
3795 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003796 /* for (*ModeIdIndex=0;
3797 *ModeIdIndex < sizeof(pVBInfo->SModeIDTable)
3798 / sizeof(struct XGI_StStruct);
3799 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303800 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003801 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3802 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303803 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003804 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
3805 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303806 return 0;
3807 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 if (ModeNo == 0x07)
3810 (*ModeIdIndex)++; /* 400 lines */
3811 if (ModeNo <= 3)
3812 (*ModeIdIndex) += 2; /* 400 lines */
3813 /* else 350 lines */
3814 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003815 /* for (*ModeIdIndex=0;
3816 *ModeIdIndex < sizeof(pVBInfo->EModeIDTable)
3817 / sizeof(struct XGI_ExtStruct);
3818 (*ModeIdIndex)++) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303819 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003820 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3821 ModeNo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303822 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003823 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
3824 0xFF)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303825 return 0;
3826 }
3827 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303829 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003830}
3831
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003832/* win2000 MM adapter not support standard mode! */
3833
Randy Dunlap89229672010-08-10 08:46:44 -07003834#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07003835static unsigned char XGINew_CheckMemorySize(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303836 struct xgi_hw_device_info *HwDeviceExtension,
3837 unsigned short ModeNo,
3838 unsigned short ModeIdIndex,
3839 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003840{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 unsigned short memorysize, modeflag, temp, temp1, tmp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303843 /*
3844 if ((HwDeviceExtension->jChipType == XGI_650) ||
3845 (HwDeviceExtension->jChipType == XGI_650M)) {
3846 return 1;
3847 }
3848 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303850 if (ModeNo <= 0x13)
3851 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3852 else
3853 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303855 /* ModeType = modeflag&ModeInfoFlag; // Get mode type */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303857 memorysize = modeflag & MemoryInfoFlag;
3858 memorysize = memorysize > MemorySizeShift;
3859 memorysize++; /* Get memory size */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003860
Aaro Koskinen58839b02011-03-13 12:26:23 +02003861 temp = xgifb_reg_get(pVBInfo->P3c4, 0x14); /* Get DRAM Size */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303862 tmp = temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003863
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303864 if (HwDeviceExtension->jChipType == XG40) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003865 /* memory size per channel SR14[7:4] */
3866 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303867 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
3868 temp <<= 2;
3869 } else if ((tmp & 0x0c) == 0x08) { /* Dual channels */
3870 temp <<= 1;
3871 }
3872 } else if (HwDeviceExtension->jChipType == XG42) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003873 /* memory size per channel SR14[7:4] */
3874 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303875 if ((tmp & 0x04) == 0x04) { /* Dual channels */
3876 temp <<= 1;
3877 }
3878 } else if (HwDeviceExtension->jChipType == XG45) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003879 /* memory size per channel SR14[7:4] */
3880 temp = 1 << ((temp & 0x0F0) >> 4);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303881 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
3882 temp <<= 2;
3883 } else if ((tmp & 0x0c) == 0x08) { /* triple channels */
3884 temp1 = temp;
3885 temp <<= 1;
3886 temp += temp1;
3887 } else if ((tmp & 0x0c) == 0x04) { /* Dual channels */
3888 temp <<= 1;
3889 }
3890 }
3891 if (temp < memorysize)
3892 return 0;
3893 else
3894 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003895}
Randy Dunlap89229672010-08-10 08:46:44 -07003896#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303898/*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003899void XGINew_IsLowResolution(unsigned short ModeNo,
3900 unsigned short ModeIdIndex,
3901 unsigned char XGINew_CheckMemorySize(
3902 struct xgi_hw_device_info *HwDeviceExtension,
3903 unsigned short ModeNo,
3904 unsigned short ModeIdIndex,
3905 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003906{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303907 unsigned short data ;
3908 unsigned short ModeFlag ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003909
Aaro Koskinen58839b02011-03-13 12:26:23 +02003910 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303911 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003912 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303914 if (ModeNo > 0x13) {
3915 ModeFlag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3916 if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003917 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303918 data |= 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003919 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003920 data = xgifb_reg_get(pVBInfo->P3c4, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303921 data &= 0xF7;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003922 xgifb_reg_set(pVBInfo->P3c4, 0x01, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303923 }
3924 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003925}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003926*/
3927
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003928static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
3929{
3930 unsigned char ujRet = 0;
3931 unsigned char i = 0;
3932
3933 for (i = 0; i < 8; i++) {
3934 ujRet = ujRet << 1;
3935 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
3936 ujRet |= (ujDate >> i) & 1;
3937 }
3938
3939 return ujRet;
3940}
3941
3942/*----------------------------------------------------------------------------*/
3943/* output */
3944/* bl[5] : LVDS signal */
3945/* bl[1] : LVDS backlight */
3946/* bl[0] : LVDS VDD */
3947/*----------------------------------------------------------------------------*/
3948static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
3949{
3950 unsigned char CR4A, temp;
3951
Aaro Koskinen58839b02011-03-13 12:26:23 +02003952 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003953 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003954
Aaro Koskinen58839b02011-03-13 12:26:23 +02003955 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003956
3957 temp = XG21GPIODataTransfer(temp);
3958 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003959 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003960 return temp;
3961}
3962
3963/*----------------------------------------------------------------------------*/
3964/* output */
3965/* bl[5] : LVDS signal */
3966/* bl[1] : LVDS backlight */
3967/* bl[0] : LVDS VDD */
3968/*----------------------------------------------------------------------------*/
3969static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
3970{
3971 unsigned char CR4A, CRB4, temp;
3972
Aaro Koskinen58839b02011-03-13 12:26:23 +02003973 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02003974 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003975
Aaro Koskinen58839b02011-03-13 12:26:23 +02003976 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003977
3978 temp &= 0x0C;
3979 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003980 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003981 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003982 temp |= ((CRB4 & 0x04) << 3);
3983 return temp;
3984}
3985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303986void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
3987 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003988{
3989
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003990 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303991 if (pXGIHWDE->jChipType == XG21) {
3992 if (pVBInfo->IF_DEF_LVDS == 1) {
3993 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003994 /* LVDS VDD on */
3995 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303996 XGI_XG21SetPanelDelay(2, pVBInfo);
3997 }
3998 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003999 /* LVDS signal on */
4000 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304001 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004002 /* LVDS backlight on */
4003 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004005 /* DVO/DVI signal on */
4006 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304007 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304011 if (pXGIHWDE->jChipType == XG27) {
4012 if (pVBInfo->IF_DEF_LVDS == 1) {
4013 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004014 /* LVDS VDD on */
4015 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304016 XGI_XG21SetPanelDelay(2, pVBInfo);
4017 }
4018 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004019 /* LVDS signal on */
4020 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304021 XGI_XG21SetPanelDelay(3, pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004022 /* LVDS backlight on */
4023 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304024 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004025 /* DVO/DVI signal on */
4026 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304027 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304029 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004030}
4031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304032void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
4033 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004034{
4035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304036 if (pXGIHWDE->jChipType == XG21) {
4037 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004038 /* LVDS backlight off */
4039 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304040 XGI_XG21SetPanelDelay(3, pVBInfo);
4041 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004042 /* DVO/DVI signal off */
4043 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304044 }
4045 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304047 if (pXGIHWDE->jChipType == XG27) {
4048 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004049 /* LVDS backlight off */
4050 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304051 XGI_XG21SetPanelDelay(3, pVBInfo);
4052 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304054 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004055 /* DVO/DVI signal off */
4056 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304057 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004058
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004059 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004060}
4061
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004062static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004063{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004064 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304065 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004066
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004067 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304068 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004069}
4070
Randy Dunlap89229672010-08-10 08:46:44 -07004071#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07004072static void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004073{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004074 while (!(inb(pVBInfo->P3da) & 0x01))
4075 ;
4076 while (inb(pVBInfo->P3da) & 0x01)
4077 ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004078}
Randy Dunlap89229672010-08-10 08:46:44 -07004079#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004080
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004081static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004082{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304083 if (!(pVBInfo->SetFlag & Win9xDOSMode))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004084 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004085}
4086
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004087static void XGI_SaveCRT2Info(unsigned short ModeNo,
4088 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004089{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004091
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004092 /* reserve CR34 for CRT1 Mode No */
4093 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304094 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
4095 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004096 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004097}
4098
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004099static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
4100 unsigned short ModeIdIndex,
4101 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004102{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304103 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304105 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
4106 if (ModeNo <= 0x13) {
4107 xres = pVBInfo->StResInfo[resindex].HTotal;
4108 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004109 /* si+St_ResInfo */
4110 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304111 } else {
4112 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4113 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004114 /* si+St_ModeFlag */
4115 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304117 /*
4118 if (pVBInfo->IF_DEF_FSTN) {
4119 xres *= 2;
4120 yres *= 2;
4121 } else {
4122 */
4123 if (modeflag & HalfDCLK)
4124 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304126 if (modeflag & DoubleScanMode)
4127 yres *= 2;
4128 /* } */
4129 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004130
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304131 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4132 if (pVBInfo->IF_DEF_LVDS == 0) {
4133 if (pVBInfo->LCDResInfo == Panel1600x1200) {
4134 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4135 if (yres == 1024)
4136 yres = 1056;
4137 }
4138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304140 if (pVBInfo->LCDResInfo == Panel1280x1024) {
4141 if (yres == 400)
4142 yres = 405;
4143 else if (yres == 350)
4144 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004145
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304146 if (pVBInfo->LCDInfo & LCDVESATiming) {
4147 if (yres == 360)
4148 yres = 375;
4149 }
4150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304152 if (pVBInfo->LCDResInfo == Panel1024x768) {
4153 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4154 if (!(pVBInfo->LCDInfo
4155 & LCDNonExpanding)) {
4156 if (yres == 350)
4157 yres = 357;
4158 else if (yres == 400)
4159 yres = 420;
4160 else if (yres == 480)
4161 yres = 525;
4162 }
4163 }
4164 }
4165 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304167 if (xres == 720)
4168 xres = 640;
4169 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004170
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304171 pVBInfo->VGAHDE = xres;
4172 pVBInfo->HDE = xres;
4173 pVBInfo->VGAVDE = yres;
4174 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004175}
4176
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004177static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004178{
4179
Dan Carpentera65fd092011-01-04 09:02:27 +03004180 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
4181 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304182 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004185}
4186
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004187static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
4188 unsigned short ModeIdIndex,
4189 unsigned short RefreshRateTableIndex,
4190 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004191{
4192 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
4193 StandTableIndex, CRT1Index;
4194
4195 pVBInfo->RVBHCMAX = 1;
4196 pVBInfo->RVBHCFACT = 1;
4197
4198 if (ModeNo <= 0x13) {
4199 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4200 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
4201 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
4202 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
4203 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
4204 } else {
4205 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004206 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
4207 Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004208 CRT1Index &= IndexMask;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004209 temp1 = (unsigned short) pVBInfo->
4210 XGINEWUB_CRT1Table[CRT1Index].CR[0];
4211 temp2 = (unsigned short) pVBInfo->
4212 XGINEWUB_CRT1Table[CRT1Index].CR[5];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004213 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004214 tempbx = (unsigned short) pVBInfo->
4215 XGINEWUB_CRT1Table[CRT1Index].CR[8];
4216 tempcx = (unsigned short) pVBInfo->
4217 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004218 tempcx &= 0x0100;
4219 tempcx = tempcx << 2;
4220 tempbx |= tempcx;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004221 temp1 = (unsigned short) pVBInfo->
4222 XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004223 }
4224
4225 if (temp1 & 0x01)
4226 tempbx |= 0x0100;
4227
4228 if (temp1 & 0x20)
4229 tempbx |= 0x0200;
4230 tempax += 5;
4231
4232 if (modeflag & Charx8Dot)
4233 tempax *= 8;
4234 else
4235 tempax *= 9;
4236
4237 pVBInfo->VGAHT = tempax;
4238 pVBInfo->HT = tempax;
4239 tempbx++;
4240 pVBInfo->VGAVT = tempbx;
4241 pVBInfo->VT = tempbx;
4242}
4243
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004244static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304245 unsigned short RefreshRateTableIndex,
4246 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004247{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304248 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004249
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304250 struct XGI_LCDDataStruct *LCDPtr = NULL;
4251 struct XGI_TVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304253 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004254 /* si+St_ResInfo */
4255 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304256 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4257 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004258 /* si+Ext_ResInfo */
4259 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304260 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4261 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304263 pVBInfo->NewFlickerMode = 0;
4264 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304266 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4267 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4268 pVBInfo);
4269 return;
4270 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004271
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304272 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004273
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304274 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4275 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4276 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4277 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304279 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4280 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4281 pVBInfo->VGAHT = LCDPtr->VGAHT;
4282 pVBInfo->VGAVT = LCDPtr->VGAVT;
4283 pVBInfo->HT = LCDPtr->LCDHT;
4284 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004285
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304286 if (pVBInfo->LCDResInfo == Panel1024x768) {
4287 tempax = 1024;
4288 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304290 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4291 if (pVBInfo->VGAVDE == 357)
4292 tempbx = 527;
4293 else if (pVBInfo->VGAVDE == 420)
4294 tempbx = 620;
4295 else if (pVBInfo->VGAVDE == 525)
4296 tempbx = 775;
4297 else if (pVBInfo->VGAVDE == 600)
4298 tempbx = 775;
4299 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4300 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4301 else
4302 tempbx = 768;
4303 } else
4304 tempbx = 768;
4305 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4306 tempax = 1024;
4307 tempbx = 768;
4308 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4309 tempax = 1280;
4310 if (pVBInfo->VGAVDE == 360)
4311 tempbx = 768;
4312 else if (pVBInfo->VGAVDE == 375)
4313 tempbx = 800;
4314 else if (pVBInfo->VGAVDE == 405)
4315 tempbx = 864;
4316 else
4317 tempbx = 1024;
4318 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4319 tempax = 1280;
4320 tempbx = 1024;
4321 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4322 tempax = 1280;
4323 if (pVBInfo->VGAVDE == 350)
4324 tempbx = 700;
4325 else if (pVBInfo->VGAVDE == 400)
4326 tempbx = 800;
4327 else if (pVBInfo->VGAVDE == 1024)
4328 tempbx = 960;
4329 else
4330 tempbx = 960;
4331 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4332 tempax = 1400;
4333 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304335 if (pVBInfo->VGAVDE == 1024) {
4336 tempax = 1280;
4337 tempbx = 1024;
4338 }
4339 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4340 tempax = 1600;
4341 tempbx = 1200; /* alan 10/14/2003 */
4342 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4343 if (pVBInfo->VGAVDE == 350)
4344 tempbx = 875;
4345 else if (pVBInfo->VGAVDE == 400)
4346 tempbx = 1000;
4347 }
4348 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304350 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4351 tempax = pVBInfo->VGAHDE;
4352 tempbx = pVBInfo->VGAVDE;
4353 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 pVBInfo->HDE = tempax;
4356 pVBInfo->VDE = tempbx;
4357 return;
4358 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304360 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4361 tempbx = 4;
4362 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4363 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4364 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004365
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304366 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4367 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4368 pVBInfo->VGAHT = TVPtr->VGAHT;
4369 pVBInfo->VGAVT = TVPtr->VGAVT;
4370 pVBInfo->HDE = TVPtr->TVHDE;
4371 pVBInfo->VDE = TVPtr->TVVDE;
4372 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4373 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304375 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4376 if (resinfo == 0x08)
4377 pVBInfo->NewFlickerMode = 0x40;
4378 else if (resinfo == 0x09)
4379 pVBInfo->NewFlickerMode = 0x40;
4380 else if (resinfo == 0x12)
4381 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004382
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304383 if (pVBInfo->VGAVDE == 350)
4384 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304386 tempax = ExtHiTVHT;
4387 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304389 if (pVBInfo->VBInfo & SetInSlaveMode) {
4390 if (pVBInfo->TVInfo & TVSimuMode) {
4391 tempax = StHiTVHT;
4392 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 if (!(modeflag & Charx8Dot)) {
4395 tempax = StHiTextTVHT;
4396 tempbx = StHiTextTVVT;
4397 }
4398 }
4399 }
4400 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4401 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4402 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4403 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4404 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304406 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4407 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4408 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4409 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4410 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4411 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4412 if (pVBInfo->TVInfo & NTSC1024x768)
4413 tempax = NTSC1024x768HT;
4414 }
4415 } else {
4416 tempax = PALHT;
4417 tempbx = PALVT;
4418 if (!(pVBInfo->TVInfo & SetPALTV)) {
4419 tempax = NTSCHT;
4420 tempbx = NTSCVT;
4421 if (pVBInfo->TVInfo & NTSC1024x768)
4422 tempax = NTSC1024x768HT;
4423 }
4424 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304426 pVBInfo->HT = tempax;
4427 pVBInfo->VT = tempbx;
4428 return;
4429 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004430}
4431
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004432static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304433 unsigned short RefreshRateTableIndex,
4434 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004435{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004436 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304438 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4439 pVBInfo);
4440 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4441 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004442
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304443 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4444 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004445 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4446 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4447 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304448 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004449 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4450 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304451 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004452
Aaro Koskinen8104e322011-03-13 12:26:22 +02004453 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304455 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004456 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304457 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004458 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004459}
4460
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004461static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4462 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004463{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004464 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4465 short index;
4466 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467
4468 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004469 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304470 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004471 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304472
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004473 index = (modeflag & ModeInfoFlag) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304474
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004475 if (index < 0)
4476 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304477
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004478 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304479}
4480
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004481static unsigned short XGI_GetOffset(unsigned short ModeNo,
4482 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304483 unsigned short RefreshRateTableIndex,
4484 struct xgi_hw_device_info *HwDeviceExtension,
4485 struct vb_device_info *pVBInfo)
4486{
4487 unsigned short temp, colordepth, modeinfo, index, infoflag,
4488 ColorDepth[] = { 0x01, 0x02, 0x04 };
4489
4490 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4491 if (ModeNo <= 0x14)
4492 infoflag = 0;
4493 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004494 infoflag = pVBInfo->
4495 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304496
4497 index = (modeinfo >> 8) & 0xFF;
4498
4499 temp = pVBInfo->ScreenOffset[index];
4500
4501 if (infoflag & InterlaceMode)
4502 temp = temp << 1;
4503
4504 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4505
4506 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4507 temp = ModeNo - 0x7C;
4508 colordepth = ColorDepth[temp];
4509 temp = 0x6B;
4510 if (infoflag & InterlaceMode)
4511 temp = temp << 1;
4512 return temp * colordepth;
4513 } else {
4514 return temp * colordepth;
4515 }
4516}
4517
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004518static void XGI_SetCRT2Offset(unsigned short ModeNo,
4519 unsigned short ModeIdIndex,
4520 unsigned short RefreshRateTableIndex,
4521 struct xgi_hw_device_info *HwDeviceExtension,
4522 struct vb_device_info *pVBInfo)
4523{
4524 unsigned short offset;
4525 unsigned char temp;
4526
4527 if (pVBInfo->VBInfo & SetInSlaveMode)
4528 return;
4529
4530 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4531 HwDeviceExtension, pVBInfo);
4532 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004533 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004534 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004535 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004536 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004537 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004538}
4539
Randy Dunlap89229672010-08-10 08:46:44 -07004540static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004541{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004542 /* threshold high ,disable auto threshold */
4543 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4544 /* threshold low default 04h */
4545 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004546}
4547
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004548static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 struct xgi_hw_device_info *HwDeviceExtension,
4550 unsigned short RefreshRateTableIndex,
4551 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004552{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004554
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304555 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004556 CRT1Index = pVBInfo->
4557 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304558 CRT1Index &= IndexMask;
4559 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4560 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004561
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304562 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4563 HwDeviceExtension, pVBInfo);
4564 XGI_SetCRT2FIFO(pVBInfo);
4565 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004566
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304567 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004568 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004569
Aaro Koskinen8104e322011-03-13 12:26:22 +02004570 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4571 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004572}
4573
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004574static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304575 struct xgi_hw_device_info *HwDeviceExtension,
4576 unsigned short RefreshRateTableIndex,
4577 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004578{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304579 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4580 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004581
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304582 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004583 CRT1Index = pVBInfo->
4584 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304585 CRT1Index &= IndexMask;
4586 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004587 }
4588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304589 if (ModeNo <= 0x13)
4590 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4591 else
4592 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304594 /* bainy change table name */
4595 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004596 /* BTVGA2HT 0x08,0x09 */
4597 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004598 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304599 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004600 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004601 /* BTVGA2HDEE 0x0A,0x0C */
4602 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004603 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304604 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4605 pushbx = pVBInfo->VGAHDE / 2 + 16;
4606 tempcx = tempcx >> 1;
4607 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4608 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304610 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4611 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004612 tempbx |= ((pVBInfo->
4613 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4614 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304615 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4616 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4617 tempcx &= 0x1F;
4618 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4619 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4620 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4621 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304623 tempbx += 4;
4624 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 if (tempcx > (pVBInfo->VGAHT / 2))
4627 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304629 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004630
Aaro Koskinen8104e322011-03-13 12:26:22 +02004631 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304632 } else {
4633 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004634 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304635 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004636 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004637 /* BTVGA2HDEE 0x0A,0x0C */
4638 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004639 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4641 pushbx = pVBInfo->VGAHDE + 16;
4642 tempcx = tempcx >> 1;
4643 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4644 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304646 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4647 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004648 tempbx |= ((pVBInfo->
4649 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4650 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304651 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4652 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4653 tempcx &= 0x1F;
4654 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4655 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4656 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4657 tempbx += 16;
4658 tempcx += 16;
4659 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004660
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661 if (tempcx > pVBInfo->VGAHT)
4662 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304664 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004665 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304666 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304668 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4669 tempbx = pushbx;
4670 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4671 tempax |= (tempbx & 0xFF00);
4672 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004673 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304674 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004675 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304676 tempcx = (pVBInfo->VGAVT - 1);
4677 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004678
Aaro Koskinen8104e322011-03-13 12:26:22 +02004679 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304680 tempbx = pVBInfo->VGAVDE - 1;
4681 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004682 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304683 temp = ((tempbx & 0xFF00) << 3) >> 8;
4684 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004685 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304687 tempax = pVBInfo->VGAVDE;
4688 tempbx = pVBInfo->VGAVDE;
4689 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004690 /* BTVGA2VRS 0x10,0x11 */
4691 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4692 /* BTVGA2VRE 0x11 */
4693 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304695 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4696 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4697 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304699 if (temp & 0x04)
4700 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304702 if (temp & 0x080)
4703 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304705 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004706
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304707 if (temp & 0x08)
4708 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004709
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4711 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4712 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004713
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304714 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004715 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 temp = ((tempbx & 0xFF00) >> 8) << 4;
4717 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004718 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304719 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304721 if (modeflag & DoubleScanMode)
4722 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004723
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304724 if (modeflag & HalfDCLK)
4725 tempax |= 0x40;
4726
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004727 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004728}
4729
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004730static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4731{
4732 unsigned long tempax, tempbx;
4733
4734 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4735 & 0xFFFF;
4736 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4737 tempax = (tempax * pVBInfo->HT) / tempbx;
4738
4739 return (unsigned short) tempax;
4740}
4741
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004742static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304743 struct xgi_hw_device_info *HwDeviceExtension,
4744 unsigned short RefreshRateTableIndex,
4745 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004746{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304747 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4748 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304750 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004751 /* si+St_ResInfo */
4752 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304753 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4754 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004755 /* si+Ext_ResInfo */
4756 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304757 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004758 CRT1Index = pVBInfo->
4759 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304760 CRT1Index &= IndexMask;
4761 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304763 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4764 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004765
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304766 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004767 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304768 /* if (modeflag & Charx8Dot) */
4769 /* tempcx = 0x08; */
4770 /* else */
4771 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304773 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4774 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304778 if (modeflag & HalfDCLK)
4779 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304781 tempax = (tempax / tempcx) - 1;
4782 tempbx |= ((tempax & 0x00FF) << 8);
4783 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004784 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304786 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304788 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4789 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4790 | VB_XGI302LV | VB_XGI301C)))
4791 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304793 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4794 if (pVBInfo->VBType & VB_XGI301LV) {
4795 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4796 if (resinfo == 7)
4797 temp -= 2;
4798 }
4799 } else if (resinfo == 7) {
4800 temp -= 2;
4801 }
4802 }
4803 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004804
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004805 /* 0x05 Horizontal Display Start */
4806 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
4807 /* 0x06 Horizontal Blank end */
4808 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304810 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4811 if (pVBInfo->VBInfo & SetCRT2ToTV)
4812 tempax = pVBInfo->VGAHT;
4813 else
4814 tempax = XGI_GetVGAHT2(pVBInfo);
4815 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304817 if (tempax >= pVBInfo->VGAHT)
4818 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004819
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 if (modeflag & HalfDCLK)
4821 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304823 tempax = (tempax / tempcx) - 5;
4824 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
4825 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4826 temp = (tempbx & 0x00FF) - 1;
4827 if (!(modeflag & HalfDCLK)) {
4828 temp -= 6;
4829 if (pVBInfo->TVInfo & TVSimuMode) {
4830 temp -= 4;
4831 if (ModeNo > 0x13)
4832 temp -= 10;
4833 }
4834 }
4835 } else {
4836 /* tempcx = tempbx & 0x00FF ; */
4837 tempbx = (tempbx & 0xFF00) >> 8;
4838 tempcx = (tempcx + tempbx) >> 1;
4839 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4842 temp -= 1;
4843 if (!(modeflag & HalfDCLK)) {
4844 if ((modeflag & Charx8Dot)) {
4845 temp += 4;
4846 if (pVBInfo->VGAHDE >= 800)
4847 temp -= 6;
4848 }
4849 }
4850 } else {
4851 if (!(modeflag & HalfDCLK)) {
4852 temp -= 4;
4853 if (pVBInfo->LCDResInfo != Panel1280x960) {
4854 if (pVBInfo->VGAHDE >= 800) {
4855 temp -= 7;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004856 if (pVBInfo->ModeType ==
4857 ModeEGA) {
4858 if (pVBInfo->VGAVDE ==
4859 1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304860 temp += 15;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004861 if (pVBInfo->LCDResInfo != Panel1280x1024) {
4862 temp +=
4863 7;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304864 }
4865 }
4866 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304868 if (pVBInfo->VGAHDE >= 1280) {
4869 if (pVBInfo->LCDResInfo
4870 != Panel1280x960) {
4871 if (pVBInfo->LCDInfo
4872 & LCDNonExpanding) {
4873 temp
4874 += 28;
4875 }
4876 }
4877 }
4878 }
4879 }
4880 }
4881 }
4882 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004883
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004884 /* 0x07 Horizontal Retrace Start */
4885 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4886 /* 0x08 Horizontal Retrace End */
4887 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004888
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304889 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4890 if (pVBInfo->TVInfo & TVSimuMode) {
4891 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4892 == 0x11) || (ModeNo == 0x13) || (ModeNo
4893 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004894 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
4895 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304896 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304898 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
4899 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004900 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304901 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004902 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304903 0x08, 0x61);
4904 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004905 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304906 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004907 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004909 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304910 0x0C, 0xF0);
4911 }
4912 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304914 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
4915 == 0x07)) {
4916 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004917 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304918 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004919 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304920 0x08, 0x00);
4921 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004922 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304923 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004924 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004926 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304927 0x0C, 0xF0);
4928 }
4929 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304931 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
4932 == 0x0D) || (ModeNo == 0x50)) {
4933 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004934 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304935 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004936 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304937 0x08, 0x03);
4938 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004939 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304940 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004941 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304942 0x08, 0x02);
4943 }
4944 }
4945 }
4946 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004947
Aaro Koskinen8104e322011-03-13 12:26:22 +02004948 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004949 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004950 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004951
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304952 tempbx = pVBInfo->VGAVT;
4953 push1 = tempbx;
4954 tempcx = 0x121;
4955 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304957 if (tempbx == 357)
4958 tempbx = 350;
4959 if (tempbx == 360)
4960 tempbx = 350;
4961 if (tempbx == 375)
4962 tempbx = 350;
4963 if (tempbx == 405)
4964 tempbx = 400;
4965 if (tempbx == 525)
4966 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304968 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304970 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4971 if (pVBInfo->LCDResInfo == Panel1024x768) {
4972 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4973 if (tempbx == 350)
4974 tempbx += 5;
4975 if (tempbx == 480)
4976 tempbx += 5;
4977 }
4978 }
4979 }
4980 tempbx--;
4981 temp = tempbx & 0x00FF;
4982 tempbx--;
4983 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004984 /* 0x10 vertical Blank Start */
4985 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304986 tempbx = push2;
4987 tempbx--;
4988 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004989 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304991 if (tempbx & 0x0100)
4992 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004993
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304994 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304996 if (modeflag & DoubleScanMode)
4997 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304999 if (tempbx & 0x0200)
5000 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305002 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005003 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305005 if (tempbx & 0x0400)
5006 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005007
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005008 /* 0x11 Vertival Blank End */
5009 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305010
5011 tempax = push1;
5012 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
5013 tempax = tempax >> 2;
5014 push1 = tempax; /* push ax */
5015
5016 if (resinfo != 0x09) {
5017 tempax = tempax << 1;
5018 tempbx += tempax;
5019 }
5020
5021 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5022 if (pVBInfo->VBType & VB_XGI301LV) {
5023 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5024 tempbx -= 10;
5025 } else {
5026 if (pVBInfo->TVInfo & TVSimuMode) {
5027 if (pVBInfo->TVInfo & SetPALTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005028 if (pVBInfo->VBType &
5029 VB_XGI301LV) {
5030 if (!(pVBInfo->TVInfo &
5031 (SetYPbPrMode525p |
5032 SetYPbPrMode750p |
5033 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305034 tempbx += 40;
5035 } else {
5036 tempbx += 40;
5037 }
5038 }
5039 }
5040 }
5041 } else {
5042 tempbx -= 10;
5043 }
5044 } else {
5045 if (pVBInfo->TVInfo & TVSimuMode) {
5046 if (pVBInfo->TVInfo & SetPALTV) {
5047 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005048 if (!(pVBInfo->TVInfo &
5049 (SetYPbPrMode525p |
5050 SetYPbPrMode750p |
5051 SetYPbPrMode1080i)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305052 tempbx += 40;
5053 } else {
5054 tempbx += 40;
5055 }
5056 }
5057 }
5058 }
5059 tempax = push1;
5060 tempax = tempax >> 2;
5061 tempax++;
5062 tempax += tempbx;
5063 push1 = tempax; /* push ax */
5064
5065 if ((pVBInfo->TVInfo & SetPALTV)) {
5066 if (tempbx <= 513) {
5067 if (tempax >= 513)
5068 tempbx = 513;
5069 }
5070 }
5071
5072 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005073 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305074 tempbx--;
5075 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005076 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305077
5078 if (tempbx & 0x0100)
5079 tempcx |= 0x0008;
5080
5081 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005082 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305083
5084 tempbx++;
5085
5086 if (tempbx & 0x0100)
5087 tempcx |= 0x0004;
5088
5089 if (tempbx & 0x0200)
5090 tempcx |= 0x0080;
5091
5092 if (tempbx & 0x0400)
5093 tempcx |= 0x0C00;
5094
5095 tempbx = push1; /* pop ax */
5096 temp = tempbx & 0x00FF;
5097 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005098 /* 0x0D vertical Retrace End */
5099 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305100
5101 if (tempbx & 0x0010)
5102 tempcx |= 0x2000;
5103
5104 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005105 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305106 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005107 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305108 tempax = modeflag;
5109 temp = (tempax & 0xFF00) >> 8;
5110
5111 temp = (temp >> 1) & 0x09;
5112
5113 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
5114 temp |= 0x01;
5115
Aaro Koskinen8104e322011-03-13 12:26:22 +02005116 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
5117 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
5118 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305119
5120 if (pVBInfo->LCDInfo & LCDRGB18Bit)
5121 temp = 0x80;
5122 else
5123 temp = 0x00;
5124
Aaro Koskinen8104e322011-03-13 12:26:22 +02005125 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305126
5127 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005128}
5129
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005130static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305131 unsigned short RefreshRateTableIndex,
5132 struct xgi_hw_device_info *HwDeviceExtension,
5133 struct vb_device_info *pVBInfo)
5134{
5135 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
5136 modeflag, resinfo, crt2crtc;
5137 unsigned char *TimingPoint;
5138
5139 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
5140
5141 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005142 /* si+St_ResInfo */
5143 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305144 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5145 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5146 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005147 /* si+Ext_ResInfo */
5148 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305149 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005150 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
5151 Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305152 }
5153
5154 tempax = 0;
5155
5156 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
5157 tempax |= 0x0800;
5158
5159 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5160 tempax |= 0x0400;
5161
5162 if (pVBInfo->VBInfo & SetCRT2ToSCART)
5163 tempax |= 0x0200;
5164
5165 if (!(pVBInfo->TVInfo & SetPALTV))
5166 tempax |= 0x1000;
5167
5168 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5169 tempax |= 0x0100;
5170
5171 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
5172 tempax &= 0xfe00;
5173
5174 tempax = (tempax & 0xff00) >> 8;
5175
Aaro Koskinen8104e322011-03-13 12:26:22 +02005176 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305177 TimingPoint = pVBInfo->NTSCTiming;
5178
5179 if (pVBInfo->TVInfo & SetPALTV)
5180 TimingPoint = pVBInfo->PALTiming;
5181
5182 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5183 TimingPoint = pVBInfo->HiTVExtTiming;
5184
5185 if (pVBInfo->VBInfo & SetInSlaveMode)
5186 TimingPoint = pVBInfo->HiTVSt2Timing;
5187
5188 if (pVBInfo->SetFlag & TVSimuMode)
5189 TimingPoint = pVBInfo->HiTVSt1Timing;
5190
5191 if (!(modeflag & Charx8Dot))
5192 TimingPoint = pVBInfo->HiTVTextTiming;
5193 }
5194
5195 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5196 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5197 TimingPoint = pVBInfo->YPbPr525iTiming;
5198
5199 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5200 TimingPoint = pVBInfo->YPbPr525pTiming;
5201
5202 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5203 TimingPoint = pVBInfo->YPbPr750pTiming;
5204 }
5205
5206 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005207 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305208
5209 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005210 /* di->temp2[j] */
5211 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305212
5213 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005214 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305215
5216 temp = pVBInfo->NewFlickerMode;
5217 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005218 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305219
5220 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5221 tempax = 950;
5222
5223 if (pVBInfo->TVInfo & SetPALTV)
5224 tempax = 520;
5225 else
5226 tempax = 440;
5227
5228 if (pVBInfo->VDE <= tempax) {
5229 tempax -= pVBInfo->VDE;
5230 tempax = tempax >> 2;
5231 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
5232 push1 = tempax;
5233 temp = (tempax & 0xFF00) >> 8;
5234 temp += (unsigned short) TimingPoint[0];
5235
5236 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5237 | VB_XGI302LV | VB_XGI301C)) {
5238 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5239 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5240 | SetCRT2ToYPbPr)) {
5241 tempcx = pVBInfo->VGAHDE;
5242 if (tempcx >= 1024) {
5243 temp = 0x17; /* NTSC */
5244 if (pVBInfo->TVInfo & SetPALTV)
5245 temp = 0x19; /* PAL */
5246 }
5247 }
5248 }
5249
Aaro Koskinen8104e322011-03-13 12:26:22 +02005250 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305251 tempax = push1;
5252 temp = (tempax & 0xFF00) >> 8;
5253 temp += TimingPoint[1];
5254
5255 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5256 | VB_XGI302LV | VB_XGI301C)) {
5257 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5258 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5259 | SetCRT2ToYPbPr))) {
5260 tempcx = pVBInfo->VGAHDE;
5261 if (tempcx >= 1024) {
5262 temp = 0x1D; /* NTSC */
5263 if (pVBInfo->TVInfo & SetPALTV)
5264 temp = 0x52; /* PAL */
5265 }
5266 }
5267 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005268 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305269 }
5270
5271 /* 301b */
5272 tempcx = pVBInfo->HT;
5273
5274 if (XGI_IsLCDDualLink(pVBInfo))
5275 tempcx = tempcx >> 1;
5276
5277 tempcx -= 2;
5278 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005279 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305280
5281 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005282 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305283
5284 tempcx = pVBInfo->HT >> 1;
5285 push1 = tempcx; /* push cx */
5286 tempcx += 7;
5287
5288 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5289 tempcx -= 4;
5290
5291 temp = tempcx & 0x00FF;
5292 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005293 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305294
5295 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5296 tempbx += tempcx;
5297 push2 = tempbx;
5298 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005299 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305300 temp = (tempbx & 0xFF00) >> 8;
5301 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005302 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305303
5304 tempbx = push2;
5305 tempbx = tempbx + 8;
5306 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5307 tempbx = tempbx - 4;
5308 tempcx = tempbx;
5309 }
5310
5311 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005312 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305313
5314 j += 2;
5315 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5316 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005317 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305318 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005319 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305320
5321 tempcx += 8;
5322 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5323 tempcx -= 4;
5324
5325 temp = tempcx & 0xFF;
5326 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005327 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305328
5329 tempcx = push1; /* pop cx */
5330 j += 2;
5331 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5332 tempcx -= temp;
5333 temp = tempcx & 0x00FF;
5334 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005335 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305336
5337 tempcx -= 11;
5338
5339 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5340 tempax = XGI_GetVGAHT2(pVBInfo);
5341 tempcx = tempax - 1;
5342 }
5343 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005344 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305345
5346 tempbx = pVBInfo->VDE;
5347
5348 if (pVBInfo->VGAVDE == 360)
5349 tempbx = 746;
5350 if (pVBInfo->VGAVDE == 375)
5351 tempbx = 746;
5352 if (pVBInfo->VGAVDE == 405)
5353 tempbx = 853;
5354
5355 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005356 if (pVBInfo->VBType &
5357 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5358 if (!(pVBInfo->TVInfo &
5359 (SetYPbPrMode525p | SetYPbPrMode750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305360 tempbx = tempbx >> 1;
5361 } else
5362 tempbx = tempbx >> 1;
5363 }
5364
5365 tempbx -= 2;
5366 temp = tempbx & 0x00FF;
5367
5368 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5369 if (pVBInfo->VBType & VB_XGI301LV) {
5370 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5371 if (pVBInfo->VBInfo & SetInSlaveMode) {
5372 if (ModeNo == 0x2f)
5373 temp += 1;
5374 }
5375 }
5376 } else {
5377 if (pVBInfo->VBInfo & SetInSlaveMode) {
5378 if (ModeNo == 0x2f)
5379 temp += 1;
5380 }
5381 }
5382 }
5383
Aaro Koskinen8104e322011-03-13 12:26:22 +02005384 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305385
5386 temp = (tempcx & 0xFF00) >> 8;
5387 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5388
5389 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5390 if (pVBInfo->VBType & VB_XGI301LV) {
5391 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5392 temp |= 0x10;
5393
5394 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5395 temp |= 0x20;
5396 }
5397 } else {
5398 temp |= 0x10;
5399 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5400 temp |= 0x20;
5401 }
5402 }
5403
Aaro Koskinen8104e322011-03-13 12:26:22 +02005404 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305405
5406 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5407 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5408 tempbx = pVBInfo->VDE;
5409 tempcx = tempbx - 2;
5410
5411 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5412 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5413 | SetYPbPrMode750p)))
5414 tempbx = tempbx >> 1;
5415 }
5416
5417 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5418 temp = 0;
5419 if (tempcx & 0x0400)
5420 temp |= 0x20;
5421
5422 if (tempbx & 0x0400)
5423 temp |= 0x40;
5424
Aaro Koskinen8104e322011-03-13 12:26:22 +02005425 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305426 }
5427
5428 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005429 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305430 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005431 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305432 }
5433
5434 tempbx = tempbx & 0x00FF;
5435
5436 if (!(modeflag & HalfDCLK)) {
5437 tempcx = pVBInfo->VGAHDE;
5438 if (tempcx >= pVBInfo->HDE) {
5439 tempbx |= 0x2000;
5440 tempax &= 0x00FF;
5441 }
5442 }
5443
5444 tempcx = 0x0101;
5445
5446 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5447 if (pVBInfo->VGAHDE >= 1024) {
5448 tempcx = 0x1920;
5449 if (pVBInfo->VGAHDE >= 1280) {
5450 tempcx = 0x1420;
5451 tempbx = tempbx & 0xDFFF;
5452 }
5453 }
5454 }
5455
5456 if (!(tempbx & 0x2000)) {
5457 if (modeflag & HalfDCLK)
5458 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5459
5460 push1 = tempbx;
5461 tempeax = pVBInfo->VGAHDE;
5462 tempebx = (tempcx & 0xFF00) >> 8;
5463 longtemp = tempeax * tempebx;
5464 tempecx = tempcx & 0x00FF;
5465 longtemp = longtemp / tempecx;
5466
5467 /* 301b */
5468 tempecx = 8 * 1024;
5469
5470 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5471 | VB_XGI302LV | VB_XGI301C)) {
5472 tempecx = tempecx * 8;
5473 }
5474
5475 longtemp = longtemp * tempecx;
5476 tempecx = pVBInfo->HDE;
5477 temp2 = longtemp % tempecx;
5478 tempeax = longtemp / tempecx;
5479 if (temp2 != 0)
5480 tempeax += 1;
5481
5482 tempax = (unsigned short) tempeax;
5483
5484 /* 301b */
5485 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5486 | VB_XGI302LV | VB_XGI301C)) {
5487 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5488 }
5489 /* end 301b */
5490
5491 tempbx = push1;
5492 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5493 | (tempbx & 0x00FF));
5494 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5495 | (tempax & 0x00FF));
5496 temp = (tempax & 0xFF00) >> 8;
5497 } else {
5498 temp = (tempax & 0x00FF) >> 8;
5499 }
5500
Aaro Koskinen8104e322011-03-13 12:26:22 +02005501 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305502 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005503 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305504 temp = tempcx & 0x00FF;
5505
5506 if (tempbx & 0x2000)
5507 temp = 0;
5508
5509 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5510 temp |= 0x18;
5511
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005512 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305513 if (pVBInfo->TVInfo & SetPALTV) {
5514 tempbx = 0x0382;
5515 tempcx = 0x007e;
5516 } else {
5517 tempbx = 0x0369;
5518 tempcx = 0x0061;
5519 }
5520
5521 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005522 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305523 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005524 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305525
5526 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5527 temp = temp << 2;
5528 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5529
5530 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5531 temp |= 0x10;
5532
5533 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5534 temp |= 0x20;
5535
5536 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5537 temp |= 0x60;
5538 }
5539
Aaro Koskinen8104e322011-03-13 12:26:22 +02005540 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005541 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005542 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305543
5544 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5545 if (pVBInfo->TVInfo & NTSC1024x768) {
5546 TimingPoint = XGI_NTSC1024AdjTime;
5547 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005548 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305549 TimingPoint[j]);
5550 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005551 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305552 }
5553 }
5554
5555 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5556 if (pVBInfo->VBType & VB_XGI301C) {
5557 if (pVBInfo->TVInfo & SetPALMTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005558 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305559 0x08); /* PALM Mode */
5560 }
5561
5562 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005563 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305564 0x01);
5565 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02005566 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305567
5568 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
Aaro Koskinendc505562011-03-13 12:26:26 +02005569 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305570 }
5571
5572 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5573 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005574 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305575 }
5576
5577 if (pVBInfo->VBInfo & SetCRT2ToTV)
5578 return;
5579}
5580
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005581static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305582 struct xgi_hw_device_info *HwDeviceExtension,
5583 unsigned short RefreshRateTableIndex,
5584 struct vb_device_info *pVBInfo)
5585{
5586 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5587 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5588
5589 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5590
5591 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005592 /* si+St_ResInfo */
5593 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305594 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5595 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005596 /* si+Ext_ResInfo */
5597 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305598 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005599 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5600 Ext_CRT1CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 CRT1Index &= IndexMask;
5602 }
5603
5604 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5605 return;
5606
5607 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5608
5609 if (XGI_IsLCDDualLink(pVBInfo))
5610 tempbx = tempbx >> 1;
5611
5612 tempbx -= 1;
5613 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005614 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305615 temp = (tempbx & 0xFF00) >> 8;
5616 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005617 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305618 temp = 0x01;
5619
5620 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5621 if (pVBInfo->ModeType == ModeEGA) {
5622 if (pVBInfo->VGAHDE >= 1024) {
5623 temp = 0x02;
5624 if (pVBInfo->LCDInfo & LCDVESATiming)
5625 temp = 0x01;
5626 }
5627 }
5628 }
5629
Aaro Koskinen8104e322011-03-13 12:26:22 +02005630 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305631 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5632 push1 = tempbx;
5633 tempbx--;
5634 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005635 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305636 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005637 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305638
5639 tempcx = pVBInfo->VT - 1;
5640 push2 = tempcx + 1;
5641 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005642 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305643 temp = (tempcx & 0xFF00) >> 8;
5644 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005645 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005646 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5647 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5648 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5649 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305650
5651 /* Customized LCDB Des no add */
5652 tempbx = 5;
5653 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5654 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5655 tempah = pVBInfo->LCDResInfo;
5656 tempah &= PanelResInfo;
5657
5658 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
5659 tempbx = 1024;
5660 tempcx = 768;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005661 } else if ((tempah == Panel1280x1024) ||
5662 (tempah == Panel1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305663 tempbx = 1280;
5664 tempcx = 1024;
5665 } else if (tempah == Panel1400x1050) {
5666 tempbx = 1400;
5667 tempcx = 1050;
5668 } else {
5669 tempbx = 1600;
5670 tempcx = 1200;
5671 }
5672
5673 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5674 tempbx = pVBInfo->HDE;
5675 tempcx = pVBInfo->VDE;
5676 }
5677
5678 pushbx = tempbx;
5679 tempax = pVBInfo->VT;
5680 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5681 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5682 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5683 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5684 tempbx = pVBInfo->LCDVDES;
5685 tempcx += tempbx;
5686
5687 if (tempcx >= tempax)
5688 tempcx -= tempax; /* lcdvdes */
5689
5690 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005691 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305692 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005693 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305694 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5695 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5696 tempah = tempch;
5697 tempah = tempah << 3;
5698 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005699 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305700
5701 /* getlcdsync() */
5702 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5703 tempcx = tempbx;
5704 tempax = pVBInfo->VT;
5705 tempbx = pVBInfo->LCDVRS;
5706
5707 /* if (SetLCD_Info & EnableScalingLCD) */
5708 tempcx += tempbx;
5709 if (tempcx >= tempax)
5710 tempcx -= tempax;
5711
5712 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005713 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305714 temp = (tempbx & 0xFF00) >> 8;
5715 temp = temp << 4;
5716 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005717 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305718 tempcx = pushbx;
5719 tempax = pVBInfo->HT;
5720 tempbx = pVBInfo->LCDHDES;
5721 tempbx &= 0x0FFF;
5722
5723 if (XGI_IsLCDDualLink(pVBInfo)) {
5724 tempax = tempax >> 1;
5725 tempbx = tempbx >> 1;
5726 tempcx = tempcx >> 1;
5727 }
5728
5729 if (pVBInfo->VBType & VB_XGI302LV)
5730 tempbx += 1;
5731
5732 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5733 tempbx += 1;
5734
5735 tempcx += tempbx;
5736
5737 if (tempcx >= tempax)
5738 tempcx -= tempax;
5739
5740 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005741 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005743 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305744 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005745 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305746 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005747 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305748
5749 /* getlcdsync() */
5750 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5751 tempcx = tempax;
5752 tempax = pVBInfo->HT;
5753 tempbx = pVBInfo->LCDHRS;
5754 /* if ( SetLCD_Info & EnableScalingLCD) */
5755 if (XGI_IsLCDDualLink(pVBInfo)) {
5756 tempax = tempax >> 1;
5757 tempbx = tempbx >> 1;
5758 tempcx = tempcx >> 1;
5759 }
5760
5761 if (pVBInfo->VBType & VB_XGI302LV)
5762 tempbx += 1;
5763
5764 tempcx += tempbx;
5765
5766 if (tempcx >= tempax)
5767 tempcx -= tempax;
5768
5769 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005770 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305771
5772 temp = (tempbx & 0xFF00) >> 8;
5773 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005774 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305775 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005776 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305777
5778 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5779 if (pVBInfo->VGAVDE == 525) {
5780 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5781 | VB_XGI301LV | VB_XGI302LV
5782 | VB_XGI301C)) {
5783 temp = 0xC6;
5784 } else
5785 temp = 0xC4;
5786
Aaro Koskinen8104e322011-03-13 12:26:22 +02005787 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5788 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 }
5790
5791 if (pVBInfo->VGAVDE == 420) {
5792 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5793 | VB_XGI301LV | VB_XGI302LV
5794 | VB_XGI301C)) {
5795 temp = 0x4F;
5796 } else
5797 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005798 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305799 }
5800 }
5801}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005802
5803/* --------------------------------------------------------------------- */
5804/* Function : XGI_GetTap4Ptr */
5805/* Input : */
5806/* Output : di -> Tap4 Reg. Setting Pointer */
5807/* Description : */
5808/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005809static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305810 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005811{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305812 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005813
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305814 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305816 if (tempcx == 0) {
5817 tempax = pVBInfo->VGAHDE;
5818 tempbx = pVBInfo->HDE;
5819 } else {
5820 tempax = pVBInfo->VGAVDE;
5821 tempbx = pVBInfo->VDE;
5822 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305824 if (tempax < tempbx)
5825 return &EnlargeTap4Timing[0];
5826 else if (tempax == tempbx)
5827 return &NoScaleTap4Timing[0]; /* 1:1 */
5828 else
5829 Tap4TimingPtr = NTSCTap4Timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305831 if (pVBInfo->TVInfo & SetPALTV)
5832 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305834 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5835 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5836 Tap4TimingPtr = YPbPr525iTap4Timing;
5837 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5838 Tap4TimingPtr = YPbPr525pTap4Timing;
5839 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5840 Tap4TimingPtr = YPbPr750pTap4Timing;
5841 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305843 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5844 Tap4TimingPtr = HiTVTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305846 i = 0;
5847 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5848 if (Tap4TimingPtr[i].DE == tempax)
5849 break;
5850 i++;
5851 }
5852 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005853}
5854
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005855static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005856{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305857 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005858
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305859 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305861 if (!(pVBInfo->VBType & VB_XGI301C))
5862 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005863
5864#ifndef Tap4
Aaro Koskinendc505562011-03-13 12:26:26 +02005865 xgifb_reg_and(pVBInfo->Part2Port, 0x4E, 0xEB); /* Disable Tap4 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005866#else /* Tap4 Setting */
5867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305868 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5869 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005870 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005871
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005872 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5873 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
5874 /* Set Vertical Scaling */
5875 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305876 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005877 xgifb_reg_set(pVBInfo->Part2Port,
5878 i,
5879 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305880 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005881
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005882 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
5883 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
5884 /* Enable V.Scaling */
5885 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305886 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005887 /* Enable H.Scaling */
5888 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005889#endif
5890}
5891
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005892static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305893 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005894{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305895 unsigned short i;
5896 unsigned char *tempdi;
5897 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305899 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005900 /* si+St_ResInfo */
5901 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305902 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005903 /* si+Ext_ResInfo */
5904 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005905
Aaro Koskinen8104e322011-03-13 12:26:22 +02005906 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305907 if (pVBInfo->TVInfo & SetPALTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005908 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5909 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305910 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005911 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5912 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305913 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005914
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305915 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5916 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005917
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305918 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005919 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5920 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
5921 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305922 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305924 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
5925 & SetCRT2ToYPbPr)) {
5926 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5927 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005928
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305929 tempdi = pVBInfo->HiTVGroup3Data;
5930 if (pVBInfo->SetFlag & TVSimuMode) {
5931 tempdi = pVBInfo->HiTVGroup3Simu;
5932 if (!(modeflag & Charx8Dot))
5933 tempdi = pVBInfo->HiTVGroup3Text;
5934 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005935
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305936 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5937 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305939 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5940 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305942 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005943 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305945 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
5946 if (pVBInfo->TVInfo & SetYPbPrMode525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005947 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305948 }
5949 }
5950 return;
5951} /* {end of XGI_SetGroup3} */
5952
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005953static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305954 unsigned short RefreshRateTableIndex,
5955 struct xgi_hw_device_info *HwDeviceExtension,
5956 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005957{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305958 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305960 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005961
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305962 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005963 /* si+St_ResInfo */
5964 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305965 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005966 /* si+Ext_ResInfo */
5967 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305969 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005970 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305972 tempbx = pVBInfo->RVBHCMAX;
5973 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005974 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305975 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
5976 tempcx = pVBInfo->VGAHT - 1;
5977 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005978 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005979
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305980 temp = ((tempcx & 0xFF00) >> 8) << 3;
5981 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305983 tempcx = pVBInfo->VGAVT - 1;
5984 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
5985 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305987 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005988 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305989 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005990 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005991 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305992 tempcx = pVBInfo->VBInfo;
5993 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305995 if (modeflag & HalfDCLK)
5996 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005997
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305998 if (XGI_IsLCDDualLink(pVBInfo))
5999 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306001 if (tempcx & SetCRT2ToHiVisionTV) {
6002 temp = 0;
6003 if (tempbx <= 1024)
6004 temp = 0xA0;
6005 if (tempbx == 1280)
6006 temp = 0xC0;
6007 } else if (tempcx & SetCRT2ToTV) {
6008 temp = 0xA0;
6009 if (tempbx <= 800)
6010 temp = 0x80;
6011 } else {
6012 temp = 0x80;
6013 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6014 temp = 0;
6015 if (tempbx > 800)
6016 temp = 0x60;
6017 }
6018 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306020 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
6021 temp = 0x00;
6022 if (pVBInfo->VGAHDE == 1280)
6023 temp = 0x40;
6024 if (pVBInfo->VGAHDE == 1024)
6025 temp = 0x20;
6026 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006027 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306029 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306031 if (tempcx & SetCRT2ToHiVisionTV) {
6032 if (!(temp & 0xE000))
6033 tempbx = tempbx >> 1;
6034 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306036 tempcx = pVBInfo->RVBHRS;
6037 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006038 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006039
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306040 tempeax = pVBInfo->VGAVDE;
6041 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006042
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306043 if (tempeax <= tempebx) {
6044 tempcx = (tempcx & (~0x4000));
6045 tempeax = pVBInfo->VGAVDE;
6046 } else {
6047 tempeax -= tempebx;
6048 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306050 templong = (tempeax * 256 * 1024) % tempebx;
6051 tempeax = (tempeax * 256 * 1024) / tempebx;
6052 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306054 if (templong != 0)
6055 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306057 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006058 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306060 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006061 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306062 tempbx = (unsigned short) (tempebx >> 16);
6063 temp = tempbx & 0x00FF;
6064 temp = temp << 4;
6065 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006066 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006067
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306068 /* 301b */
6069 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6070 | VB_XGI302LV | VB_XGI301C)) {
6071 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006072 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306073 tempax = pVBInfo->VGAHDE;
6074 if (modeflag & HalfDCLK)
6075 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006076
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306077 if (XGI_IsLCDDualLink(pVBInfo))
6078 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006079
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006080 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD)) ||
6081 ((pVBInfo->TVInfo&SetYPbPrMode525p) ||
6082 (pVBInfo->TVInfo&SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306083 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6084 if (tempax > 800)
6085 tempax -= 800;
6086 } else {
6087 if (pVBInfo->VGAHDE > 800) {
6088 if (pVBInfo->VGAHDE == 1024)
6089 tempax = (tempax * 25 / 32) - 1;
6090 else
6091 tempax = (tempax * 20 / 32) - 1;
6092 }
6093 }
6094 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306096 /*
6097 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6098 if (pVBInfo->VBType & VB_XGI301LV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006099 if (!(pVBInfo->TVInfo &
6100 (SetYPbPrMode525p |
6101 SetYPbPrMode750p |
6102 SetYPbPrMode1080i))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306103 if (pVBInfo->VGAHDE > 800) {
6104 if (pVBInfo->VGAHDE == 1024)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006105 tempax =(tempax * 25 /
6106 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306107 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006108 tempax = (tempax * 20 /
6109 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306110 }
6111 }
6112 } else {
6113 if (pVBInfo->VGAHDE > 800) {
6114 if (pVBInfo->VGAHDE == 1024)
6115 tempax = (tempax * 25 / 32) - 1;
6116 else
6117 tempax = (tempax * 20 / 32) - 1;
6118 }
6119 }
6120 }
6121 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306123 temp = (tempax & 0xFF00) >> 8;
6124 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006125 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306126 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006127 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306129 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6130 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006131 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006132
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306133 }
6134 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306136 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6137 if (!(pVBInfo->TVInfo & (NTSC1024x768
6138 | SetYPbPrMode525p | SetYPbPrMode750p
6139 | SetYPbPrMode1080i))) {
6140 temp |= 0x0001;
6141 if ((pVBInfo->VBInfo & SetInSlaveMode)
6142 && (!(pVBInfo->TVInfo
6143 & TVSimuMode)))
6144 temp &= (~0x0001);
6145 }
6146 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006147
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006148 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306149 tempbx = pVBInfo->HT;
6150 if (XGI_IsLCDDualLink(pVBInfo))
6151 tempbx = tempbx >> 1;
6152 tempbx = (tempbx >> 1) - 2;
6153 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006154 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306155 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006156 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306157 }
6158 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306160 if (pVBInfo->ISXPDOS == 0)
6161 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6162 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006163}
6164
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006165static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
6166{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006167 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006168}
6169
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006170static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306171 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006172{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306173 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306175 Pindex = pVBInfo->Part5Port;
6176 Pdata = pVBInfo->Part5Port + 1;
6177 if (pVBInfo->ModeType == ModeVGA) {
6178 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
6179 | CRT2DisplayFlag))) {
6180 XGINew_EnableCRT2(pVBInfo);
6181 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
6182 }
6183 }
6184 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006185}
6186
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006187static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306188 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006189{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006190 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006191}
6192
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006193static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306194 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006195{
6196
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006197 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006198}
6199
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006200/*----------------------------------------------------------------------------*/
6201/* input */
6202/* bl[5] : 1;LVDS signal on */
6203/* bl[1] : 1;LVDS backlight on */
6204/* bl[0] : 1:LVDS VDD on */
6205/* bh: 100000b : clear bit 5, to set bit5 */
6206/* 000010b : clear bit 1, to set bit1 */
6207/* 000001b : clear bit 0, to set bit0 */
6208/*----------------------------------------------------------------------------*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306209void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6210 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006211{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306212 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006213
Aaro Koskinen58839b02011-03-13 12:26:23 +02006214 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306215 tempbh &= 0x23;
6216 tempbl &= 0x23;
Aaro Koskinendc505562011-03-13 12:26:26 +02006217 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006218
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306219 if (tempbh & 0x20) {
6220 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006221
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006222 /* CR B4[1] */
6223 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006224
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306225 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006226
Aaro Koskinen58839b02011-03-13 12:26:23 +02006227 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006228
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306229 temp = XG21GPIODataTransfer(temp);
6230 temp &= ~tempbh;
6231 temp |= tempbl;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006232 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006233}
6234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306235void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6236 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006237{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306238 unsigned char CR4A, temp;
6239 unsigned short tempbh0, tempbl0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306241 tempbh0 = tempbh;
6242 tempbl0 = tempbl;
6243 tempbh0 &= 0x20;
6244 tempbl0 &= 0x20;
6245 tempbh0 >>= 3;
6246 tempbl0 >>= 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306248 if (tempbh & 0x20) {
6249 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006250
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006251 /* CR B4[1] */
6252 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006253
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306254 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006255 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006256
Aaro Koskinen58839b02011-03-13 12:26:23 +02006257 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306258 tempbh &= 0x03;
6259 tempbl &= 0x03;
6260 tempbh <<= 2;
6261 tempbl <<= 2; /* GPIOC,GPIOD */
Aaro Koskinendc505562011-03-13 12:26:26 +02006262 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006263 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006264}
6265
6266/* --------------------------------------------------------------------- */
Bill Pemberton80adad82010-06-17 13:10:51 -04006267unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006268{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306269 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006270
Aaro Koskinen58839b02011-03-13 12:26:23 +02006271 index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306272 if (index < sizeof(XGI21_LCDCapList)
6273 / sizeof(struct XGI21_LVDSCapStruct))
6274 return index;
6275 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006276}
6277
6278/* --------------------------------------------------------------------- */
6279/* Function : XGI_XG21SetPanelDelay */
6280/* Input : */
6281/* Output : */
6282/* Description : */
6283/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6284/* : bl : 2 ; T2 : the duration signal on and Vdd on */
6285/* : bl : 3 ; T3 : the duration between CPL off and signal off */
6286/* : bl : 4 ; T4 : the duration signal off and Vdd off */
6287/* --------------------------------------------------------------------- */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306288void XGI_XG21SetPanelDelay(unsigned short tempbl,
6289 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006290{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306291 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306293 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6294 if (tempbl == 1)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006295 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306297 if (tempbl == 2)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006298 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306300 if (tempbl == 3)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006301 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006302
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306303 if (tempbl == 4)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006304 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006305}
6306
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006307unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306308 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006309{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306310 unsigned short xres, yres, colordepth, modeflag, resindex,
6311 lvdstableindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306313 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6314 if (ModeNo <= 0x13) {
6315 xres = pVBInfo->StResInfo[resindex].HTotal;
6316 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006317 /* si+St_ResInfo */
6318 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306319 } else {
6320 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6321 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006322 /* si+St_ModeFlag */
6323 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306324 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306326 if (!(modeflag & Charx8Dot)) {
6327 xres /= 9;
6328 xres *= 8;
6329 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006330
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306331 if (ModeNo > 0x13) {
6332 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6333 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306335 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6336 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306338 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306340 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6341 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6342 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04006343
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306344 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6345 return 0;
6346
6347 if (ModeNo > 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006348 if ((xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6349 LVDSHDE)) ||
6350 (yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6351 LVDSVDE))) {
6352 colordepth = XGI_GetColorDepth(ModeNo,
6353 ModeIdIndex,
6354 pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306355 if (colordepth > 2)
6356 return 0;
6357
6358 }
6359 }
6360 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006361}
6362
Bill Pemberton80adad82010-06-17 13:10:51 -04006363void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006364{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306365 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006366
Aaro Koskinen58839b02011-03-13 12:26:23 +02006367 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306368 temp = (temp & 1) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006369 /* SR06[6] 18bit Dither */
6370 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
6371 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
6372 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006373
6374}
6375
Bill Pemberton80adad82010-06-17 13:10:51 -04006376void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006377{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306378 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006379
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006380 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
6381 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306382 temp = (temp & 3) << 6;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006383 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
6384 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
6385 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
6386 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006387
6388}
6389
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006390static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
6391 unsigned short ModeIdIndex,
6392 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006393{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306394 unsigned char temp, Miscdata;
6395 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6396 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6397 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6398 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306400 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006401
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006402 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6403 LVDS_Capability &
6404 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306405 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006406 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006407
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006408 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006409
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006410 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6411 LVDS_Capability & LCDPolarity);
6412 /* SR35[7] FP VSync polarity */
6413 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6414 /* SR30[5] FP HSync polarity */
6415 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306417 XGI_SetXG21FPBits(pVBInfo);
6418 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6419 if (ModeNo <= 0x13) {
6420 xres = pVBInfo->StResInfo[resindex].HTotal;
6421 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006422 /* si+St_ResInfo */
6423 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306424 } else {
6425 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6426 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006427 /* si+St_ModeFlag */
6428 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306429 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006430
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306431 if (!(modeflag & Charx8Dot))
6432 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306434 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306436 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6437 - xres) / 2;
6438 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6439 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006440
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306441 if (LVDSHBS > LVDSHT)
6442 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306444 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6445 if (LVDSHRS > LVDSHT)
6446 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306448 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6449 if (LVDSHRE > LVDSHT)
6450 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306452 LVDSHBE = LVDSHBS + LVDSHT
6453 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306455 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006456
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306457 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6458 - yres) / 2;
6459 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6460 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006461
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306462 if (LVDSVBS > LVDSVT)
6463 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006464
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306465 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6466 if (LVDSVRS > LVDSVT)
6467 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006468
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306469 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
6470 if (LVDSVRE > LVDSVT)
6471 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006472
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306473 LVDSVBE = LVDSVBS + LVDSVT
6474 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006475
Aaro Koskinen58839b02011-03-13 12:26:23 +02006476 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006477 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006478
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306479 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006480 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006481
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306482 /* HT SR0B[1:0] CR00 */
6483 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006484 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006485 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006486
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306487 /* HBS SR0B[5:4] CR02 */
6488 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006489 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006490 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006491
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306492 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6493 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006494 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6495 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6496 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306498 /* HRS SR0B[7:6] CR04 */
6499 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006500 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006501 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306503 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6504 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006505 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006506 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006507
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306508 /* HRE SR0C[2] CR05[4:0] */
6509 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006510 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6511 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006512
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306513 /* Panel HRE SR2F[7:2] */
6514 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006515 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006516
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306517 /* VT SR0A[0] CR07[5][0] CR06 */
6518 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006519 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6520 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6521 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006522 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306524 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6525 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006526 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6527 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6528 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006529 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306531 /* VBE SR0A[4] CR16 */
6532 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006533 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006534 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006535
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306536 /* VRS SR0A[3] CR7[7][2] CR10 */
6537 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006538 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6539 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6540 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006541 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006542
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306543 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006544 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03, (value & 0x600) >> 9);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006545 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006546 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006547
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306548 /* VRE SR0A[5] CR11[3:0] */
6549 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006550 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6551 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306553 /* Panel VRE SR3F[7:2] *//* SR3F[7] has to be 0, h/w bug */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006554 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306556 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006557
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006558 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006559 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006560 0x2B,
6561 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6562 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006563 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006564 0x2C,
6565 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6566 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306567 value += 0x10;
6568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306570 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006571 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006572 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006573 /* set data, panning = 0, shift left 1 dot*/
6574 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006575
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006576 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006577 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306578
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006579 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306580 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006581
6582}
6583
6584/* no shadow case */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006585static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
6586 unsigned short ModeIdIndex,
6587 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006588{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306589 unsigned char temp, Miscdata;
6590 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6591 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6592 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6593 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006594
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306595 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006596 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6597 LVDS_Capability &
6598 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306599 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006600 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006601
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006602 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006603
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006604 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6605 LVDS_Capability & LCDPolarity);
6606 /* SR35[7] FP VSync polarity */
6607 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6608 /* SR30[5] FP HSync polarity */
6609 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006610
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306611 XGI_SetXG27FPBits(pVBInfo);
6612 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6613 if (ModeNo <= 0x13) {
6614 xres = pVBInfo->StResInfo[resindex].HTotal;
6615 yres = pVBInfo->StResInfo[resindex].VTotal;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006616 /* si+St_ResInfo */
6617 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306618 } else {
6619 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6620 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006621 /* si+St_ModeFlag */
6622 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306623 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006624
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306625 if (!(modeflag & Charx8Dot))
6626 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306628 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306630 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6631 - xres) / 2;
6632 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6633 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006634
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306635 if (LVDSHBS > LVDSHT)
6636 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006637
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306638 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6639 if (LVDSHRS > LVDSHT)
6640 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306642 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6643 if (LVDSHRE > LVDSHT)
6644 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306646 LVDSHBE = LVDSHBS + LVDSHT
6647 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006648
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306649 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306651 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6652 - yres) / 2;
6653 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6654 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006655
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306656 if (LVDSVBS > LVDSVT)
6657 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006658
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306659 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6660 if (LVDSVRS > LVDSVT)
6661 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006662
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006663 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].
6664 LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306665 if (LVDSVRE > LVDSVT)
6666 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306668 LVDSVBE = LVDSVBS + LVDSVT
6669 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006670
Aaro Koskinen58839b02011-03-13 12:26:23 +02006671 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006672 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306674 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006675 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006676
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306677 /* HT SR0B[1:0] CR00 */
6678 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006679 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006680 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306682 /* HBS SR0B[5:4] CR02 */
6683 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006684 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006685 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306687 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6688 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006689 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6690 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6691 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306693 /* HRS SR0B[7:6] CR04 */
6694 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006695 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006696 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006697
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306698 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6699 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006700 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006701 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306703 /* HRE SR0C[2] CR05[4:0] */
6704 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006705 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6706 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306708 /* Panel HRE SR2F[7:2] */
6709 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006710 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306712 /* VT SR0A[0] CR07[5][0] CR06 */
6713 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006714 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6715 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6716 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006717 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306719 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6720 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006721 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6722 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6723 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006724 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306726 /* VBE SR0A[4] CR16 */
6727 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006728 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006729 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006730
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306731 /* VRS SR0A[3] CR7[7][2] CR10 */
6732 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006733 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6734 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6735 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006736 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006737
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306738 /* Panel VRS SR35[2:0] SR34[7:0] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006739 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006740 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306742 /* VRE SR0A[5] CR11[3:0] */
6743 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006744 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6745 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006746
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306747 /* Panel VRE SR3F[7:2] */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006748 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0xFC);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306750 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006751
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006752 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006753 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006754 0x2B,
6755 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6756 VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006757 xgifb_reg_set(pVBInfo->P3c4,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006758 0x2C,
6759 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6760 VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306761 value += 0x10;
6762 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306764 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006765 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006766 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006767 /* set data, panning = 0, shift left 1 dot*/
6768 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006769
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006770 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006771 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306772
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006773 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306774 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006775
6776}
6777
6778/* --------------------------------------------------------------------- */
6779/* Function : XGI_IsLCDON */
6780/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006781/* Output : 0 : Skip PSC Control */
6782/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006783/* Description : */
6784/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006785static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006786{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306787 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306789 tempax = pVBInfo->VBInfo;
6790 if (tempax & SetCRT2ToDualEdge)
6791 return 0;
6792 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
6793 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306795 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006796}
6797
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006798/* --------------------------------------------------------------------- */
6799/* Function : XGI_DisableChISLCD */
6800/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006801/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006802/* Description : */
6803/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006804static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006805{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306806 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306808 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006809 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006810
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306811 if (tempbx & (EnableChA | DisableChA)) {
6812 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6813 return 0;
6814 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306816 if (!(tempbx & (EnableChB | DisableChB)))
6817 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306819 if (tempah & 0x01) /* Chk LCDB Mode */
6820 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306822 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006823}
6824
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006825/* --------------------------------------------------------------------- */
6826/* Function : XGI_EnableChISLCD */
6827/* Input : */
6828/* Output : 0 -> Not LCD mode */
6829/* Description : */
6830/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006831static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006832{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306833 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306835 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006836 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306838 if (tempbx & (EnableChA | DisableChA)) {
6839 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6840 return 0;
6841 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306843 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006844 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306846 if (tempah & 0x01) /* Chk LCDB Mode */
6847 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006848
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306849 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006850}
6851
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306852void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
6853 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006854{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006855 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306857 if (pVBInfo->SetFlag == Win9xDOSMode)
6858 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306860 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6861 | VB_XGI302LV | VB_XGI301C)) {
6862 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006863 if (!(pVBInfo->VBInfo &
6864 (DisableCRT2Display | SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306865 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6866 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6867 tempah = 0x7F; /* Disable Channel A */
6868 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006869 /* Disable Channel B */
6870 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306872 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006873 /* force to disable Cahnnel */
6874 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306876 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006877 /* Force to disable Channel B */
6878 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306879 }
6880 }
6881 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006882
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006883 /* disable part4_1f */
6884 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006885
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306886 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6887 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
6888 || (XGI_DisableChISLCD(pVBInfo))
6889 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006890 /* LVDS Driver power down */
6891 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306892 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306894 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6895 & (DisableCRT2Display | SetCRT2ToLCDA
6896 | SetSimuScanMode))) {
6897 if (pVBInfo->SetFlag & GatingCRT)
6898 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
6899 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6900 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306902 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6903 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6904 & SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006905 /* Power down */
6906 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306907 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006908
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006909 /* disable TV as primary VGA swap */
6910 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306912 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02006913 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006914
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006915 if ((pVBInfo->SetFlag & DisableChB) ||
6916 (pVBInfo->VBInfo &
6917 (DisableCRT2Display | SetSimuScanMode)) ||
6918 ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) &&
6919 (pVBInfo->VBInfo &
6920 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
6921 /* BScreenOff=1 */
6922 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006923
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006924 if ((pVBInfo->SetFlag & DisableChB) ||
6925 (pVBInfo->VBInfo &
6926 (DisableCRT2Display | SetSimuScanMode)) ||
6927 (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) ||
6928 (pVBInfo->VBInfo &
6929 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
6930 /* save Part1 index 0 */
6931 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
6932 /* BTDAC = 1, avoid VB reset */
6933 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
6934 /* disable CRT2 */
6935 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6936 /* restore Part1 index 0 */
6937 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306938 }
6939 } else { /* {301} */
6940 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006941 /* BScreenOff=1 */
6942 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
6943 /* Disable CRT2 */
6944 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
6945 /* Disable TV asPrimary VGA swap */
6946 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306947 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006948
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306949 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
6950 | SetSimuScanMode))
6951 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6952 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006953}
6954
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006955/* --------------------------------------------------------------------- */
6956/* Function : XGI_GetTVPtrIndex */
6957/* Input : */
6958/* Output : */
6959/* Description : bx 0 : ExtNTSC */
6960/* 1 : StNTSC */
6961/* 2 : ExtPAL */
6962/* 3 : StPAL */
6963/* 4 : ExtHiTV */
6964/* 5 : StHiTV */
6965/* 6 : Ext525i */
6966/* 7 : St525i */
6967/* 8 : Ext525p */
6968/* 9 : St525p */
6969/* A : Ext750p */
6970/* B : St750p */
6971/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006972static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006973{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306974 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306976 if (pVBInfo->TVInfo & SetPALTV)
6977 tempbx = 2;
6978 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
6979 tempbx = 4;
6980 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6981 tempbx = 6;
6982 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6983 tempbx = 8;
6984 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6985 tempbx = 10;
6986 if (pVBInfo->TVInfo & TVSimuMode)
6987 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306989 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006990}
6991
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006992/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006993/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006994/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006995/* Output : bx 0 : NTSC */
6996/* 1 : PAL */
6997/* 2 : PALM */
6998/* 3 : PALN */
6999/* 4 : NTSC1024x768 */
7000/* 5 : PAL-M 1024x768 */
7001/* 6-7: reserved */
7002/* cl 0 : YFilter1 */
7003/* 1 : YFilter2 */
7004/* ch 0 : 301A */
7005/* 1 : 301B/302B/301LV/302LV */
7006/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007007/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007008static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
7009 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007010{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007011 *tempbx = 0;
7012 *tempcl = 0;
7013 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007014
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007015 if (pVBInfo->TVInfo & SetPALTV)
7016 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007017
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007018 if (pVBInfo->TVInfo & SetPALMTV)
7019 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007020
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007021 if (pVBInfo->TVInfo & SetPALNTV)
7022 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007023
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007024 if (pVBInfo->TVInfo & NTSC1024x768) {
7025 *tempbx = 4;
7026 if (pVBInfo->TVInfo & SetPALMTV)
7027 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307028 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007029
7030 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7031 | VB_XGI302LV | VB_XGI301C)) {
7032 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
7033 & TVSimuMode)) {
7034 *tempbx += 8;
7035 *tempcl += 1;
7036 }
7037 }
7038
7039 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7040 | VB_XGI302LV | VB_XGI301C))
7041 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007042}
7043
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007044static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007045{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307046 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307048 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307050 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7051 | VB_XGI302LV | VB_XGI301C)) {
7052 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
7053 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
7054 tempbl = 0;
7055 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307057 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
7058 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307060 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7061 | VB_XGI301LV | VB_XGI302LV
7062 | VB_XGI301C))
7063 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307065 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7066 tempbl = tempbl >> 4;
7067 /*
7068 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
7069 tempbl = CRT2Delay1; // Get CRT2 Delay
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007070 if (pVBInfo->VBType &
7071 (VB_XGI301B |
7072 VB_XGI302B |
7073 VB_XGI301LV |
7074 VB_XGI302LV |
7075 VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307076 tempbl = CRT2Delay2;
7077 */
7078 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007079 /* Get LCD Delay */
7080 index = XGI_GetLCDCapPtr(pVBInfo);
7081 tempbh = pVBInfo->LCDCapList[index].
7082 LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307084 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
7085 tempbl = tempbh;
7086 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007087
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307088 tempbl &= 0x0F;
7089 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02007090 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307092 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
7093 | SetCRT2ToTV)) { /* Channel B */
7094 tempah &= 0xF0;
7095 tempah |= tempbl;
7096 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007097
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307098 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
7099 tempah &= 0x0F;
7100 tempah |= tempbh;
7101 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007102 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307103 }
7104 } else if (pVBInfo->IF_DEF_LVDS == 1) {
7105 tempbl = 0;
7106 tempbh = 0;
7107 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007108 /* / Get LCD Delay */
7109 tempah = pVBInfo->LCDCapList[
7110 XGI_GetLCDCapPtr(pVBInfo)].
7111 LCD_DelayCompensation;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307112 tempah &= 0x0f;
7113 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007114 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307115 tempah);
7116 }
7117 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007118}
7119
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007120static void XGI_SetLCDCap_A(unsigned short tempcx,
7121 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007122{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307123 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007124
Aaro Koskinen58839b02011-03-13 12:26:23 +02007125 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307127 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007128 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007129 /* Enable Dither */
7130 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007131 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307132 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007133 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307134 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007135 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307136 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007137
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307138 /*
7139 if (tempcx & EnableLCD24bpp) { // 24bits
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007140 xgifb_reg_and_or(pVBInfo->Part1Port,
7141 0x19,
7142 0x0F,
7143 (unsigned short)(0x30 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007144 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307145 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007146 xgifb_reg_and_or(pVBInfo->Part1Port,
7147 0x19,
7148 0x0F,
7149 // Enable Dither
7150 (unsigned short)(0x20 | (tempcx&0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007151 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307152 }
7153 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007154}
7155
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007156/* --------------------------------------------------------------------- */
7157/* Function : XGI_SetLCDCap_B */
7158/* Input : cx -> LCD Capability */
7159/* Output : */
7160/* Description : */
7161/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007162static void XGI_SetLCDCap_B(unsigned short tempcx,
7163 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007164{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307165 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007166 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307167 (unsigned short) (((tempcx & 0x00ff) >> 6)
7168 | 0x0c));
7169 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007170 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307171 (unsigned short) (((tempcx & 0x00ff) >> 6)
7172 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007173}
7174
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007175static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007176{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307177 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307179 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007180
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007181 /* disable down spectrum D[4] */
7182 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307183 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007184 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307185 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007186
Aaro Koskinen8104e322011-03-13 12:26:22 +02007187 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307188 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007189 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307190 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007191 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307192 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007193 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307194 pVBInfo->LCDCapList[index].Spectrum_34);
7195 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007196 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007197}
7198
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007199static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
7200{
7201 unsigned short tempcx;
7202
7203 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
7204
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007205 if (pVBInfo->VBType &
7206 (VB_XGI301B |
7207 VB_XGI302B |
7208 VB_XGI301LV |
7209 VB_XGI302LV |
7210 VB_XGI301C)) { /* 301LV/302LV only */
7211 if (pVBInfo->VBType &
7212 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007213 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007214 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007215 (unsigned char) (tempcx & 0x1F));
7216 }
7217 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007218 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007219 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
7220 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
7221 | EnablePLLSPLOW)) >> 8));
7222 }
7223
7224 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7225 | VB_XGI302LV | VB_XGI301C)) {
7226 if (pVBInfo->VBInfo & SetCRT2ToLCD)
7227 XGI_SetLCDCap_B(tempcx, pVBInfo);
7228 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7229 XGI_SetLCDCap_A(tempcx, pVBInfo);
7230
7231 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7232 if (tempcx & EnableSpectrum)
7233 SetSpectrum(pVBInfo);
7234 }
7235 } else {
7236 /* LVDS,CH7017 */
7237 XGI_SetLCDCap_A(tempcx, pVBInfo);
7238 }
7239}
7240
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007241/* --------------------------------------------------------------------- */
7242/* Function : XGI_SetAntiFlicker */
7243/* Input : */
7244/* Output : */
7245/* Description : Set TV Customized Param. */
7246/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007247static void XGI_SetAntiFlicker(unsigned short ModeNo,
7248 unsigned short ModeIdIndex,
7249 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007250{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307251 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307253 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007254
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307255 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
7256 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007257
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307258 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7259 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007260
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307261 if (ModeNo <= 0x13)
7262 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
7263 else
7264 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307266 tempbx += index;
7267 tempah = TVAntiFlickList[tempbx];
7268 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007269
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007270 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007271}
7272
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007273static void XGI_SetEdgeEnhance(unsigned short ModeNo,
7274 unsigned short ModeIdIndex,
7275 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007276{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307277 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307279 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007280
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307281 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7282 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307284 if (ModeNo <= 0x13)
7285 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
7286 else
7287 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007288
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307289 tempbx += index;
7290 tempah = TVEdgeList[tempbx];
7291 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007292
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007293 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007294}
7295
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007296static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007297{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307298 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307300 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307302 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307304 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
7305 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007306
Aaro Koskinen8104e322011-03-13 12:26:22 +02007307 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307308 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007309 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307310 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007311 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307312 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007313 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307314 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007315}
7316
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007317static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307318 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007319{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307320 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007321
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307322 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307324 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007325
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307326 switch (tempbx) {
7327 case 0x00:
7328 case 0x04:
7329 filterPtr = NTSCYFilter1;
7330 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007331
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307332 case 0x01:
7333 filterPtr = PALYFilter1;
7334 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007335
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307336 case 0x02:
7337 case 0x05:
7338 case 0x0D:
7339 filterPtr = PALMYFilter1;
7340 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307342 case 0x03:
7343 filterPtr = PALNYFilter1;
7344 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007345
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307346 case 0x08:
7347 case 0x0C:
7348 filterPtr = NTSCYFilter2;
7349 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007350
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307351 case 0x0A:
7352 filterPtr = PALMYFilter2;
7353 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307355 case 0x0B:
7356 filterPtr = PALNYFilter2;
7357 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007358
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307359 case 0x09:
7360 filterPtr = PALYFilter2;
7361 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307363 default:
7364 return;
7365 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007366
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307367 if (ModeNo <= 0x13)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007368 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
7369 VB_StTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307370 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007371 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
7372 VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307374 if (tempcl == 0)
7375 index = tempal * 4;
7376 else
7377 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007378
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307379 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007380 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
7381 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
7382 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
7383 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307384 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007385 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
7386 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
7387 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
7388 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307389 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307391 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7392 | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007393 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
7394 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
7395 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307396 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007397}
7398
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007399/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007400/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007401/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007402/* Output : */
7403/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007404/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007405static void XGI_OEM310Setting(unsigned short ModeNo,
7406 unsigned short ModeIdIndex,
7407 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007408{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007409 if (pVBInfo->SetFlag & Win9xDOSMode)
7410 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007411
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007412 /* GetPart1IO(); */
7413 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007414
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007415 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
7416 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007417
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007418 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7419 /* GetPart2IO() */
7420 XGI_SetPhaseIncr(pVBInfo);
7421 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
7422 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007423
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007424 if (pVBInfo->VBType & VB_XGI301)
7425 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307426 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007427}
7428
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007429/* --------------------------------------------------------------------- */
7430/* Function : XGI_SetCRT2ModeRegs */
7431/* Input : */
7432/* Output : */
7433/* Description : Origin code for crt2group */
7434/* --------------------------------------------------------------------- */
Bill Pemberton82d6eb52010-06-17 13:10:46 -04007435void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307436 struct xgi_hw_device_info *HwDeviceExtension,
7437 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007438{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307439 unsigned short tempbl;
7440 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307442 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007443
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007444 /* // fix write part1 index 0 BTDRAM bit Bug
7445 * xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307446 tempah = 0;
7447 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007448 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307449 tempah &= ~0x10; /* BTRAMDAC */
7450 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307452 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7453 | SetCRT2ToLCD)) {
7454 tempah = 0x40; /* BTDRAM */
7455 if (ModeNo > 0x13) {
7456 tempcl = pVBInfo->ModeType;
7457 tempcl -= ModeVGA;
7458 if (tempcl >= 0) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007459 /* BT Color */
7460 tempah = (0x008 >> tempcl);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307461 if (tempah == 0)
7462 tempah = 1;
7463 tempah |= 0x040;
7464 }
7465 }
7466 if (pVBInfo->VBInfo & SetInSlaveMode)
7467 tempah ^= 0x50; /* BTDAC */
7468 }
7469 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007470
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307471 /* 0210 shampoo
7472 if (pVBInfo->VBInfo & DisableCRT2Display) {
7473 tempah = 0;
7474 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007475
Aaro Koskinen8104e322011-03-13 12:26:22 +02007476 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307477 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7478 tempcl = pVBInfo->ModeType;
7479 if (ModeNo > 0x13) {
7480 tempcl -= ModeVGA;
7481 if ((tempcl > 0) || (tempcl == 0)) {
7482 tempah=(0x008>>tempcl) ;
7483 if (tempah == 0)
7484 tempah = 1;
7485 tempah |= 0x040;
7486 }
7487 } else {
7488 tempah = 0x040;
7489 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007490
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307491 if (pVBInfo->VBInfo & SetInSlaveMode) {
7492 tempah = (tempah ^ 0x050);
7493 }
7494 }
7495 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007496
Aaro Koskinen8104e322011-03-13 12:26:22 +02007497 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307498 tempah = 0x08;
7499 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307501 if (pVBInfo->VBInfo & DisableCRT2Display) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007502 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307503 } else {
7504 tempah = 0x00;
7505 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007506
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307507 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7508 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007509 if ((pVBInfo->VBInfo & SetCRT2ToLCDA) &&
7510 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307511 tempbl &= 0xf7;
7512 tempah |= 0x01;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007513 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307514 tempbl, tempah);
7515 } else {
7516 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7517 tempbl &= 0xf7;
7518 tempah |= 0x01;
7519 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007520
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007521 if (pVBInfo->VBInfo &
7522 (SetCRT2ToRAMDAC |
7523 SetCRT2ToTV |
7524 SetCRT2ToLCD)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307525 tempbl &= 0xf8;
7526 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007527
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307528 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7529 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007530
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007531 if (!(pVBInfo->VBInfo &
7532 SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307533 tempah = tempah ^ 0x05;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007534 if (!(pVBInfo->VBInfo &
7535 SetCRT2ToLCD))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307536 tempah = tempah ^ 0x01;
7537 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007538
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007539 if (!(pVBInfo->VBInfo &
7540 SetCRT2ToDualEdge))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307541 tempah |= 0x08;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007542 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307543 0x2e, tempbl, tempah);
7544 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007545 xgifb_reg_and_or(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307546 0x2e, tempbl, tempah);
7547 }
7548 }
7549 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007550 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307551 tempah);
7552 }
7553 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007554
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307555 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7556 | SetCRT2ToLCDA)) {
7557 tempah &= (~0x08);
7558 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7559 & SetInSlaveMode))) {
7560 tempah |= 0x010;
7561 }
7562 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007563
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307564 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007565 /* if (!(pVBInfo->TVInfo &
7566 (SetYPbPrMode525p | SetYPbPrMode750p))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307567 tempah |= 0x020;
7568 if (ModeNo > 0x13) {
7569 if (pVBInfo->VBInfo & DriverMode)
7570 tempah = tempah ^ 0x20;
7571 }
7572 /* } */
7573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007574
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007575 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307576 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307578 if (pVBInfo->LCDInfo & SetLCDDualLink)
7579 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307581 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007582 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) &&
7583 (!(pVBInfo->TVInfo &
7584 (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307585 if (pVBInfo->TVInfo & RPLLDIV2XO)
7586 tempah |= 0x40;
7587 /* } */
7588 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007589
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307590 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7591 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7592 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007593
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307594 if (pVBInfo->LCDResInfo == Panel1280x960)
7595 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007596
Aaro Koskinen8104e322011-03-13 12:26:22 +02007597 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307598 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307600 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7601 | VB_XGI302LV | VB_XGI301C)) {
7602 tempah = 0;
7603 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307605 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7606 tempbl = 0xff;
7607 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7608 tempah |= 0x04; /* shampoo 0129 */
7609 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007610
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007611 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307612 tempah = 0x00;
7613 tempbl = 0xcf;
7614 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7615 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7616 tempah |= 0x30;
7617 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007618
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007619 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307620 tempah = 0;
7621 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307623 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7624 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7625 tempah |= 0xc0;
7626 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007627 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307628 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307630 tempah = 0;
7631 tempbl = 0x7f;
7632 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
7633 tempbl = 0xff;
7634 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
7635 tempah |= 0x80;
7636 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007637
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007638 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007639
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307640 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7641 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02007642 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
7643 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307644 }
7645 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007646}
7647
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007648static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307649 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007650{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307651 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307653 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307655 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7656 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007657
7658}
7659
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307660void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7661 struct vb_device_info *pVBInfo)
7662{
7663
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007664 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007665
7666}
7667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307668void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7669 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007670{
7671
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007672 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007673
7674}
7675
Bill Pemberton80adad82010-06-17 13:10:51 -04007676unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007677{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307678 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007679
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307680 if (pVBInfo->IF_DEF_LVDS == 1) {
7681 return 1;
7682 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02007683 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307684 if ((flag == 1) || (flag == 2))
7685 return 1; /* 301b */
7686 else
7687 return 0;
7688 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007689}
7690
Bill Pemberton80adad82010-06-17 13:10:51 -04007691void XGI_LongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007692{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307693 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007694
Aaro Koskinen58839b02011-03-13 12:26:23 +02007695 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007696
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307697 if (!(i & 0xC0)) {
7698 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007699 if (!(inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307700 break;
7701 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307703 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007704 if ((inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307705 break;
7706 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007707 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007708}
7709
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007710static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007711{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307712 unsigned short tempal, temp, i, j;
7713 return;
7714 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
7715 temp = 0;
7716 for (i = 0; i < 3; i++) {
7717 for (j = 0; j < 100; j++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007718 tempal = inb(pVBInfo->P3da);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307719 if (temp & 0x01) { /* VBWaitMode2 */
7720 if ((tempal & 0x08))
7721 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307723 if (!(tempal & 0x08))
7724 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307726 } else { /* VBWaitMode1 */
7727 if (!(tempal & 0x08))
7728 continue;
7729
7730 if ((tempal & 0x08))
7731 break;
7732 }
7733 }
7734 temp = temp ^ 0x01;
7735 }
7736 } else {
7737 XGI_LongWait(pVBInfo);
7738 }
7739 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007740}
7741
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007742unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
7743 unsigned short ModeNo, unsigned short ModeIdIndex,
7744 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007745{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007746 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
7747 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
7748 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007749
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007750 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007751
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007752 if (ModeNo <= 0x13)
7753 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7754 else
7755 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7756
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007757 if (ModeNo < 0x14)
7758 return 0xFFFF;
7759
Aaro Koskinen58839b02011-03-13 12:26:23 +02007760 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007761 index = index >> pVBInfo->SelectCRT2Rate;
7762 index &= 0x0F;
7763
7764 if (pVBInfo->LCDInfo & LCDNonExpanding)
7765 index = 0;
7766
7767 if (index > 0)
7768 index--;
7769
7770 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007771 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7772 if (pVBInfo->IF_DEF_LVDS == 0) {
7773 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7774 | VB_XGI301LV | VB_XGI302LV
7775 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007776 /* 301b */
7777 temp = LCDARefreshIndex[
7778 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007779 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007780 temp = LCDRefreshIndex[
7781 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007782
7783 if (index > temp)
7784 index = temp;
7785 } else {
7786 index = 0;
7787 }
7788 }
7789 }
7790
7791 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
7792 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
7793 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
7794 /*
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007795 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag &
7796 XG2xNotSupport) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007797 index++;
7798 }
7799 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007800 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
7801 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007802 index++;
7803 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007804 /* Alan 10/19/2007;
7805 * do the similar adjustment like XGISearchCRT1Rate() */
7806 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
7807 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007808 index++;
7809 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007810 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
7811 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007812 index++;
7813 }
7814 }
7815
7816 i = 0;
7817 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007818 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
7819 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007820 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007821 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
7822 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007823 temp &= ModeInfoFlag;
7824 if (temp < pVBInfo->ModeType)
7825 break;
7826 i++;
7827 index--;
7828
7829 } while (index != 0xFFFF);
7830 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7831 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08007832 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
7833 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007834 if (temp & InterlaceMode)
7835 i++;
7836 }
7837 }
7838 i--;
7839 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7840 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7841 RefreshRateTableIndex, &i, pVBInfo);
7842 }
7843 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007844}
7845
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007846static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307847 struct xgi_hw_device_info *HwDeviceExtension,
7848 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007849{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007850 unsigned short RefreshRateTableIndex;
7851 /* unsigned short temp ; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007852
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007853 /* pVBInfo->SelectCRT2Rate = 0; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007854
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007855 pVBInfo->SetFlag |= ProgrammingCRT2;
7856 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7857 ModeIdIndex, pVBInfo);
7858 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7859 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7860 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7861 HwDeviceExtension, pVBInfo);
7862 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7863 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007864}
7865
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007866unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
7867 struct xgi_hw_device_info *HwDeviceExtension,
7868 struct vb_device_info *pVBInfo)
7869{
7870 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7871
7872 tempbx = pVBInfo->VBInfo;
7873 pVBInfo->SetFlag |= ProgrammingCRT2;
7874 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7875 pVBInfo->SelectCRT2Rate = 4;
7876 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7877 ModeIdIndex, pVBInfo);
7878 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7879 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7880 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7881 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7882 RefreshRateTableIndex, pVBInfo);
7883 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7884 RefreshRateTableIndex, pVBInfo);
7885 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7886 RefreshRateTableIndex, pVBInfo);
7887 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7888 HwDeviceExtension, pVBInfo);
7889 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7890 RefreshRateTableIndex, pVBInfo);
7891 XGI_SetTap4Regs(pVBInfo);
7892 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7893 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7894 HwDeviceExtension, pVBInfo);
7895 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7896 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7897 XGI_AutoThreshold(pVBInfo);
7898 return 1;
7899}
7900
7901void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7902{
7903 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7904 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7905 0x05, 0x00 };
7906
7907 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7908
7909 unsigned char CR17, CR63, SR31;
7910 unsigned short temp;
7911 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7912
7913 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007914 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007915
7916 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007917 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02007918 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007919 pVBInfo->P3d4, 0x53) | 0x02));
7920
Aaro Koskinen58839b02011-03-13 12:26:23 +02007921 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
7922 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
7923 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007924
Aaro Koskinen8104e322011-03-13 12:26:22 +02007925 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7926 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007927
Aaro Koskinen58839b02011-03-13 12:26:23 +02007928 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007929 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007930
Aaro Koskinen58839b02011-03-13 12:26:23 +02007931 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007932 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007933
Aaro Koskinen58839b02011-03-13 12:26:23 +02007934 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007935 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02007936 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007937 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007938
Aaro Koskinen8104e322011-03-13 12:26:22 +02007939 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007940
7941 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007942 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007943
7944 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007945 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007946 CRTCData[i]);
7947
7948 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007949 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007950 CRTCData[i]);
7951
7952 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007953 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007954 CRTCData[i]);
7955
Aaro Koskinen8104e322011-03-13 12:26:22 +02007956 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007957 & 0xE0));
7958
Aaro Koskinen8104e322011-03-13 12:26:22 +02007959 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7960 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7961 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007962
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007963 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007964
7965 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007966 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
7967 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
7968 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007969 }
7970
7971 XGI_VBLongWait(pVBInfo);
7972 XGI_VBLongWait(pVBInfo);
7973 XGI_VBLongWait(pVBInfo);
7974
7975 mdelay(1);
7976
7977 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007978 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007979
7980 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007981 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007982 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02007983 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007984
7985 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007986 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007987
7988 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007989 outb(0, (pVBInfo->P3c8 + 1));
7990 outb(0, (pVBInfo->P3c8 + 1));
7991 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007992 }
7993
Aaro Koskinen8104e322011-03-13 12:26:22 +02007994 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
7995 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
7996 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007997
7998 /* [2004/05/11] Vicent */
Aaro Koskinen58839b02011-03-13 12:26:23 +02007999 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008000 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02008001 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008002}
8003
8004void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
8005 struct vb_device_info *pVBInfo)
8006{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02008007 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008008
8009 if (pVBInfo->SetFlag == Win9xDOSMode) {
8010 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8011 | VB_XGI302LV | VB_XGI301C)) {
8012 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8013 return;
8014 } else
8015 /* LVDS or CH7017 */
8016 return;
8017 }
8018
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008019 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8020 | VB_XGI302LV | VB_XGI301C)) {
8021 if (!(pVBInfo->SetFlag & DisableChA)) {
8022 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008023 /* Power on */
8024 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008025 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008026 /* SetCRT2ToLCDA ) */
8027 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
8028 /* Power on */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008029 xgifb_reg_set(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008030 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008031 }
8032 }
8033 }
8034
8035 if (!(pVBInfo->SetFlag & DisableChB)) {
8036 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
8037 & (SetCRT2ToLCD | SetCRT2ToTV
8038 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008039 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008040 pVBInfo->P3c4, 0x32);
8041 tempah &= 0xDF;
8042 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008043 if (!(pVBInfo->VBInfo &
8044 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008045 tempah |= 0x20;
8046 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02008047 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02008048 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008049
Aaro Koskinen58839b02011-03-13 12:26:23 +02008050 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008051 pVBInfo->Part1Port, 0x2E);
8052
8053 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008054 /* BVBDOENABLE = 1 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02008055 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008056 0x2E, 0x80);
8057 /* BScreenOFF = 0 */
8058 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008059 }
8060 }
8061
8062 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
8063 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008064 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008065 0x20); /* shampoo 0129 */
8066 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
8067 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008068 if (XGI_EnableChISLCD(pVBInfo) ||
8069 (pVBInfo->VBInfo &
8070 (SetCRT2ToLCD | SetCRT2ToLCDA)))
8071 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02008072 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008073 pVBInfo->Part4Port,
8074 0x2A,
8075 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008076 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008077 /* LVDS Driver power on */
8078 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008079 }
8080 }
8081
8082 tempah = 0x00;
8083
8084 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
8085 tempah = 0xc0;
8086
8087 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
8088 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008089 if (pVBInfo->VBInfo &
8090 SetCRT2ToDualEdge) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008091 tempah = tempah & 0x40;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008092 if (pVBInfo->VBInfo &
8093 SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008094 tempah = tempah ^ 0xC0;
8095
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008096 if (pVBInfo->SetFlag &
8097 DisableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008098 tempah &= 0xBF;
8099
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008100 if (pVBInfo->SetFlag &
8101 DisableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008102 tempah &= 0x7F;
8103
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008104 if (pVBInfo->SetFlag &
8105 EnableChB)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008106 tempah |= 0x40;
8107
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008108 if (pVBInfo->SetFlag &
8109 EnableChA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008110 tempah |= 0x80;
8111 }
8112 }
8113 }
8114 }
8115
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008116 /* EnablePart4_1F */
8117 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008118
8119 if (pVBInfo->SetFlag & Win9xDOSMode) {
8120 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8121 return;
8122 }
8123
8124 if (!(pVBInfo->SetFlag & DisableChA)) {
8125 XGI_VBLongWait(pVBInfo);
8126 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008127 XGI_DisableGatingCRT(HwDeviceExtension,
8128 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008129 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8130 XGI_VBLongWait(pVBInfo);
8131 }
8132 }
8133 } /* 301 */
8134 else { /* LVDS */
8135 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
8136 | SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008137 /* enable CRT2 */
8138 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008139
Aaro Koskinen58839b02011-03-13 12:26:23 +02008140 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008141 0x2E);
8142 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008143 /* BVBDOENABLE = 1 */
8144 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008145
Aaro Koskinendc505562011-03-13 12:26:26 +02008146 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008147 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8148 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008149}
8150
8151static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
8152 unsigned short ModeNo, unsigned short ModeIdIndex,
8153 struct vb_device_info *pVBInfo)
8154{
8155 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
8156
8157 unsigned short XGINew_P3cc = pVBInfo->P3cc;
8158
8159 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
8160 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
8161 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
8162 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
8163 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8164 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
8165 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
8166 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8167 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
8168 XGI_ClearExt1Regs(pVBInfo);
8169
8170 /* if (pVBInfo->IF_DEF_ExpLink) */
8171 if (HwDeviceExtension->jChipType == XG27) {
8172 if (pVBInfo->IF_DEF_LVDS == 0)
8173 XGI_SetDefaultVCLK(pVBInfo);
8174 }
8175
8176 temp = ~ProgrammingCRT2;
8177 pVBInfo->SetFlag &= temp;
8178 pVBInfo->SelectCRT2Rate = 0;
8179
8180 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8181 | VB_XGI302LV | VB_XGI301C)) {
8182 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
8183 | SetInSlaveMode)) {
8184 pVBInfo->SetFlag |= ProgrammingCRT2;
8185 }
8186 }
8187
8188 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8189 ModeIdIndex, pVBInfo);
8190 if (RefreshRateTableIndex != 0xFFFF) {
8191 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
8192 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8193 pVBInfo, HwDeviceExtension);
8194 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
8195 RefreshRateTableIndex, pVBInfo);
8196 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8197 HwDeviceExtension, pVBInfo);
8198 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
8199 RefreshRateTableIndex, pVBInfo);
8200 }
8201
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008202 if ((HwDeviceExtension->jChipType >= XG20) &&
8203 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008204 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008205 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
8206 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008207 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008208 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008209 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
8210 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008211 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8212 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008213 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008214 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008215 }
8216 }
8217
8218 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008219 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008220 if (temp & 0xA0) {
8221
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008222 /* Enable write GPIOF */
8223 /* xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); */
8224 /* P. DWN */
8225 /* xgifb_reg_and(pVBInfo->P3d4, 0x48, ~0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008226 /* XG21 CRT1 Timing */
8227 if (HwDeviceExtension->jChipType == XG27)
8228 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
8229 RefreshRateTableIndex, pVBInfo);
8230 else
8231 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
8232 RefreshRateTableIndex, pVBInfo);
8233
8234 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
8235 RefreshRateTableIndex);
8236
Aaro Koskinen105d8d02011-08-31 21:46:00 +03008237 xgifb_set_lcd(HwDeviceExtension->jChipType,
8238 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008239
8240 if (pVBInfo->IF_DEF_LVDS == 1) {
8241 if (HwDeviceExtension->jChipType == XG27)
8242 XGI_SetXG27LVDSPara(ModeNo,
8243 ModeIdIndex, pVBInfo);
8244 else
8245 XGI_SetXG21LVDSPara(ModeNo,
8246 ModeIdIndex, pVBInfo);
8247 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008248 /* P. ON */
8249 /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008250 }
8251 }
8252
8253 pVBInfo->SetFlag &= (~ProgrammingCRT2);
8254 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
8255 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
8256 RefreshRateTableIndex, pVBInfo);
8257
8258 /* XGI_LoadCharacter(); //dif ifdef TVFont */
8259
8260 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
8261 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
8262}
8263
8264unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
8265 unsigned short ModeNo)
8266{
8267 unsigned short ModeIdIndex;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008268 /* unsigned char *pVBInfo->FBAddr =
8269 HwDeviceExtension->pjVideoMemoryAddress; */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008270 struct vb_device_info VBINF;
8271 struct vb_device_info *pVBInfo = &VBINF;
8272 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
8273 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
8274 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008275 pVBInfo->IF_DEF_LCDA = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008276 pVBInfo->IF_DEF_VideoCapture = 0;
8277 pVBInfo->IF_DEF_ScaleLCD = 0;
8278 pVBInfo->IF_DEF_OEMUtil = 0;
8279 pVBInfo->IF_DEF_PWD = 0;
8280
8281 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
8282 pVBInfo->IF_DEF_YPbPr = 0;
8283 pVBInfo->IF_DEF_HiVision = 0;
8284 pVBInfo->IF_DEF_CRT2Monitor = 0;
8285 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008286 } else {
8287 pVBInfo->IF_DEF_YPbPr = 1;
8288 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02008289 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008290 }
8291
8292 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
8293 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
8294 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
8295 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
8296 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
8297 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
8298 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
8299 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
8300 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
8301 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
8302 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
8303 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
8304 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
8305 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
8306 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
8307 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
8308 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
8309 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
8310
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008311 /* for x86 Linux, XG21 LVDS */
8312 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008313 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008314 pVBInfo->IF_DEF_LVDS = 1;
8315 }
8316 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02008317 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
8318 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008319 pVBInfo->IF_DEF_LVDS = 1;
8320 }
8321 }
8322
8323 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
8324 XGI_GetVBType(pVBInfo);
8325
8326 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
8327 if (ModeNo & 0x80) {
8328 ModeNo = ModeNo & 0x7F;
8329 /* XGINew_flag_clearbuffer = 0; */
8330 }
8331 /* else {
8332 XGINew_flag_clearbuffer = 1;
8333 }
8334 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008335 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008336
8337 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
8338 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
8339
8340 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8341
8342 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
8343
8344 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8345 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
8346 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
8347 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
8348 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008349
8350 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
8351 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8352 ModeIdIndex, pVBInfo);
8353
8354 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8355 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8356 HwDeviceExtension, pVBInfo);
8357 }
8358 } else {
8359 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
8360 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8361 ModeIdIndex, pVBInfo);
8362 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8363 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8364 HwDeviceExtension,
8365 pVBInfo);
8366 }
8367 }
8368 }
8369
8370 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
8371 switch (HwDeviceExtension->ujVBChipID) {
8372 case VB_CHIP_301:
8373 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8374 pVBInfo); /*add for CRT2 */
8375 break;
8376
8377 case VB_CHIP_302:
8378 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8379 pVBInfo); /*add for CRT2 */
8380 break;
8381
8382 default:
8383 break;
8384 }
8385 }
8386
8387 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
8388 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
8389 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
8390 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
8391 } /* !XG20 */
8392 else {
8393 if (pVBInfo->IF_DEF_LVDS == 1)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008394 if (!XGI_XG21CheckLVDSMode(ModeNo,
8395 ModeIdIndex,
8396 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008397 return 0;
8398
8399 if (ModeNo <= 0x13) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008400 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
8401 St_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008402 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008403 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
8404 Ext_ModeFlag & ModeInfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008405 }
8406
8407 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03008408 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008409
8410 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
8411
8412 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
8413 pVBInfo);
8414
8415 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8416 /*
8417 if (HwDeviceExtension->jChipType == XG21)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02008418 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008419 */
8420 }
8421
8422 /*
8423 if (ModeNo <= 0x13) {
8424 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
8425 } else {
8426 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
8427 }
8428 pVBInfo->ModeType = modeflag&ModeInfoFlag;
8429 pVBInfo->SetFlag = 0x00;
8430 pVBInfo->VBInfo = DisableCRT2Display;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08008431 temp = XGINew_CheckMemorySize(HwDeviceExtension,
8432 ModeNo,
8433 ModeIdIndex,
8434 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008435
8436 if (temp == 0)
8437 return (0);
8438
8439 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
8440 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
8441 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8442 */
8443
8444 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
8445
8446 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8447 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
8448 }
8449
8450 return 1;
8451}