blob: 4cca02dc5ad054b49752b96b606acfeb479d4077 [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include <asm/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>
5#include <linux/version.h>
6#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#include "vb_def.h"
10#include "vgatypes.h"
11#include "vb_struct.h"
12#include "vb_util.h"
13#include "vb_table.h"
Aaro Koskinen5e60b972011-03-08 22:16:14 +020014#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020015
16
17#define IndexMask 0xff
18#ifndef XGI_MASK_DUAL_CHIP
19#define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */
20#endif
21
Randy Dunlap89229672010-08-10 08:46:44 -070022static unsigned short XGINew_MDA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040023 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,
27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
29 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
30 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031
Randy Dunlap89229672010-08-10 08:46:44 -070032static unsigned short XGINew_CGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040033 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,
37 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
38 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
39 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
40 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020041
Randy Dunlap89229672010-08-10 08:46:44 -070042static unsigned short XGINew_EGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040043 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
44 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
45 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
46 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
47 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
48 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
49 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
50 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020051
Randy Dunlap89229672010-08-10 08:46:44 -070052static unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040053 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
54 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
55 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
56 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
57 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
58 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
59 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
60 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
61 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
62 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020063
Bill Pemberton80adad82010-06-17 13:10:51 -040064void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020065{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053066 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
67 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
68 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
69 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
70 pVBInfo->XGINEWUB_CRT1Table
71 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020072
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053073 /* add for new UNIVGABIOS */
74 /* XGINew_UBLCDDataTable = (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
75 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020076
Aaro Koskinen06587332011-03-13 12:26:10 +020077 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
78 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053079 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
80 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
81 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
82 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
83 pVBInfo->ModeResInfo
84 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053086 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
87 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
88 pVBInfo->pSR07 = &XGI330_SR07;
89 pVBInfo->LCDResInfo = 0;
90 pVBInfo->LCDTypeInfo = 0;
91 pVBInfo->LCDInfo = 0;
92 pVBInfo->VBInfo = 0;
93 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053095 pVBInfo->SR15 = XGI340_SR13;
96 pVBInfo->CR40 = XGI340_cr41;
97 pVBInfo->SR25 = XGI330_sr25;
98 pVBInfo->pSR31 = &XGI330_sr31;
99 pVBInfo->pSR32 = &XGI330_sr32;
100 pVBInfo->CR6B = XGI340_CR6B;
101 pVBInfo->CR6E = XGI340_CR6E;
102 pVBInfo->CR6F = XGI340_CR6F;
103 pVBInfo->CR89 = XGI340_CR89;
104 pVBInfo->AGPReg = XGI340_AGPReg;
105 pVBInfo->SR16 = XGI340_SR16;
106 pVBInfo->pCRCF = &XG40_CRCF;
107 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 pVBInfo->CR49 = XGI330_CR49;
110 pVBInfo->pSR1F = &XGI330_SR1F;
111 pVBInfo->pSR21 = &XGI330_SR21;
112 pVBInfo->pSR22 = &XGI330_SR22;
113 pVBInfo->pSR23 = &XGI330_SR23;
114 pVBInfo->pSR24 = &XGI330_SR24;
115 pVBInfo->pSR33 = &XGI330_SR33;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530117 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
118 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
119 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
120 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
121 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
122 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
123 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
124 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
125 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
126 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530128 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
129 pVBInfo->PALTiming = XGI330_PALTiming;
130 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
131 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
132 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
133 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
134 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
135 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
136 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
137 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
138 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
139 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
140 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
141 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200142
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530143 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
144 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
145 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530147 pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC;
148 pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC;
149 pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL;
150 pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530152 /* 310 customization related */
153 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
154 pVBInfo->LCDCapList = XGI_LCDDLCapList;
155 else
156 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 if ((ChipType == XG21) || (ChipType == XG27))
159 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530161 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
162 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200163
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530164 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200165
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530166 if (ChipType >= XG20)
167 pVBInfo->pXGINew_CR97 = &XG20_CR97;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200168
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530169 if (ChipType == XG27) {
170 pVBInfo->MCLKData
171 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
172 pVBInfo->CR40 = XGI27_cr41;
173 pVBInfo->pXGINew_CR97 = &XG27_CR97;
174 pVBInfo->pSR36 = &XG27_SR36;
175 pVBInfo->pCR8F = &XG27_CR8F;
176 pVBInfo->pCRD0 = XG27_CRD0;
177 pVBInfo->pCRDE = XG27_CRDE;
178 pVBInfo->pSR40 = &XG27_SR40;
179 pVBInfo->pSR41 = &XG27_SR41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530183 if (ChipType >= XG20) {
184 pVBInfo->pDVOSetting = &XG21_DVOSetting;
185 pVBInfo->pCR2E = &XG21_CR2E;
186 pVBInfo->pCR2F = &XG21_CR2F;
187 pVBInfo->pCR46 = &XG21_CR46;
188 pVBInfo->pCR47 = &XG21_CR47;
189 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200190
191}
192
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200193static unsigned char XGI_GetModePtr(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530194 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200195{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530196 unsigned char index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530198 if (ModeNo <= 0x13)
199 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
200 else {
201 if (pVBInfo->ModeType <= 0x02)
202 index = 0x1B; /* 02 -> ModeEGA */
203 else
204 index = 0x0F;
205 }
206 return index; /* Get pVBInfo->StandTable index */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200207}
208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530209/*
210unsigned char XGI_SetBIOSData(unsigned short ModeNo, unsigned short ModeIdIndex) {
211 return (0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212}
213*/
214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530215/* unsigned char XGI_ClearBankRegs(unsigned short ModeNo, unsigned short ModeIdIndex) {
216 return( 0 ) ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200217}
218*/
219
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200220static void XGI_SetSeqRegs(unsigned short ModeNo, unsigned short StandTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530221 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200222{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530223 unsigned char tempah, SRdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200224
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530225 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530227 if (ModeNo <= 0x13)
228 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
229 else
230 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200231
Aaro Koskinen8104e322011-03-13 12:26:22 +0200232 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530233 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530235 i = SetCRT2ToLCDA;
236 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
237 tempah |= 0x01;
238 } else {
239 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
240 if (pVBInfo->VBInfo & SetInSlaveMode)
241 tempah |= 0x01;
242 }
243 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530245 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200246 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530248 for (i = 02; i <= 04; i++) {
249 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1]; /* Get SR2,3,4 from file */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200250 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530251 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200252}
253
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200254static void XGI_SetMiscRegs(unsigned short StandTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530255 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530257 unsigned char Miscdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200258
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530259 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC; /* Get Misc from file */
260 /*
261 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
262 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
263 Miscdata |= 0x0C;
264 }
265 }
266 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200267
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200268 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200269}
270
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200271static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530272 unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200273{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530274 unsigned char CRTCdata;
275 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530277 CRTCdata = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
278 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200279 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200280
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530281 for (i = 0; i <= 0x18; i++) {
282 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i]; /* Get CRTC from file */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200283 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530284 }
285 /*
286 if ((HwDeviceExtension->jChipType == XGI_630) && (HwDeviceExtension->jChipRevision == 0x30)) {
287 if (pVBInfo->VBInfo & SetInSlaveMode) {
288 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200289 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530290 }
291 }
292 }
293 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200294}
295
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200296static void XGI_SetATTRegs(unsigned short ModeNo, unsigned short StandTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530297 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200298{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530299 unsigned char ARdata;
300 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530302 if (ModeNo <= 0x13)
303 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
304 else
305 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530307 for (i = 0; i <= 0x13; i++) {
308 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
309 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
310 if (i == 0x13) {
311 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
312 ARdata = 0;
313 } else {
314 if (pVBInfo->VBInfo & (SetCRT2ToTV
315 | SetCRT2ToLCD)) {
316 if (pVBInfo->VBInfo
317 & SetInSlaveMode)
318 ARdata = 0;
319 }
320 }
321 }
322 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200324 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200325 outb(i, pVBInfo->P3c0); /* set index */
326 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530327 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200328
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200329 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200330 outb(0x14, pVBInfo->P3c0); /* set index */
331 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200332 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200333 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200334}
335
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200336static void XGI_SetGRCRegs(unsigned short StandTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200338{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530339 unsigned char GRdata;
340 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 for (i = 0; i <= 0x08; i++) {
343 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i]; /* Get GR from file */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200344 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200346
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530347 if (pVBInfo->ModeType > ModeVGA) {
348 GRdata = (unsigned char) XGINew_GetReg1(pVBInfo->P3ce, 0x05);
349 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200350 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530351 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200352}
353
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200354static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200355{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200357
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530358 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200359 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200360}
361
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200362static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200363{
364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530365 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200366 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
367 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530369 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200370 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
371 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530373 XGINew_SetRegAND(pVBInfo->P3c4, 0x31, ~0x30);
374 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200375}
376
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200377static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530378 unsigned short ModeIdIndex,
379 unsigned short RefreshRateTableIndex, unsigned short *i,
380 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200381{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530382 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200383
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530384 if (ModeNo <= 0x13)
385 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
386 else
387 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530389 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
390 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
391 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530393 if (pVBInfo->IF_DEF_LVDS == 0) {
394 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
395 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530397 if (pVBInfo->VBType & VB_XGI301C)
398 tempax |= SupportCRT2in301C;
399 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530401 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /* 301b */
402 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530404 if (pVBInfo->LCDResInfo != Panel1280x1024) {
405 if (pVBInfo->LCDResInfo != Panel1280x960) {
406 if (pVBInfo->LCDInfo & LCDNonExpanding) {
407 if (resinfo >= 9) {
408 tempax = 0;
409 return 0;
410 }
411 }
412 }
413 }
414 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200415
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530416 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
417 if ((pVBInfo->VBType & VB_XGI301LV)
418 && (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
419 tempax |= SupportYPbPr;
420 if (pVBInfo->VBInfo & SetInSlaveMode) {
421 if (resinfo == 4)
422 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200423
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530424 if (resinfo == 3)
425 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530427 if (resinfo > 7)
428 return 0;
429 }
430 } else {
431 tempax |= SupportHiVisionTV;
432 if (pVBInfo->VBInfo & SetInSlaveMode) {
433 if (resinfo == 4)
434 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530436 if (resinfo == 3) {
437 if (pVBInfo->SetFlag
438 & TVSimuMode)
439 return 0;
440 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530442 if (resinfo > 7)
443 return 0;
444 }
445 }
446 } else {
447 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
448 | SetCRT2ToSVIDEO | SetCRT2ToSCART
449 | SetCRT2ToYPbPr | SetCRT2ToHiVisionTV)) {
450 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200451
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530452 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
453 | VB_XGI301LV | VB_XGI302LV
454 | VB_XGI301C)) {
455 tempax |= SupportTV1024;
456 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530458 if (!(pVBInfo->VBInfo & SetPALTV)) {
459 if (modeflag & NoSupportSimuTV) {
460 if (pVBInfo->VBInfo
461 & SetInSlaveMode) {
462 if (!(pVBInfo->VBInfo
463 & SetNotSimuMode)) {
464 return 0;
465 }
466 }
467 }
468 }
469 }
470 }
471 } else { /* for LVDS */
472 if (pVBInfo->IF_DEF_CH7005 == 1) {
473 if (pVBInfo->VBInfo & SetCRT2ToTV)
474 tempax |= SupportCHTV;
475 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200476
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530477 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
478 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530480 if (resinfo > 0x08)
481 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200482
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530483 if (pVBInfo->LCDResInfo < Panel1024x768) {
484 if (resinfo > 0x07)
485 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200486
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530487 if (resinfo == 0x04)
488 return 0; /* 512x384 */
489 }
490 }
491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530493 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID == tempbx; (*i)--) {
494 infoflag
495 = pVBInfo->RefIndex[RefreshRateTableIndex
496 + (*i)].Ext_InfoFlag;
497 if (infoflag & tempax)
498 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200499
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530500 if ((*i) == 0)
501 break;
502 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200503
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530504 for ((*i) = 0;; (*i)++) {
505 infoflag
506 = pVBInfo->RefIndex[RefreshRateTableIndex
507 + (*i)].Ext_InfoFlag;
508 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
509 != tempbx) {
510 return 0;
511 }
512
513 if (infoflag & tempax)
514 return 1;
515 }
516 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517}
518
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200519static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530520 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200521{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530522 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530524 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8; /* di+0x00 */
525 sync &= 0xC0;
526 temp = 0x2F;
527 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200528 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200529}
530
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200531static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530532 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200533{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530534 unsigned char data, data1, pushax;
535 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200536
Aaro Koskinen8104e322011-03-13 12:26:22 +0200537 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
538 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530539 /* XGINew_SetRegANDOR(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200540
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530541 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11); /* unlock cr0-7 */
542 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200543 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530545 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200546 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200547
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530548 for (i = 0x01; i <= 0x04; i++) {
549 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200550 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530551 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530553 for (i = 0x05; i <= 0x06; i++) {
554 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200555 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530556 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200557
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530558 j = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
559 j &= 0x1F;
560 data = pVBInfo->TimingH[0].data[7];
561 data &= 0xE0;
562 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200563 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530565 if (HwDeviceExtension->jChipType >= XG20) {
566 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x04);
567 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200568 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530569 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x05);
570 data1 = data;
571 data1 &= 0xE0;
572 data &= 0x1F;
573 if (data == 0) {
574 pushax = data;
575 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4,
576 0x0c);
577 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200578 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530579 data = pushax;
580 }
581 data = data - 1;
582 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200583 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530584 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
585 data = data >> 5;
586 data = data + 3;
587 if (data > 7)
588 data = data - 7;
589 data = data << 5;
590 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0e, ~0xE0, data);
591 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200592}
593
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200594static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex, unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530595 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200596{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530597 unsigned char data;
598 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200599
Aaro Koskinen8104e322011-03-13 12:26:22 +0200600 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
601 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530602 /* XGINew_SetRegANDOR(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530604 for (i = 0x00; i <= 0x01; i++) {
605 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200606 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530607 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200608
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530609 for (i = 0x02; i <= 0x03; i++) {
610 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200611 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530612 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200613
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530614 for (i = 0x04; i <= 0x05; i++) {
615 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200616 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), 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 j = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x0a);
620 j &= 0xC0;
621 data = pVBInfo->TimingV[0].data[6];
622 data &= 0x3F;
623 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200624 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530626 data = pVBInfo->TimingV[0].data[6];
627 data &= 0x80;
628 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530630 if (ModeNo <= 0x13)
631 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
632 else
633 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200634
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530635 i &= DoubleScanMode;
636 if (i)
637 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530639 j = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x09);
640 j &= 0x5F;
641 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200642 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200643}
644
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200645static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
646 unsigned short RefreshRateTableIndex,
647 struct vb_device_info *pVBInfo,
648 struct xgi_hw_device_info *HwDeviceExtension)
649{
650 unsigned char index, data;
651 unsigned short i;
652
653 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */
654 index = index & IndexMask;
655
656 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
657 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200658 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200659
660 for (i = 0; i < 8; i++)
661 pVBInfo->TimingH[0].data[i]
662 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
663
664 for (i = 0; i < 7; i++)
665 pVBInfo->TimingV[0].data[i]
666 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
667
668 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
669
670 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
671
672 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200673 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200674}
675
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200676/* --------------------------------------------------------------------- */
677/* Function : XGI_SetXG21CRTC */
678/* Input : Stand or enhance CRTC table */
679/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
680/* Description : Set LCD timing */
681/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200682static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530683 unsigned short RefreshRateTableIndex,
684 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200685{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530686 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
687 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530689 if (ModeNo <= 0x13) {
690 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
691 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4]; /* CR04 HRS */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200692 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax); /* SR2E [7:0]->HRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530693 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5]; /* Tempbx: CR05 HRE */
694 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
695 Tempcx = Tempax;
696 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
697 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
698 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
699 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
700 Tempdx <<= 2; /* Tempdx << 2 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200701 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx); /* SR2F [7:2]->HRE */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530702 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530704 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16]; /* Tempax: CR16 VRS */
705 Tempbx = Tempax; /* Tempbx=Tempax */
706 Tempax &= 0x01; /* Tempax: VRS[0] */
707 XGINew_SetRegOR(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
708 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7]; /* Tempax: CR7 VRS */
709 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
710 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
711 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
712 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200713 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx); /* SR34[7:0]: VRS[8:1] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200714
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530715 Temp1 = Tempcx << 1; /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
716 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
717 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
718 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
719 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530721 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17]; /* CR16 VRE */
722 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
723 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
724 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
725 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
726 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
727 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
728 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
729 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
730 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
731 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
732 Temp1 >>= 9; /* [10:9]->[1:0] */
733 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
734 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
735 Tempax &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200736 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax); /* SR3F D[7:2]->VRE D[1:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530737 } else {
738 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
739 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3]; /* Tempax: CR4 HRS */
740 Tempcx = Tempax; /* Tempcx: HRS */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200741 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax); /* SR2E[7:0]->HRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530743 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
744 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
745 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
746 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
747 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530749 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
750 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530752 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
753 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
754 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
755 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530757 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
758 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200759
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530760 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
761 if (Tempax < Tempcx) /* HRE < HRS */
762 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530764 Temp2 &= 0xFF;
765 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
766 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
767 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
768 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200769 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax); /* SR2F D[7:2]->HRE, D[1:0]->HRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530770 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530772 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10]; /* CR10 VRS */
773 Tempbx = Tempax; /* Tempbx: VRS */
774 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
775 XGINew_SetRegOR(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
776 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9]; /* CR7[2][7] VRE */
777 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
778 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
779 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
780 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200781 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530783 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
784 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
785 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
786 Tempax &= 0x80;
787 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
788 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
789 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14]; /* Tempax: SRA */
790 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
791 Temp2 = Tempax;
792 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
793 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530795 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11]; /* Tempax: CR11 VRE */
796 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
797 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14]; /* Tempbx: SRA */
798 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
799 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
800 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
801 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
802 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530804 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
805 if (Tempax < Temp3) /* VRE < VRS */
806 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200807
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530808 Temp2 &= 0xFF;
809 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
810 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
811 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
812 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
813 Tempbx = (unsigned char) Temp1;
814 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
815 Tempax &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200816 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax); /* SR3F D[7:2]->VRE D[1:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530817 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200818}
819
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200820static void XGI_SetXG27CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530821 unsigned short RefreshRateTableIndex,
822 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200823{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400824 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530826 if (ModeNo <= 0x13) {
827 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
828 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4]; /* CR04 HRS */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200829 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax); /* SR2E [7:0]->HRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530830 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5]; /* Tempbx: CR05 HRE */
831 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
832 Tempcx = Tempax;
833 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
834 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
835 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
836 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
837 Tempdx <<= 2; /* Tempdx << 2 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200838 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx); /* SR2F [7:2]->HRE */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530839 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200840
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530841 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16]; /* Tempax: CR10 VRS */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200842 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530843 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
844 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7]; /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
845 Tempbx = Tempax; /* Tempbx=CR07 */
846 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
847 Tempax >>= 2;
848 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x01, Tempax); /* SR35 D[0]->VRS D[8] */
849 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
850 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200851
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530852 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17]; /* CR11 VRE */
853 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
854 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
855 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
856 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
857 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
858 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
859 Tempax = (unsigned char) Tempbx & 0xFF; /* Tempax[7:0]: VRE[7:0] */
860 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
861 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
862 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax); /* SR3F D[7:2]->VRE D[5:0] */
863 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x06, Tempcx); /* SR35 D[2:1]->VRS[10:9] */
864 } else {
865 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
866 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3]; /* Tempax: CR4 HRS */
867 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200868 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax); /* SR2E[7:0]->HRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530870 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
871 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
872 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200873
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530874 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
875 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
876 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200877
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530878 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
879 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
880 Tempax <<= 3; /* Tempax[5]: HRE[5] */
881 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530883 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
884 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200885
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530886 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3]; /* Tempax: CR4 HRS */
887 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
888 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
889 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200890
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530891 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
892 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
893 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
894 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200895 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax); /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530896 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530898 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10]; /* CR10 VRS */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200899 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS[7:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
902 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9]; /* CR7[7][2] VRS[9][8] */
903 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
904 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
905 Tempax >>= 2; /* Tempax[0]: VRS[8] */
906 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x01, Tempax); /* SR35[0]: VRS[8] */
907 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
908 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
909 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14]; /* Tempax: SR0A */
910 Tempax &= 0x08; /* SR0A[3] VRS[10] */
911 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530913 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11]; /* Tempax: CR11 VRE */
914 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
915 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14]; /* Tempbx: SR0A */
916 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
917 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
918 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
919 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
920 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
921 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200922
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530923 if (Tempbx <= Tempcx) /* VRE <= VRS */
924 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530926 Tempax = (Tempbx << 2) & 0xFF; /* Tempax: Tempax[7:0]; VRE[5:0]00 */
927 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax); /* SR3F[7:2]:VRE[5:0] */
928 Tempax = Tempcx >> 8;
929 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x07, Tempax); /* SR35[2:0]:VRS[10:8] */
930 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200931}
932
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200933/* --------------------------------------------------------------------- */
934/* Function : XGI_SetXG21LCD */
935/* Input : */
936/* Output : FCLK duty cycle, FCLK delay compensation */
937/* Description : All values set zero */
938/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200939static void XGI_SetXG21LCD(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530940 unsigned short RefreshRateTableIndex, unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200941{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400942 unsigned short Data, Temp, b3CC;
943 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530945 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200946
Aaro Koskinen8104e322011-03-13 12:26:22 +0200947 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
948 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
949 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
950 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530951 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200952 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
953 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
954 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
955 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530956 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530958 Temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530960 if (Temp & 0x01) {
961 XGINew_SetRegOR(pVBInfo->P3c4, 0x06, 0x40); /* 18 bits FP */
962 XGINew_SetRegOR(pVBInfo->P3c4, 0x09, 0x40);
963 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200964
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530965 XGINew_SetRegOR(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200966
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530967 XGINew_SetRegAND(pVBInfo->P3c4, 0x30, ~0x20);
968 XGINew_SetRegAND(pVBInfo->P3c4, 0x35, ~0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530970 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200971 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530972 if (b3CC & 0x40)
973 XGINew_SetRegOR(pVBInfo->P3c4, 0x30, 0x20); /* Hsync polarity */
974 if (b3CC & 0x80)
975 XGINew_SetRegOR(pVBInfo->P3c4, 0x35, 0x80); /* Vsync polarity */
976 } else {
977 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
978 if (Data & 0x4000)
979 XGINew_SetRegOR(pVBInfo->P3c4, 0x30, 0x20); /* Hsync polarity */
980 if (Data & 0x8000)
981 XGINew_SetRegOR(pVBInfo->P3c4, 0x35, 0x80); /* Vsync polarity */
982 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200983}
984
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200985static void XGI_SetXG27LCD(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530986 unsigned short RefreshRateTableIndex, unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200987{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530988 unsigned short Data, Temp, b3CC;
989 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530991 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200992
Aaro Koskinen8104e322011-03-13 12:26:22 +0200993 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
994 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
995 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
996 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200997
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 Temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37);
999 if ((Temp & 0x03) == 0) { /* dual 12 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001000 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
1001 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301002 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301004 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001005 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1006 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1007 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1008 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301009 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301011 XGI_SetXG27FPBits(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001012
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301013 XGINew_SetRegOR(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001014
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301015 XGINew_SetRegAND(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1016 XGINew_SetRegAND(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001017
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301018 if (ModeNo <= 0x13) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001019 b3CC = (unsigned char) inb(XGI_P3cc);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301020 if (b3CC & 0x40)
1021 XGINew_SetRegOR(pVBInfo->P3c4, 0x30, 0x20); /* Hsync polarity */
1022 if (b3CC & 0x80)
1023 XGINew_SetRegOR(pVBInfo->P3c4, 0x35, 0x80); /* Vsync polarity */
1024 } else {
1025 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1026 if (Data & 0x4000)
1027 XGINew_SetRegOR(pVBInfo->P3c4, 0x30, 0x20); /* Hsync polarity */
1028 if (Data & 0x8000)
1029 XGINew_SetRegOR(pVBInfo->P3c4, 0x35, 0x80); /* Vsync polarity */
1030 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001031}
1032
1033/* --------------------------------------------------------------------- */
1034/* Function : XGI_UpdateXG21CRTC */
1035/* Input : */
1036/* Output : CRT1 CRTC */
1037/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1038/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001039static void XGI_UpdateXG21CRTC(unsigned short ModeNo, struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301040 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001041{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301042 int i, index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001043
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301044 XGINew_SetRegAND(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
1045 if (ModeNo <= 0x13) {
1046 for (i = 0; i < 12; i++) {
1047 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1048 index = i;
1049 }
1050 } else {
1051 if (ModeNo == 0x2E
1052 && (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC
1053 == RES640x480x60))
1054 index = 12;
1055 else if (ModeNo == 0x2E
1056 && (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC
1057 == RES640x480x72))
1058 index = 13;
1059 else if (ModeNo == 0x2F)
1060 index = 14;
1061 else if (ModeNo == 0x50)
1062 index = 15;
1063 else if (ModeNo == 0x59)
1064 index = 16;
1065 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001066
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301067 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001068 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301069 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001070 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301071 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001072 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301073 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001074 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301075 pVBInfo->UpdateCRT1[index].CR16);
1076 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001077}
1078
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001079static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301080 unsigned short ModeNo, unsigned short ModeIdIndex,
1081 unsigned short RefreshRateTableIndex,
1082 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001083{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001084 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301086 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001087
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301088 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001089
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301090 if (ModeNo <= 0x13) {
1091 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1092 tempax = pVBInfo->StResInfo[resindex].HTotal;
1093 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1094 } else {
1095 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1096 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1097 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1098 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001099
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301100 if (modeflag & HalfDCLK)
1101 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001102
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301103 if (ModeNo > 0x13) {
1104 if (modeflag & HalfDCLK)
1105 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301107 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301109 if (temp & InterlaceMode)
1110 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301112 if (modeflag & DoubleScanMode)
1113 tempbx = tempbx << 1;
1114 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001115
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301116 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001117
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301118 /* if (!(modeflag & Charx8Dot)) */
1119 /* tempcx = 9; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301121 tempax /= tempcx;
1122 tempax -= 1;
1123 tempbx -= 1;
1124 tempcx = tempax;
1125 temp = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
1126 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
1127 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001128 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1129 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301130 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x0b, ~0x0c,
1131 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +02001132 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301133 tempax = 0;
1134 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301136 if (tempbx & 0x01)
1137 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 if (tempbx & 0x02)
1140 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301142 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x42, tempax);
1143 data = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x07);
1144 data &= 0xFF;
1145 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301147 if (tempbx & 0x04)
1148 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001149
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301150 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001151 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152}
1153
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001154unsigned short XGI_GetResInfo(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301155 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001156{
Bill Pemberton82d6eb52010-06-17 13:10:46 -04001157 unsigned short resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301159 if (ModeNo <= 0x13)
1160 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
1161 else
1162 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
1163 return resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001164}
1165
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001166static void XGI_SetCRT1Offset(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301167 unsigned short RefreshRateTableIndex,
1168 struct xgi_hw_device_info *HwDeviceExtension,
1169 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301171 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301173 /* GetOffset */
1174 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1175 temp = temp >> 8;
1176 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301178 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1179 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301181 if (temp2)
1182 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301184 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301186 switch (temp2) {
1187 case 0:
1188 temp2 = 1;
1189 break;
1190 case 1:
1191 temp2 = 2;
1192 break;
1193 case 2:
1194 temp2 = 4;
1195 break;
1196 case 3:
1197 temp2 = 4;
1198 break;
1199 case 4:
1200 temp2 = 6;
1201 break;
1202 case 5:
1203 temp2 = 8;
1204 break;
1205 default:
1206 break;
1207 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001208
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301209 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1210 temp = temp * temp2 + temp2 / 2;
1211 else
1212 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301214 /* SetOffset */
1215 DisplayUnit = temp;
1216 temp2 = temp;
1217 temp = temp >> 8; /* ah */
1218 temp &= 0x0F;
1219 i = XGINew_GetReg1(pVBInfo->P3c4, 0x0E);
1220 i &= 0xF0;
1221 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001222 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301224 temp = (unsigned char) temp2;
1225 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001226 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301228 /* SetDisplayUnit */
1229 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1230 temp2 &= InterlaceMode;
1231 if (temp2)
1232 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001233
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301234 DisplayUnit = DisplayUnit << 5;
1235 ah = (DisplayUnit & 0xff00) >> 8;
1236 al = DisplayUnit & 0x00ff;
1237 if (al == 0)
1238 ah += 1;
1239 else
1240 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301242 if (HwDeviceExtension->jChipType >= XG20)
1243 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1244 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001245
Aaro Koskinen8104e322011-03-13 12:26:22 +02001246 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247}
1248
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001249static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1250 unsigned short ModeIdIndex,
1251 unsigned short RefreshRateTableIndex,
1252 struct xgi_hw_device_info *HwDeviceExtension,
1253 struct vb_device_info *pVBInfo)
1254{
1255 unsigned short tempbx;
1256
1257 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2,
1258 VCLK65 + 2 };
1259 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5, VCLK108_2 + 5,
1260 VCLK108_2 + 5, VCLK108_2 + 5 };
1261 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
1262 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2,
1263 VCLK65 + 2 };
1264 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2,
1265 VCLK65 + 2 };
1266
1267 unsigned short CRT2Index, VCLKIndex;
1268 unsigned short modeflag, resinfo;
1269 unsigned char *CHTVVCLKPtr = NULL;
1270
1271 if (ModeNo <= 0x13) {
1272 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
1273 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1274 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1275 } else {
1276 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
1277 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1278 CRT2Index
1279 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1280 }
1281
1282 if (pVBInfo->IF_DEF_LVDS == 0) {
1283 CRT2Index = CRT2Index >> 6; /* for LCD */
1284 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1285 if (pVBInfo->LCDResInfo != Panel1024x768)
1286 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1287 else
1288 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1289 } else { /* for TV */
1290 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1291 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1292 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1293 VCLKIndex = HiTVVCLKDIV2;
1294
1295 VCLKIndex += 25;
1296
1297 } else {
1298 VCLKIndex = HiTVVCLK;
1299
1300 VCLKIndex += 25;
1301
1302 }
1303
1304 if (pVBInfo->SetFlag & TVSimuMode) {
1305 if (modeflag & Charx8Dot) {
1306 VCLKIndex
1307 = HiTVSimuVCLK;
1308
1309 VCLKIndex += 25;
1310
1311 } else {
1312 VCLKIndex
1313 = HiTVTextVCLK;
1314
1315 VCLKIndex += 25;
1316
1317 }
1318 }
1319
1320 if (pVBInfo->VBType & VB_XGI301LV) { /* 301lv */
1321 if (!(pVBInfo->VBExtInfo
1322 == VB_YPbPr1080i)) {
1323 VCLKIndex
1324 = YPbPr750pVCLK;
1325 if (!(pVBInfo->VBExtInfo
1326 == VB_YPbPr750p)) {
1327 VCLKIndex
1328 = YPbPr525pVCLK;
1329 if (!(pVBInfo->VBExtInfo
1330 == VB_YPbPr525p)) {
1331 VCLKIndex
1332 = YPbPr525iVCLK_2;
1333 if (!(pVBInfo->SetFlag
1334 & RPLLDIV2XO))
1335 VCLKIndex
1336 = YPbPr525iVCLK;
1337 }
1338 }
1339 }
1340 }
1341 } else {
1342 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1343 if (pVBInfo->SetFlag
1344 & RPLLDIV2XO) {
1345 VCLKIndex = TVVCLKDIV2;
1346
1347 VCLKIndex += 25;
1348
1349 } else {
1350 VCLKIndex = TVVCLK;
1351
1352 VCLKIndex += 25;
1353
1354 }
1355 }
1356 }
1357 } else { /* for CRT2 */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001358 VCLKIndex = (unsigned char) inb(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001359 (pVBInfo->P3ca + 0x02)); /* Port 3cch */
1360 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1361 if (ModeNo > 0x13) {
1362 VCLKIndex
1363 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; /* di+Ext_CRTVCLK */
1364 VCLKIndex &= IndexMask;
1365 }
1366 }
1367 }
1368 } else { /* LVDS */
1369 if (ModeNo <= 0x13)
1370 VCLKIndex = CRT2Index;
1371 else
1372 VCLKIndex = CRT2Index;
1373
1374 if (pVBInfo->IF_DEF_CH7005 == 1) {
1375 if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) {
1376 VCLKIndex &= 0x1f;
1377 tempbx = 0;
1378
1379 if (pVBInfo->VBInfo & SetPALTV)
1380 tempbx += 2;
1381
1382 if (pVBInfo->VBInfo & SetCHTVOverScan)
1383 tempbx += 1;
1384
1385 switch (tempbx) {
1386 case 0:
1387 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC;
1388 break;
1389 case 1:
1390 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC;
1391 break;
1392 case 2:
1393 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL;
1394 break;
1395 case 3:
1396 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL;
1397 break;
1398 default:
1399 break;
1400 }
1401
1402 VCLKIndex = CHTVVCLKPtr[VCLKIndex];
1403 }
1404 } else {
1405 VCLKIndex = VCLKIndex >> 6;
1406 if ((pVBInfo->LCDResInfo == Panel800x600)
1407 || (pVBInfo->LCDResInfo == Panel320x480))
1408 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
1409 else if ((pVBInfo->LCDResInfo == Panel1024x768)
1410 || (pVBInfo->LCDResInfo
1411 == Panel1024x768x75))
1412 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1413 else
1414 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
1415 }
1416 }
1417 /* VCLKIndex = VCLKIndex&IndexMask; */
1418
1419 return VCLKIndex;
1420}
1421
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001422static void XGI_SetCRT1VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301423 struct xgi_hw_device_info *HwDeviceExtension,
1424 unsigned short RefreshRateTableIndex,
1425 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001426{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001427 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301428 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001429
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301430 if (pVBInfo->IF_DEF_LVDS == 1) {
1431 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1432 data = XGINew_GetReg1(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001433 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1434 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301435 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001436 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301437 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001438 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301439 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1440 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1441 & SetCRT2ToLCDA)) {
1442 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1443 RefreshRateTableIndex, HwDeviceExtension,
1444 pVBInfo);
1445 data = XGINew_GetReg1(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001446 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301447 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001448 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301449 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001450 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1451 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301452 } else {
1453 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1454 data = XGINew_GetReg1(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001455 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1456 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301457 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001458 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301459 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001460 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301463 if (HwDeviceExtension->jChipType >= XG20) {
1464 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag & HalfDCLK) {
1465 data = XGINew_GetReg1(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001466 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301467 data = XGINew_GetReg1(pVBInfo->P3c4, 0x2C);
1468 index = data;
1469 index &= 0xE0;
1470 data &= 0x1F;
1471 data = data << 1;
1472 data += 1;
1473 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001474 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301475 }
1476 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001477}
1478
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001479static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301480 struct xgi_hw_device_info *HwDeviceExtension,
1481 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001482{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301483 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001484
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301485 data = XGINew_GetReg1(pVBInfo->P3c4, 0x3D);
1486 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001487 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001488
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301489 if (ModeNo > 0x13) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001490 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301491 data = XGINew_GetReg1(pVBInfo->P3c4, 0x09);
1492 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001493 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301494 data = XGINew_GetReg1(pVBInfo->P3c4, 0x3D);
1495 data |= 0x01;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001496 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301497 } else {
1498 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001499 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301500 data = XGINew_GetReg1(pVBInfo->P3c4, 0x09);
1501 data &= 0xC0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001502 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301503 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001504 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301505 data = XGINew_GetReg1(pVBInfo->P3c4, 0x09);
1506 data &= 0xF0;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001507 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301508 }
1509 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001510
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301511 if (HwDeviceExtension->jChipType == XG21)
1512 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001513}
1514
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001515static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1516 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1517 struct vb_device_info *pVBInfo)
1518{
1519 unsigned short data, data2 = 0;
1520 short VCLK;
1521
1522 unsigned char index;
1523
1524 if (ModeNo <= 0x13)
1525 VCLK = 0;
1526 else {
1527 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1528 index &= IndexMask;
1529 VCLK = pVBInfo->VCLKData[index].CLOCK;
1530 }
1531
1532 data = XGINew_GetReg1(pVBInfo->P3c4, 0x32);
1533 data &= 0xf3;
1534 if (VCLK >= 200)
1535 data |= 0x0c; /* VCLK > 200 */
1536
1537 if (HwDeviceExtension->jChipType >= XG20)
1538 data &= ~0x04; /* 2 pixel mode */
1539
Aaro Koskinen8104e322011-03-13 12:26:22 +02001540 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001541
1542 if (HwDeviceExtension->jChipType < XG20) {
1543 data = XGINew_GetReg1(pVBInfo->P3c4, 0x1F);
1544 data &= 0xE7;
1545 if (VCLK < 200)
1546 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001547 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001548 }
1549
1550 /* Jong for Adavantech LCD ripple issue
1551 if ((VCLK >= 0) && (VCLK < 135))
1552 data2 = 0x03;
1553 else if ((VCLK >= 135) && (VCLK < 160))
1554 data2 = 0x02;
1555 else if ((VCLK >= 160) && (VCLK < 260))
1556 data2 = 0x01;
1557 else if (VCLK > 260)
1558 data2 = 0x00;
1559 */
1560 data2 = 0x00;
1561
1562 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x07, 0xFC, data2);
1563 if (HwDeviceExtension->jChipType >= XG27)
1564 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
1565
1566}
1567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001568static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301569 unsigned short ModeNo, unsigned short ModeIdIndex,
1570 unsigned short RefreshRateTableIndex,
1571 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001572{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301573 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1574 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001575
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301576 if (ModeNo > 0x13) {
1577 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1578 infoflag
1579 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1580 } else
1581 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001582
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301583 if (XGINew_GetReg1(pVBInfo->P3d4, 0x31) & 0x01)
1584 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001585
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301586 if (ModeNo > 0x13)
1587 data = infoflag;
1588 else
1589 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301591 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301593 if (ModeNo > 0x13) {
1594 if (pVBInfo->ModeType > 0x02) {
1595 data2 |= 0x02;
1596 data3 = pVBInfo->ModeType - ModeVGA;
1597 data3 = data3 << 2;
1598 data2 |= data3;
1599 }
1600 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301602 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301604 if (data)
1605 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301607 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001608 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301609 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1610 if (ModeNo <= 0x13)
1611 xres = pVBInfo->StResInfo[resindex].HTotal;
1612 else
1613 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301615 data = 0x0000;
1616 if (infoflag & InterlaceMode) {
1617 if (xres == 1024)
1618 data = 0x0035;
1619 else if (xres == 1280)
1620 data = 0x0048;
1621 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301623 data2 = data & 0x00FF;
1624 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x19, 0xFF, data2);
1625 data2 = (data & 0xFF00) >> 8;
1626 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301628 if (modeflag & HalfDCLK)
1629 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001630
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301631 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301633 if (modeflag & LineCompareOff)
1634 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301636 if (ModeNo > 0x13) {
1637 if (pVBInfo->ModeType == ModeEGA)
1638 data2 |= 0x40;
1639 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301641 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0F, ~0x48, data2);
1642 data = 0x60;
1643 if (pVBInfo->ModeType != ModeText) {
1644 data = data ^ 0x60;
1645 if (pVBInfo->ModeType != ModeEGA)
1646 data = data ^ 0xA0;
1647 }
1648 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001649
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301650 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1651 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301653 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1654 /* if (XGINew_IF_DEF_NEW_LOWRES) */
1655 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex); //030305 fix lowresolution bug */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301657 data = XGINew_GetReg1(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001658
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301659 if (HwDeviceExtension->jChipType == XG27) {
1660 if (data & 0x40)
1661 data = 0x2c;
1662 else
1663 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001664 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301665 XGINew_SetRegOR(pVBInfo->P3d4, 0x51, 0x10);
1666 } else if (HwDeviceExtension->jChipType >= XG20) {
1667 if (data & 0x40)
1668 data = 0x33;
1669 else
1670 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001671 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1672 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301673 } else {
1674 if (data & 0x40)
1675 data = 0x2c;
1676 else
1677 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001678 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001680
1681}
1682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301683/*
1684void XGI_VesaLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001685{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301686 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301688 if (ModeNo > 0x13)
1689 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1690 else
1691 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301693 if (ModeNo > 0x13) {
1694 if (modeflag & DoubleScanMode) {
1695 if (modeflag & HalfDCLK) {
1696 if (pVBInfo->VBType & VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
1697 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
1698 if (pVBInfo->VBInfo & SetInSlaveMode) {
1699 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x01, 0xf7, 0x00);
1700 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0f, 0x7f, 0x00);
1701 return;
1702 }
1703 }
1704 }
1705 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0f, 0xff, 0x80);
1706 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x01, 0xf7, 0x00);
1707 return;
1708 }
1709 }
1710 }
1711 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0f, 0x7f, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001712}
1713*/
1714
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001715static void XGI_WriteDAC(unsigned short dl, unsigned short ah, unsigned short al,
1716 unsigned short dh, struct vb_device_info *pVBInfo)
1717{
1718 unsigned short temp, bh, bl;
1719
1720 bh = ah;
1721 bl = al;
1722
1723 if (dl != 0) {
1724 temp = bh;
1725 bh = dh;
1726 dh = temp;
1727 if (dl == 1) {
1728 temp = bl;
1729 bl = dh;
1730 dh = temp;
1731 } else {
1732 temp = bl;
1733 bl = bh;
1734 bh = temp;
1735 }
1736 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001737 outb((unsigned short) dh, pVBInfo->P3c9);
1738 outb((unsigned short) bh, pVBInfo->P3c9);
1739 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001740}
1741
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001742static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301743 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001744{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301745 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
1746 ah, dh, *table = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001747
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301748 if (ModeNo <= 0x13)
1749 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1750 else
1751 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301753 data &= DACInfoFlag;
1754 time = 64;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301756 if (data == 0x00)
1757 table = XGINew_MDA_DAC;
1758 else if (data == 0x08)
1759 table = XGINew_CGA_DAC;
1760 else if (data == 0x10)
1761 table = XGINew_EGA_DAC;
1762 else if (data == 0x18) {
1763 time = 256;
1764 table = XGINew_VGA_DAC;
1765 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301767 if (time == 256)
1768 j = 16;
1769 else
1770 j = time;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001771
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001772 outb(0xFF, pVBInfo->P3c6);
1773 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301775 for (i = 0; i < j; i++) {
1776 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301778 for (k = 0; k < 3; k++) {
1779 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301781 if (data & 0x01)
1782 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301784 if (data & 0x02)
1785 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001786
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001787 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301788 data = data >> 2;
1789 }
1790 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301792 if (time == 256) {
1793 for (i = 16; i < 32; i++) {
1794 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301796 for (k = 0; k < 3; k++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001797 outb(data, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301798 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001799
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301800 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301802 for (m = 0; m < 9; m++) {
1803 di = si;
1804 bx = si + 0x04;
1805 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301807 for (n = 0; n < 3; n++) {
1808 for (o = 0; o < 5; o++) {
1809 dh = table[si];
1810 ah = table[di];
1811 al = table[bx];
1812 si++;
1813 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1814 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301816 si -= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301818 for (o = 0; o < 3; o++) {
1819 dh = table[bx];
1820 ah = table[di];
1821 al = table[si];
1822 si--;
1823 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1824 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301826 dl++;
1827 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301829 si += 5;
1830 }
1831 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001832}
1833
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001834static void XGI_GetLVDSResInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301835 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001836{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301837 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301839 if (ModeNo <= 0x13)
1840 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
1841 else
1842 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301844 /* if (ModeNo > 0x13) */
1845 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1846 /* else */
1847 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001848
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301849 if (ModeNo <= 0x13)
1850 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
1851 else
1852 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301854 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301856 if (ModeNo <= 0x13) {
1857 xres = pVBInfo->StResInfo[resindex].HTotal;
1858 yres = pVBInfo->StResInfo[resindex].VTotal;
1859 } else {
1860 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1861 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1862 }
1863 if (ModeNo > 0x13) {
1864 if (modeflag & HalfDCLK)
1865 xres = xres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001866
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301867 if (modeflag & DoubleScanMode)
1868 yres = yres << 1;
1869 }
1870 /* if (modeflag & Charx8Dot) */
1871 /* { */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001872
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301873 if (xres == 720)
1874 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301876 /* } */
1877 pVBInfo->VGAHDE = xres;
1878 pVBInfo->HDE = xres;
1879 pVBInfo->VGAVDE = yres;
1880 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001881}
1882
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001883static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1884 unsigned short ModeIdIndex,
1885 unsigned short RefreshRateTableIndex,
1886 struct vb_device_info *pVBInfo)
1887{
1888 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1889
1890 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1891
1892 tempbx = BX;
1893
1894 if (ModeNo <= 0x13) {
1895 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1896 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1897 } else {
1898 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1899 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1900 }
1901
1902 tempal = tempal & 0x0f;
1903
1904 if (tempbx <= 1) { /* ExpLink */
1905 if (ModeNo <= 0x13) {
1906 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; /* find no Ext_CRT2CRTC2 */
1907 } else {
1908 tempal
1909 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1910 }
1911
1912 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
1913 if (ModeNo <= 0x13)
1914 tempal
1915 = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC2;
1916 else
1917 tempal
1918 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC2;
1919 }
1920
1921 if (tempbx & 0x01)
1922 tempal = (tempal >> 4);
1923
1924 tempal = (tempal & 0x0f);
1925 }
1926
1927 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
1928
1929 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
1930 if ((tempbx == 5) || (tempbx) == 7)
1931 tempcx = LCDDesDataLen2;
1932 else if ((tempbx == 3) || (tempbx == 8))
1933 tempcx = LVDSDesDataLen2;
1934 }
1935 /* mov di, word ptr cs:LCDDataList[bx] */
1936 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] | (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
1937
1938 switch (tempbx) {
1939 case 0:
1940 tempdi = XGI_EPLLCDCRT1Ptr_H;
1941 break;
1942 case 1:
1943 tempdi = XGI_EPLLCDCRT1Ptr_V;
1944 break;
1945 case 2:
1946 tempdi = XGI_EPLLCDDataPtr;
1947 break;
1948 case 3:
1949 tempdi = XGI_EPLLCDDesDataPtr;
1950 break;
1951 case 4:
1952 tempdi = XGI_LCDDataTable;
1953 break;
1954 case 5:
1955 tempdi = XGI_LCDDesDataTable;
1956 break;
1957 case 6:
1958 tempdi = XGI_EPLCHLCDRegPtr;
1959 break;
1960 case 7:
1961 case 8:
1962 case 9:
1963 tempdi = NULL;
1964 break;
1965 default:
1966 break;
1967 }
1968
1969 if (tempdi == NULL) /* OEMUtil */
1970 return NULL;
1971
1972 table = tempbx;
1973 i = 0;
1974
1975 while (tempdi[i].PANELID != 0xff) {
1976 tempdx = pVBInfo->LCDResInfo;
1977 if (tempbx & 0x0080) { /* OEMUtil */
1978 tempbx &= (~0x0080);
1979 tempdx = pVBInfo->LCDTypeInfo;
1980 }
1981
1982 if (pVBInfo->LCDInfo & EnableScalingLCD)
1983 tempdx &= (~PanelResInfo);
1984
1985 if (tempdi[i].PANELID == tempdx) {
1986 tempbx = tempdi[i].MASK;
1987 tempdx = pVBInfo->LCDInfo;
1988
1989 if (ModeNo <= 0x13) /* alan 09/10/2003 */
1990 tempdx |= SetLCDStdMode;
1991
1992 if (modeflag & HalfDCLK)
1993 tempdx |= SetLCDLowResolution;
1994
1995 tempbx &= tempdx;
1996 if (tempbx == tempdi[i].CAP)
1997 break;
1998 }
1999 i++;
2000 }
2001
2002 if (table == 0) {
2003 switch (tempdi[i].DATAPTR) {
2004 case 0:
2005 return &XGI_LVDSCRT11024x768_1_H[tempal];
2006 break;
2007 case 1:
2008 return &XGI_LVDSCRT11024x768_2_H[tempal];
2009 break;
2010 case 2:
2011 return &XGI_LVDSCRT11280x1024_1_H[tempal];
2012 break;
2013 case 3:
2014 return &XGI_LVDSCRT11280x1024_2_H[tempal];
2015 break;
2016 case 4:
2017 return &XGI_LVDSCRT11400x1050_1_H[tempal];
2018 break;
2019 case 5:
2020 return &XGI_LVDSCRT11400x1050_2_H[tempal];
2021 break;
2022 case 6:
2023 return &XGI_LVDSCRT11600x1200_1_H[tempal];
2024 break;
2025 case 7:
2026 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
2027 break;
2028 case 8:
2029 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
2030 break;
2031 case 9:
2032 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
2033 break;
2034 case 10:
2035 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
2036 break;
2037 default:
2038 break;
2039 }
2040 } else if (table == 1) {
2041 switch (tempdi[i].DATAPTR) {
2042 case 0:
2043 return &XGI_LVDSCRT11024x768_1_V[tempal];
2044 break;
2045 case 1:
2046 return &XGI_LVDSCRT11024x768_2_V[tempal];
2047 break;
2048 case 2:
2049 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2050 break;
2051 case 3:
2052 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2053 break;
2054 case 4:
2055 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2056 break;
2057 case 5:
2058 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2059 break;
2060 case 6:
2061 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2062 break;
2063 case 7:
2064 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2065 break;
2066 case 8:
2067 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2068 break;
2069 case 9:
2070 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2071 break;
2072 case 10:
2073 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2074 break;
2075 default:
2076 break;
2077 }
2078 } else if (table == 2) {
2079 switch (tempdi[i].DATAPTR) {
2080 case 0:
2081 return &XGI_LVDS1024x768Data_1[tempal];
2082 break;
2083 case 1:
2084 return &XGI_LVDS1024x768Data_2[tempal];
2085 break;
2086 case 2:
2087 return &XGI_LVDS1280x1024Data_1[tempal];
2088 break;
2089 case 3:
2090 return &XGI_LVDS1280x1024Data_2[tempal];
2091 break;
2092 case 4:
2093 return &XGI_LVDS1400x1050Data_1[tempal];
2094 break;
2095 case 5:
2096 return &XGI_LVDS1400x1050Data_2[tempal];
2097 break;
2098 case 6:
2099 return &XGI_LVDS1600x1200Data_1[tempal];
2100 break;
2101 case 7:
2102 return &XGI_LVDSNoScalingData[tempal];
2103 break;
2104 case 8:
2105 return &XGI_LVDS1024x768Data_1x75[tempal];
2106 break;
2107 case 9:
2108 return &XGI_LVDS1024x768Data_2x75[tempal];
2109 break;
2110 case 10:
2111 return &XGI_LVDS1280x1024Data_1x75[tempal];
2112 break;
2113 case 11:
2114 return &XGI_LVDS1280x1024Data_2x75[tempal];
2115 break;
2116 case 12:
2117 return &XGI_LVDSNoScalingDatax75[tempal];
2118 break;
2119 default:
2120 break;
2121 }
2122 } else if (table == 3) {
2123 switch (tempdi[i].DATAPTR) {
2124 case 0:
2125 return &XGI_LVDS1024x768Des_1[tempal];
2126 break;
2127 case 1:
2128 return &XGI_LVDS1024x768Des_3[tempal];
2129 break;
2130 case 2:
2131 return &XGI_LVDS1024x768Des_2[tempal];
2132 break;
2133 case 3:
2134 return &XGI_LVDS1280x1024Des_1[tempal];
2135 break;
2136 case 4:
2137 return &XGI_LVDS1280x1024Des_2[tempal];
2138 break;
2139 case 5:
2140 return &XGI_LVDS1400x1050Des_1[tempal];
2141 break;
2142 case 6:
2143 return &XGI_LVDS1400x1050Des_2[tempal];
2144 break;
2145 case 7:
2146 return &XGI_LVDS1600x1200Des_1[tempal];
2147 break;
2148 case 8:
2149 return &XGI_LVDSNoScalingDesData[tempal];
2150 break;
2151 case 9:
2152 return &XGI_LVDS1024x768Des_1x75[tempal];
2153 break;
2154 case 10:
2155 return &XGI_LVDS1024x768Des_3x75[tempal];
2156 break;
2157 case 11:
2158 return &XGI_LVDS1024x768Des_2x75[tempal];
2159 break;
2160 case 12:
2161 return &XGI_LVDS1280x1024Des_1x75[tempal];
2162 break;
2163 case 13:
2164 return &XGI_LVDS1280x1024Des_2x75[tempal];
2165 break;
2166 case 14:
2167 return &XGI_LVDSNoScalingDesDatax75[tempal];
2168 break;
2169 default:
2170 break;
2171 }
2172 } else if (table == 4) {
2173 switch (tempdi[i].DATAPTR) {
2174 case 0:
2175 return &XGI_ExtLCD1024x768Data[tempal];
2176 break;
2177 case 1:
2178 return &XGI_StLCD1024x768Data[tempal];
2179 break;
2180 case 2:
2181 return &XGI_CetLCD1024x768Data[tempal];
2182 break;
2183 case 3:
2184 return &XGI_ExtLCD1280x1024Data[tempal];
2185 break;
2186 case 4:
2187 return &XGI_StLCD1280x1024Data[tempal];
2188 break;
2189 case 5:
2190 return &XGI_CetLCD1280x1024Data[tempal];
2191 break;
2192 case 6:
2193 return &XGI_ExtLCD1400x1050Data[tempal];
2194 break;
2195 case 7:
2196 return &XGI_StLCD1400x1050Data[tempal];
2197 break;
2198 case 8:
2199 return &XGI_CetLCD1400x1050Data[tempal];
2200 break;
2201 case 9:
2202 return &XGI_ExtLCD1600x1200Data[tempal];
2203 break;
2204 case 10:
2205 return &XGI_StLCD1600x1200Data[tempal];
2206 break;
2207 case 11:
2208 return &XGI_NoScalingData[tempal];
2209 break;
2210 case 12:
2211 return &XGI_ExtLCD1024x768x75Data[tempal];
2212 break;
2213 case 13:
2214 return &XGI_ExtLCD1024x768x75Data[tempal];
2215 break;
2216 case 14:
2217 return &XGI_CetLCD1024x768x75Data[tempal];
2218 break;
2219 case 15:
2220 return &XGI_ExtLCD1280x1024x75Data[tempal];
2221 break;
2222 case 16:
2223 return &XGI_StLCD1280x1024x75Data[tempal];
2224 break;
2225 case 17:
2226 return &XGI_CetLCD1280x1024x75Data[tempal];
2227 break;
2228 case 18:
2229 return &XGI_NoScalingDatax75[tempal];
2230 break;
2231 default:
2232 break;
2233 }
2234 } else if (table == 5) {
2235 switch (tempdi[i].DATAPTR) {
2236 case 0:
2237 return &XGI_ExtLCDDes1024x768Data[tempal];
2238 break;
2239 case 1:
2240 return &XGI_StLCDDes1024x768Data[tempal];
2241 break;
2242 case 2:
2243 return &XGI_CetLCDDes1024x768Data[tempal];
2244 break;
2245 case 3:
2246 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2247 & VB_XGI302LV))
2248 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2249 else
2250 return &XGI_ExtLCDDes1280x1024Data[tempal];
2251 break;
2252 case 4:
2253 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2254 & VB_XGI302LV))
2255 return &XGI_StLCDDLDes1280x1024Data[tempal];
2256 else
2257 return &XGI_StLCDDes1280x1024Data[tempal];
2258 break;
2259 case 5:
2260 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2261 & VB_XGI302LV))
2262 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2263 else
2264 return &XGI_CetLCDDes1280x1024Data[tempal];
2265 break;
2266 case 6:
2267 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2268 & VB_XGI302LV))
2269 return &XGI_ExtLCDDLDes1400x1050Data[tempal];
2270 else
2271 return &XGI_ExtLCDDes1400x1050Data[tempal];
2272 break;
2273 case 7:
2274 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2275 & VB_XGI302LV))
2276 return &XGI_StLCDDLDes1400x1050Data[tempal];
2277 else
2278 return &XGI_StLCDDes1400x1050Data[tempal];
2279 break;
2280 case 8:
2281 return &XGI_CetLCDDes1400x1050Data[tempal];
2282 break;
2283 case 9:
2284 return &XGI_CetLCDDes1400x1050Data2[tempal];
2285 break;
2286 case 10:
2287 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2288 & VB_XGI302LV))
2289 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2290 else
2291 return &XGI_ExtLCDDes1600x1200Data[tempal];
2292 break;
2293 case 11:
2294 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2295 & VB_XGI302LV))
2296 return &XGI_StLCDDLDes1600x1200Data[tempal];
2297 else
2298 return &XGI_StLCDDes1600x1200Data[tempal];
2299 break;
2300 case 12:
2301 return &XGI_NoScalingDesData[tempal];
2302 break;
2303 case 13:
2304 return &XGI_ExtLCDDes1024x768x75Data[tempal];
2305 break;
2306 case 14:
2307 return &XGI_StLCDDes1024x768x75Data[tempal];
2308 break;
2309 case 15:
2310 return &XGI_CetLCDDes1024x768x75Data[tempal];
2311 break;
2312 case 16:
2313 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2314 & VB_XGI302LV))
2315 return &XGI_ExtLCDDLDes1280x1024x75Data[tempal];
2316 else
2317 return &XGI_ExtLCDDes1280x1024x75Data[tempal];
2318 break;
2319 case 17:
2320 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2321 & VB_XGI302LV))
2322 return &XGI_StLCDDLDes1280x1024x75Data[tempal];
2323 else
2324 return &XGI_StLCDDes1280x1024x75Data[tempal];
2325 break;
2326 case 18:
2327 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType
2328 & VB_XGI302LV))
2329 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2330 else
2331 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2332 break;
2333 case 19:
2334 return &XGI_NoScalingDesDatax75[tempal];
2335 break;
2336 default:
2337 break;
2338 }
2339 } else if (table == 6) {
2340 switch (tempdi[i].DATAPTR) {
2341 case 0:
2342 return &XGI_CH7017LV1024x768[tempal];
2343 break;
2344 case 1:
2345 return &XGI_CH7017LV1400x1050[tempal];
2346 break;
2347 default:
2348 break;
2349 }
2350 }
2351 return NULL;
2352}
2353
2354static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2355 unsigned short ModeIdIndex,
2356 unsigned short RefreshRateTableIndex,
2357 struct vb_device_info *pVBInfo)
2358{
2359 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2360 struct XGI330_TVDataTablStruct *tempdi = NULL;
2361
2362 tempbx = BX;
2363
2364 if (ModeNo <= 0x13) {
2365 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2366 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2367 } else {
2368 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2369 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2370 }
2371
2372 tempal = tempal & 0x3f;
2373 table = tempbx;
2374
2375 switch (tempbx) {
2376 case 0:
2377 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
2378 if (pVBInfo->IF_DEF_CH7007 == 1)
2379 tempdi = XGI_EPLCHTVCRT1Ptr;
2380
2381 break;
2382 case 1:
2383 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
2384 if (pVBInfo->IF_DEF_CH7007 == 1)
2385 tempdi = XGI_EPLCHTVCRT1Ptr;
2386
2387 break;
2388 case 2:
2389 tempdi = XGI_EPLCHTVDataPtr;
2390 break;
2391 case 3:
2392 tempdi = NULL;
2393 break;
2394 case 4:
2395 tempdi = XGI_TVDataTable;
2396 break;
2397 case 5:
2398 tempdi = NULL;
2399 break;
2400 case 6:
2401 tempdi = XGI_EPLCHTVRegPtr;
2402 break;
2403 default:
2404 break;
2405 }
2406
2407 if (tempdi == NULL) /* OEMUtil */
2408 return NULL;
2409
2410 tempdx = pVBInfo->TVInfo;
2411
2412 if (pVBInfo->VBInfo & SetInSlaveMode)
2413 tempdx = tempdx | SetTVLockMode;
2414
2415 if (modeflag & HalfDCLK)
2416 tempdx = tempdx | SetTVLowResolution;
2417
2418 i = 0;
2419
2420 while (tempdi[i].MASK != 0xffff) {
2421 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2422 break;
2423 i++;
2424 }
2425
2426 if (table == 0x00) { /* 07/05/22 */
2427 } else if (table == 0x01) {
2428 } else if (table == 0x04) {
2429 switch (tempdi[i].DATAPTR) {
2430 case 0:
2431 return &XGI_ExtPALData[tempal];
2432 break;
2433 case 1:
2434 return &XGI_ExtNTSCData[tempal];
2435 break;
2436 case 2:
2437 return &XGI_StPALData[tempal];
2438 break;
2439 case 3:
2440 return &XGI_StNTSCData[tempal];
2441 break;
2442 case 4:
2443 return &XGI_ExtHiTVData[tempal];
2444 break;
2445 case 5:
2446 return &XGI_St2HiTVData[tempal];
2447 break;
2448 case 6:
2449 return &XGI_ExtYPbPr525iData[tempal];
2450 break;
2451 case 7:
2452 return &XGI_ExtYPbPr525pData[tempal];
2453 break;
2454 case 8:
2455 return &XGI_ExtYPbPr750pData[tempal];
2456 break;
2457 case 9:
2458 return &XGI_StYPbPr525iData[tempal];
2459 break;
2460 case 10:
2461 return &XGI_StYPbPr525pData[tempal];
2462 break;
2463 case 11:
2464 return &XGI_StYPbPr750pData[tempal];
2465 break;
2466 case 12: /* avoid system hang */
2467 return &XGI_ExtNTSCData[tempal];
2468 break;
2469 case 13:
2470 return &XGI_St1HiTVData[tempal];
2471 break;
2472 default:
2473 break;
2474 }
2475 } else if (table == 0x02) {
2476 switch (tempdi[i].DATAPTR) {
2477 case 0:
2478 return &XGI_CHTVUNTSCData[tempal];
2479 break;
2480 case 1:
2481 return &XGI_CHTVONTSCData[tempal];
2482 break;
2483 case 2:
2484 return &XGI_CHTVUPALData[tempal];
2485 break;
2486 case 3:
2487 return &XGI_CHTVOPALData[tempal];
2488 break;
2489 default:
2490 break;
2491 }
2492 } else if (table == 0x06) {
2493 }
2494 return NULL;
2495}
2496
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002497static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302498 unsigned short RefreshRateTableIndex,
2499 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002500{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302501 unsigned short tempbx;
2502 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
2503 struct XGI330_CHTVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002504
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302505 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002506
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302507 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2508 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2509 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2510 pVBInfo);
2511 pVBInfo->VGAHT = LCDPtr->VGAHT;
2512 pVBInfo->VGAVT = LCDPtr->VGAVT;
2513 pVBInfo->HT = LCDPtr->LCDHT;
2514 pVBInfo->VT = LCDPtr->LCDVT;
2515 }
2516 if (pVBInfo->IF_DEF_CH7017 == 1) {
2517 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2518 TVPtr = (struct XGI330_CHTVDataStruct *) XGI_GetTVPtr(
2519 tempbx, ModeNo, ModeIdIndex,
2520 RefreshRateTableIndex, pVBInfo);
2521 pVBInfo->VGAHT = TVPtr->VGAHT;
2522 pVBInfo->VGAVT = TVPtr->VGAVT;
2523 pVBInfo->HT = TVPtr->LCDHT;
2524 pVBInfo->VT = TVPtr->LCDVT;
2525 }
2526 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002527
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302528 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2529 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2530 | EnableScalingLCD))) {
2531 if ((pVBInfo->LCDResInfo == Panel1024x768)
2532 || (pVBInfo->LCDResInfo
2533 == Panel1024x768x75)) {
2534 pVBInfo->HDE = 1024;
2535 pVBInfo->VDE = 768;
2536 } else if ((pVBInfo->LCDResInfo == Panel1280x1024)
2537 || (pVBInfo->LCDResInfo
2538 == Panel1280x1024x75)) {
2539 pVBInfo->HDE = 1280;
2540 pVBInfo->VDE = 1024;
2541 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2542 pVBInfo->HDE = 1400;
2543 pVBInfo->VDE = 1050;
2544 } else {
2545 pVBInfo->HDE = 1600;
2546 pVBInfo->VDE = 1200;
2547 }
2548 }
2549 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002550}
2551
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002552static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302553 unsigned short RefreshRateTableIndex,
2554 struct xgi_hw_device_info *HwDeviceExtension,
2555 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002556{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302557 unsigned char index;
2558 unsigned short tempbx, i;
2559 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2560 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
2561 /* struct XGI330_CHTVDataStruct *TVPtr = NULL; */
2562 struct XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
2563 struct XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302565 if (ModeNo <= 0x13)
2566 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2567 else
2568 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302570 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002571
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302572 if ((pVBInfo->IF_DEF_ScaleLCD == 0) || ((pVBInfo->IF_DEF_ScaleLCD == 1)
2573 && (!(pVBInfo->LCDInfo & EnableScalingLCD)))) {
2574 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002575
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302576 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2577 LCDPtr
2578 = (struct XGI_LVDSCRT1HDataStruct *) XGI_GetLcdPtr(
2579 tempbx, ModeNo,
2580 ModeIdIndex,
2581 RefreshRateTableIndex,
2582 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002583
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302584 for (i = 0; i < 8; i++)
2585 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
2586 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302588 if (pVBInfo->IF_DEF_CH7007 == 1) {
2589 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2590 CH7007TV_TimingHPtr
2591 = (struct XGI_CH7007TV_TimingHStruct *) XGI_GetTVPtr(
2592 tempbx,
2593 ModeNo,
2594 ModeIdIndex,
2595 RefreshRateTableIndex,
2596 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302598 for (i = 0; i < 8; i++)
2599 pVBInfo->TimingH[0].data[i]
2600 = CH7007TV_TimingHPtr[0].data[i];
2601 }
2602 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002603
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302604 /* if (pVBInfo->IF_DEF_CH7017 == 1) {
2605 if (pVBInfo->VBInfo & SetCRT2ToTV)
2606 TVPtr = (struct XGI330_CHTVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2607 }
2608 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302610 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002611
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302612 if (pVBInfo->IF_DEF_CH7007 == 1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002613 xgifb_reg_set(pVBInfo->P3c4, 0x2E,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302614 CH7007TV_TimingHPtr[0].data[8]);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002615 xgifb_reg_set(pVBInfo->P3c4, 0x2F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302616 CH7007TV_TimingHPtr[0].data[9]);
2617 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002618
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302619 tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002620
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302621 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2622 LCDPtr1
2623 = (struct XGI_LVDSCRT1VDataStruct *) XGI_GetLcdPtr(
2624 tempbx, ModeNo,
2625 ModeIdIndex,
2626 RefreshRateTableIndex,
2627 pVBInfo);
2628 for (i = 0; i < 7; i++)
2629 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2630 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302632 if (pVBInfo->IF_DEF_CH7007 == 1) {
2633 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2634 CH7007TV_TimingVPtr
2635 = (struct XGI_CH7007TV_TimingVStruct *) XGI_GetTVPtr(
2636 tempbx,
2637 ModeNo,
2638 ModeIdIndex,
2639 RefreshRateTableIndex,
2640 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302642 for (i = 0; i < 7; i++)
2643 pVBInfo->TimingV[0].data[i]
2644 = CH7007TV_TimingVPtr[0].data[i];
2645 }
2646 }
2647 /* if (pVBInfo->IF_DEF_CH7017 == 1) {
2648 if (pVBInfo->VBInfo & SetCRT2ToTV)
2649 TVPtr = (struct XGI330_CHTVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2650 }
2651 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302653 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302655 if (pVBInfo->IF_DEF_CH7007 == 1) {
2656 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x33, ~0x01,
2657 CH7007TV_TimingVPtr[0].data[7] & 0x01);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002658 xgifb_reg_set(pVBInfo->P3c4, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302659 CH7007TV_TimingVPtr[0].data[8]);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002660 xgifb_reg_set(pVBInfo->P3c4, 0x3F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302661 CH7007TV_TimingVPtr[0].data[9]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002662
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302663 }
2664 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002665}
2666
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002667static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2668{
2669 unsigned char tempal, tempah, tempbl, i;
2670
2671 tempah = XGINew_GetReg1(pVBInfo->P3d4, 0x36);
2672 tempal = tempah & 0x0F;
2673 tempah = tempah & 0xF0;
2674 i = 0;
2675 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2676
2677 while (tempbl != 0xFF) {
2678 if (tempbl & 0x80) { /* OEMUtil */
2679 tempal = tempah;
2680 tempbl = tempbl & ~(0x80);
2681 }
2682
2683 if (tempal == tempbl)
2684 break;
2685
2686 i++;
2687
2688 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2689 }
2690
2691 return i;
2692}
2693
2694static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2695{
2696 unsigned short tempah, tempal, tempbl, i;
2697
2698 tempal = pVBInfo->LCDResInfo;
2699 tempah = pVBInfo->LCDTypeInfo;
2700
2701 i = 0;
2702 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2703
2704 while (tempbl != 0xFF) {
2705 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2706 tempal = tempah;
2707 tempbl &= ~0x80;
2708 }
2709
2710 if (tempal == tempbl)
2711 break;
2712
2713 i++;
2714 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2715 }
2716
2717 if (tempbl == 0xFF) {
2718 pVBInfo->LCDResInfo = Panel1024x768;
2719 pVBInfo->LCDTypeInfo = 0;
2720 i = 0;
2721 }
2722
2723 return i;
2724}
2725
2726static void XGI_GetLCDSync(unsigned short *HSyncWidth, unsigned short *VSyncWidth,
2727 struct vb_device_info *pVBInfo)
2728{
2729 unsigned short Index;
2730
2731 Index = XGI_GetLCDCapPtr(pVBInfo);
2732 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2733 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2734
2735 return;
2736}
2737
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002738static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302739 unsigned short RefreshRateTableIndex,
2740 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002741{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302742 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2743 unsigned long temp, temp1, temp2, temp3, push3;
2744 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2745 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002746
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302747 if (ModeNo > 0x13)
2748 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2749 else
2750 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302752 if (!(pVBInfo->SetFlag & Win9xDOSMode)) {
2753 if ((pVBInfo->IF_DEF_CH7017 == 0) || (pVBInfo->VBInfo
2754 & (SetCRT2ToLCD | SetCRT2ToLCDA))) {
2755 if (pVBInfo->IF_DEF_OEMUtil == 1) {
2756 tempbx = 8;
2757 LCDPtr
2758 = (struct XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(
2759 tempbx,
2760 ModeNo,
2761 ModeIdIndex,
2762 RefreshRateTableIndex,
2763 pVBInfo);
2764 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002765
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302766 if ((pVBInfo->IF_DEF_OEMUtil == 0) || (LCDPtr == NULL)) {
2767 tempbx = 3;
2768 if (pVBInfo->LCDInfo & EnableScalingLCD)
2769 LCDPtr1
2770 = (struct XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(
2771 tempbx,
2772 ModeNo,
2773 ModeIdIndex,
2774 RefreshRateTableIndex,
2775 pVBInfo);
2776 else
2777 LCDPtr
2778 = (struct XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(
2779 tempbx,
2780 ModeNo,
2781 ModeIdIndex,
2782 RefreshRateTableIndex,
2783 pVBInfo);
2784 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302786 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2787 push1 = tempbx;
2788 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302790 /* GetLCDResInfo */
2791 if ((pVBInfo->LCDResInfo == Panel1024x768)
2792 || (pVBInfo->LCDResInfo
2793 == Panel1024x768x75)) {
2794 tempax = 1024;
2795 tempbx = 768;
2796 } else if ((pVBInfo->LCDResInfo == Panel1280x1024)
2797 || (pVBInfo->LCDResInfo
2798 == Panel1280x1024x75)) {
2799 tempax = 1280;
2800 tempbx = 1024;
2801 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2802 tempax = 1400;
2803 tempbx = 1050;
2804 } else {
2805 tempax = 1600;
2806 tempbx = 1200;
2807 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302809 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2810 pVBInfo->HDE = tempax;
2811 pVBInfo->VDE = tempbx;
2812 pVBInfo->VGAHDE = tempax;
2813 pVBInfo->VGAVDE = tempbx;
2814 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302816 if ((pVBInfo->IF_DEF_ScaleLCD == 1)
2817 && (pVBInfo->LCDInfo & EnableScalingLCD)) {
2818 tempax = pVBInfo->HDE;
2819 tempbx = pVBInfo->VDE;
2820 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302822 tempax = pVBInfo->HT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302824 if (pVBInfo->LCDInfo & EnableScalingLCD)
2825 tempbx = LCDPtr1->LCDHDES;
2826 else
2827 tempbx = LCDPtr->LCDHDES;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302829 tempcx = pVBInfo->HDE;
2830 tempbx = tempbx & 0x0fff;
2831 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302833 if (tempcx >= tempax)
2834 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002835
Aaro Koskinen8104e322011-03-13 12:26:22 +02002836 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302838 tempcx = tempcx >> 3;
2839 tempbx = tempbx >> 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002840
Aaro Koskinen8104e322011-03-13 12:26:22 +02002841 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302842 (unsigned short) (tempbx & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02002843 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302844 (unsigned short) (tempcx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302846 tempax = pVBInfo->HT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002847
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302848 if (pVBInfo->LCDInfo & EnableScalingLCD)
2849 tempbx = LCDPtr1->LCDHRS;
2850 else
2851 tempbx = LCDPtr->LCDHRS;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002852
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 tempcx = push2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002854
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302855 if (pVBInfo->LCDInfo & EnableScalingLCD)
2856 tempcx = LCDPtr1->LCDHSync;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302858 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302860 if (tempcx >= tempax)
2861 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002862
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302863 tempax = tempbx & 0x07;
2864 tempax = tempax >> 5;
2865 tempcx = tempcx >> 3;
2866 tempbx = tempbx >> 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302868 tempcx &= 0x1f;
2869 tempax |= tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002870
Aaro Koskinen8104e322011-03-13 12:26:22 +02002871 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2872 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302873 (unsigned short) (tempbx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002874
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302875 tempax = pVBInfo->VT;
2876 if (pVBInfo->LCDInfo & EnableScalingLCD)
2877 tempbx = LCDPtr1->LCDVDES;
2878 else
2879 tempbx = LCDPtr->LCDVDES;
2880 tempcx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302882 tempbx = tempbx & 0x0fff;
2883 tempcx += tempbx;
2884 if (tempcx >= tempax)
2885 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002886
Aaro Koskinen8104e322011-03-13 12:26:22 +02002887 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302888 (unsigned short) (tempbx & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02002889 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302890 (unsigned short) (tempcx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002891
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302892 tempbx = (tempbx >> 8) & 0x07;
2893 tempcx = (tempcx >> 8) & 0x07;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002894
Aaro Koskinen8104e322011-03-13 12:26:22 +02002895 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302896 (unsigned short) ((tempcx << 3)
2897 | tempbx));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302899 tempax = pVBInfo->VT;
2900 if (pVBInfo->LCDInfo & EnableScalingLCD)
2901 tempbx = LCDPtr1->LCDVRS;
2902 else
2903 tempbx = LCDPtr->LCDVRS;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302905 /* tempbx = tempbx >> 4; */
2906 tempcx = push1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302908 if (pVBInfo->LCDInfo & EnableScalingLCD)
2909 tempcx = LCDPtr1->LCDVSync;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002910
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302911 tempcx += tempbx;
2912 if (tempcx >= tempax)
2913 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002914
Aaro Koskinen8104e322011-03-13 12:26:22 +02002915 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302916 (unsigned short) (tempbx & 0xff));
2917 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, ~0x0f,
2918 (unsigned short) (tempcx & 0x0f));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302920 tempax = ((tempbx >> 8) & 0x07) << 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002921
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302922 tempbx = pVBInfo->VGAVDE;
2923 if (tempbx != pVBInfo->VDE)
2924 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002925
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302926 if (pVBInfo->LCDInfo & EnableLVDSDDA)
2927 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002928
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302929 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x1a, 0x07,
2930 tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002931
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302932 tempcx = pVBInfo->VGAVT;
2933 tempbx = pVBInfo->VDE;
2934 tempax = pVBInfo->VGAVDE;
2935 tempcx -= tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 temp = tempax; /* 0430 ylshieh */
2938 temp1 = (temp << 18) / tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002939
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302940 tempdx = (unsigned short) ((temp << 18) % tempbx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302942 if (tempdx != 0)
2943 temp1 += 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302945 temp2 = temp1;
2946 push3 = temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002947
Aaro Koskinen8104e322011-03-13 12:26:22 +02002948 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302949 (unsigned short) (temp2 & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02002950 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302951 (unsigned short) ((temp2 >> 8) & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302953 tempbx = (unsigned short) (temp2 >> 16);
2954 tempax = tempbx & 0x03;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002955
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302956 tempbx = pVBInfo->VGAVDE;
2957 if (tempbx == pVBInfo->VDE)
2958 tempax |= 0x04;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002959
Aaro Koskinen8104e322011-03-13 12:26:22 +02002960 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002961
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302962 if (pVBInfo->VBType & VB_XGI301C) {
2963 temp2 = push3;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002964 xgifb_reg_set(pVBInfo->Part4Port, 0x3c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302965 (unsigned short) (temp2 & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02002966 xgifb_reg_set(pVBInfo->Part4Port, 0x3b,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302967 (unsigned short) ((temp2 >> 8)
2968 & 0xff));
2969 tempbx = (unsigned short) (temp2 >> 16);
2970 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x3a,
2971 ~0xc0,
2972 (unsigned short) ((tempbx
2973 & 0xff) << 6));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002974
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302975 tempcx = pVBInfo->VGAVDE;
2976 if (tempcx == pVBInfo->VDE)
2977 XGINew_SetRegANDOR(pVBInfo->Part4Port,
2978 0x30, ~0x0c, 0x00);
2979 else
2980 XGINew_SetRegANDOR(pVBInfo->Part4Port,
2981 0x30, ~0x0c, 0x08);
2982 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302984 tempcx = pVBInfo->VGAHDE;
2985 tempbx = pVBInfo->HDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302987 temp1 = tempcx << 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302989 tempax = (unsigned short) (temp1 / tempbx);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002990
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302991 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2992 tempax = 65535;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002993
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302994 temp3 = tempax;
2995 temp1 = pVBInfo->VGAHDE << 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 temp1 /= temp3;
2998 temp3 = temp3 << 16;
2999 temp1 -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303001 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003002
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303003 tempax = (unsigned short) (temp3 & 0xff);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003004 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303006 temp1 = pVBInfo->VGAVDE << 18;
3007 temp1 = temp1 / push3;
3008 tempbx = (unsigned short) (temp1 & 0xffff);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003009
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303010 if (pVBInfo->LCDResInfo == Panel1024x768)
3011 tempbx -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003012
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303013 tempax = ((tempbx >> 8) & 0xff) << 3;
3014 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003015 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303016 (unsigned short) (tempax & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003017 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303018 (unsigned short) (tempbx & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303020 temp3 = temp3 >> 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003021
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303022 if (modeflag & HalfDCLK)
3023 temp3 = temp3 >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003024
Aaro Koskinen8104e322011-03-13 12:26:22 +02003025 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303026 (unsigned short) ((temp3 >> 8) & 0xff));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003027 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303028 (unsigned short) (temp3 & 0xff));
3029 }
3030 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003031}
3032
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003033/* --------------------------------------------------------------------- */
3034/* Function : XGI_GETLCDVCLKPtr */
3035/* Input : */
3036/* Output : al -> VCLK Index */
3037/* Description : */
3038/* --------------------------------------------------------------------- */
3039static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
3040 struct vb_device_info *pVBInfo)
3041{
3042 unsigned short index;
3043
3044 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
3045 if (pVBInfo->IF_DEF_ScaleLCD == 1) {
3046 if (pVBInfo->LCDInfo & EnableScalingLCD)
3047 return;
3048 }
3049
3050 /* index = XGI_GetLCDCapPtr(pVBInfo); */
3051 index = XGI_GetLCDCapPtr1(pVBInfo);
3052
3053 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
3054 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
3055 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
3056 } else { /* LCDA */
3057 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
3058 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
3059 }
3060 }
3061 return;
3062}
3063
3064static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
3065 unsigned short ModeNo, unsigned short ModeIdIndex,
3066 struct vb_device_info *pVBInfo)
3067{
3068
3069 unsigned short index, modeflag;
3070 unsigned short tempbx;
3071 unsigned char tempal;
3072 unsigned char *CHTVVCLKPtr = NULL;
3073
3074 if (ModeNo <= 0x13)
3075 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
3076 else
3077 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
3078
3079 if ((pVBInfo->SetFlag & ProgrammingCRT2) && (!(pVBInfo->LCDInfo
3080 & EnableScalingLCD))) { /* {LCDA/LCDB} */
3081 index = XGI_GetLCDCapPtr(pVBInfo);
3082 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
3083
3084 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
3085 return tempal;
3086
3087 /* {TV} */
3088 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3089 | VB_XGI302LV | VB_XGI301C)) {
3090 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3091 tempal = HiTVVCLKDIV2;
3092 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3093 tempal = HiTVVCLK;
3094 if (pVBInfo->TVInfo & TVSimuMode) {
3095 tempal = HiTVSimuVCLK;
3096 if (!(modeflag & Charx8Dot))
3097 tempal = HiTVTextVCLK;
3098
3099 }
3100 return tempal;
3101 }
3102
3103 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
3104 tempal = YPbPr750pVCLK;
3105 return tempal;
3106 }
3107
3108 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
3109 tempal = YPbPr525pVCLK;
3110 return tempal;
3111 }
3112
3113 tempal = NTSC1024VCLK;
3114
3115 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
3116 tempal = TVVCLKDIV2;
3117 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3118 tempal = TVVCLK;
3119 }
3120
3121 if (pVBInfo->VBInfo & SetCRT2ToTV)
3122 return tempal;
3123 }
3124 /* else if ((pVBInfo->IF_DEF_CH7017==1)&&(pVBInfo->VBType&VB_CH7017)) {
3125 if (ModeNo<=0x13)
3126 *tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
3127 else
3128 *tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
3129 *tempal = *tempal & 0x1F;
3130 tempbx = 0;
3131 if (pVBInfo->TVInfo & SetPALTV)
3132 tempbx = tempbx + 2;
3133 if (pVBInfo->TVInfo & SetCHTVOverScan)
3134 tempbx++;
3135 tempbx = tempbx << 1;
3136 } */
3137 } /* {End of VB} */
3138
3139 if ((pVBInfo->IF_DEF_CH7007 == 1) && (pVBInfo->VBType & VB_CH7007)) { /* [Billy] 07/05/08 CH7007 */
3140 /* VideoDebugPrint((0, "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
3141 if ((pVBInfo->VBInfo & SetCRT2ToTV)) {
3142 if (ModeNo <= 0x13) {
3143 tempal
3144 = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
3145 } else {
3146 tempal
3147 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
3148 }
3149
3150 tempal = tempal & 0x0F;
3151 tempbx = 0;
3152
3153 if (pVBInfo->TVInfo & SetPALTV)
3154 tempbx = tempbx + 2;
3155
3156 if (pVBInfo->TVInfo & SetCHTVOverScan)
3157 tempbx++;
3158
3159 /** tempbx = tempbx << 1; CH7007 ? **/
3160
3161 /* [Billy]07/05/29 CH7007 */
3162 if (pVBInfo->IF_DEF_CH7007 == 1) {
3163 switch (tempbx) {
3164 case 0:
3165 CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC;
3166 break;
3167 case 1:
3168 CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC;
3169 break;
3170 case 2:
3171 CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL;
3172 break;
3173 case 3:
3174 CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL;
3175 break;
3176 default:
3177 break;
3178
3179 }
3180 }
3181 /* else {
3182 switch(tempbx) {
3183 case 0:
3184 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC;
3185 break;
3186 case 1:
3187 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC;
3188 break;
3189 case 2:
3190 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL;
3191 break;
3192 case 3:
3193 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL;
3194 break;
3195 default:
3196 break;
3197 }
3198 }
3199 */
3200
3201 tempal = CHTVVCLKPtr[tempal];
3202 return tempal;
3203 }
3204
3205 }
3206
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003207 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003208 tempal = tempal >> 2;
3209 tempal &= 0x03;
3210
3211 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot)) /* for Dot8 Scaling LCD */
3212 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
3213
3214 if (ModeNo <= 0x13)
3215 return tempal;
3216
3217 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
3218 return tempal;
3219}
3220
3221static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
3222 unsigned char *di_1, struct vb_device_info *pVBInfo)
3223{
3224 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 2007/05/16 */
3225 /* VideoDebugPrint((0, "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
3226 *di_0 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2B;
3227 *di_1 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2C;
3228 } else if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
3229 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
3230 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
3231 & ProgrammingCRT2)) {
3232 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
3233 *di_1 = XGI_VBVCLKData[tempal].SR2C;
3234 }
3235 } else {
3236 *di_0 = XGI_VCLKData[tempal].SR2B;
3237 *di_1 = XGI_VCLKData[tempal].SR2C;
3238 }
3239}
3240
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003241static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303242 unsigned short RefreshRateTableIndex,
3243 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003244{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 unsigned char di_0, di_1, tempal;
3246 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303248 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3249 pVBInfo);
3250 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3251 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303253 for (i = 0; i < 4; i++) {
3254 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x31, ~0x30,
3255 (unsigned short) (0x10 * i));
3256 if (pVBInfo->IF_DEF_CH7007 == 1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003257 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3258 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303259 } else if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
3260 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003261 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3262 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303263 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003264 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3265 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303266 }
3267 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003268}
3269
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003270static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303271 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003272{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303273 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003274
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303275 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3276 | VB_XGI302LV | VB_XGI301C)) {
3277 tempcl = 0;
3278 tempch = 0;
3279 temp = XGINew_GetReg1(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003280
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303281 if (!(temp & 0x20)) {
3282 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x17);
3283 if (temp & 0x80) {
Aaro Koskinen06587332011-03-13 12:26:10 +02003284 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303285 if (!(temp & 0x40))
3286 tempcl |= ActiveCRT1;
3287 }
3288 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303290 temp = XGINew_GetReg1(pVBInfo->Part1Port, 0x2e);
3291 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303293 if (!(temp == 0x08)) {
3294 tempax = XGINew_GetReg1(pVBInfo->Part1Port, 0x13); /* Check ChannelA by Part1_13 [2003/10/03] */
3295 if (tempax & 0x04)
3296 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003297
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303298 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 if (!(tempcl & ActiveLCD))
3301 if (temp == 0x01)
3302 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303304 if (temp == 0x04)
3305 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303307 if (temp == 0x05) {
3308 temp = XGINew_GetReg1(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003309
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303310 if (!(temp & 0x08))
3311 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 if (!(temp & 0x04))
3314 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003315
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303316 if (temp & 0x02)
3317 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003318
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303319 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3320 if (temp & 0x01)
3321 tempch |= ActiveHiTV;
3322 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303324 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
3325 temp = XGINew_GetReg1(
3326 pVBInfo->Part2Port,
3327 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303329 if (temp & 0x10)
3330 tempch |= ActiveYPbPr;
3331 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003332
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303333 if (tempch != 0)
3334 tempcl |= ActiveTV;
3335 }
3336 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x3d);
3339 if (tempcl & ActiveLCD) {
3340 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3341 if (temp & ActiveTV)
3342 tempcl |= ActiveTV;
3343 }
3344 }
3345 temp = tempcl;
3346 tempbl = ~ModeSwitchStatus;
3347 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303349 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003350 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 } else {
3352 return;
3353 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003354}
3355
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303356void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3357 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003358{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303359 /*
3360 if ( HwDeviceExtension->jChipType >= XG20 ) {
3361 pVBInfo->Set_VGAType = XG20;
Aaro Koskinen06587332011-03-13 12:26:10 +02003362 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303363 pVBInfo->Set_VGAType = VGA_XGI340;
3364 }
3365 */
3366 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003367}
3368
Bill Pemberton80adad82010-06-17 13:10:51 -04003369void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003370{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303371 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303373 if (pVBInfo->IF_DEF_CH7007 == 1) {
3374 pVBInfo->VBType = VB_CH7007;
3375 return;
3376 }
3377 if (pVBInfo->IF_DEF_LVDS == 0) {
3378 tempbx = VB_XGI302B;
3379 flag = XGINew_GetReg1(pVBInfo->Part4Port, 0x00);
3380 if (flag != 0x02) {
3381 tempbx = VB_XGI301;
3382 flag = XGINew_GetReg1(pVBInfo->Part4Port, 0x01);
3383 if (flag >= 0xB0) {
3384 tempbx = VB_XGI301B;
3385 if (flag >= 0xC0) {
3386 tempbx = VB_XGI301C;
3387 if (flag >= 0xD0) {
3388 tempbx = VB_XGI301LV;
3389 if (flag >= 0xE0) {
3390 tempbx = VB_XGI302LV;
3391 tempah
3392 = XGINew_GetReg1(
3393 pVBInfo->Part4Port,
3394 0x39);
3395 if (tempah != 0xFF)
3396 tempbx
3397 = VB_XGI301C;
3398 }
3399 }
3400 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003401
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303402 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
3403 flag = XGINew_GetReg1(
3404 pVBInfo->Part4Port,
3405 0x23);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303407 if (!(flag & 0x02))
3408 tempbx = tempbx | VB_NoLCD;
3409 }
3410 }
3411 }
3412 pVBInfo->VBType = tempbx;
3413 }
3414 /*
3415 else if (pVBInfo->IF_DEF_CH7017 == 1)
3416 pVBInfo->VBType = VB_CH7017;
3417 else //LVDS
3418 pVBInfo->VBType = VB_LVDS_NS;
3419 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003420
3421}
3422
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303423void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3424 struct xgi_hw_device_info *HwDeviceExtension,
3425 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003426{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303427 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003428
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303429 if (ModeNo <= 0x13)
3430 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3431 else
3432 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 pVBInfo->SetFlag = 0;
3435 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3436 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003437
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303438 if (pVBInfo->VBType & 0xFFFF) {
3439 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x30); /* Check Display Device */
3440 tempbx = tempbx | temp;
3441 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x31);
3442 push = temp;
3443 push = push << 8;
3444 tempax = temp << 8;
3445 tempbx = tempbx | tempax;
3446 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3447 | SetInSlaveMode | DisableCRT2Display);
3448 temp = 0xFFFF ^ temp;
3449 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303451 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 if (pVBInfo->IF_DEF_LCDA == 1) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303455 if ((pVBInfo->Set_VGAType >= XG20)
3456 || (pVBInfo->Set_VGAType >= XG40)) {
3457 if (pVBInfo->IF_DEF_LVDS == 0) {
3458 /* if ((pVBInfo->VBType & VB_XGI302B) || (pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType & VB_XGI301C)) */
3459 if (pVBInfo->VBType & (VB_XGI302B
3460 | VB_XGI301LV
3461 | VB_XGI302LV
3462 | VB_XGI301C)) {
3463 if (temp & EnableDualEdge) {
3464 tempbx
3465 |= SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303467 if (temp & SetToLCDA)
3468 tempbx
3469 |= SetCRT2ToLCDA;
3470 }
3471 }
3472 } else if (pVBInfo->IF_DEF_CH7017 == 1) {
3473 if (pVBInfo->VBType & VB_CH7017) {
3474 if (temp & EnableDualEdge) {
3475 tempbx
3476 |= SetCRT2ToDualEdge;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003477
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303478 if (temp & SetToLCDA)
3479 tempbx
3480 |= SetCRT2ToLCDA;
3481 }
3482 }
3483 }
3484 }
3485 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003486
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303487 if (pVBInfo->IF_DEF_YPbPr == 1) {
3488 if (((pVBInfo->IF_DEF_LVDS == 0) && ((pVBInfo->VBType
3489 & VB_XGI301LV) || (pVBInfo->VBType
3490 & VB_XGI302LV) || (pVBInfo->VBType
3491 & VB_XGI301C)))
3492 || ((pVBInfo->IF_DEF_CH7017 == 1)
3493 && (pVBInfo->VBType
3494 & VB_CH7017))
3495 || ((pVBInfo->IF_DEF_CH7007 == 1)
3496 && (pVBInfo->VBType
3497 & VB_CH7007))) { /* [Billy] 07/05/04 */
3498 if (temp & SetYPbPr) { /* temp = CR38 */
3499 if (pVBInfo->IF_DEF_HiVision == 1) {
3500 temp = XGINew_GetReg1(
3501 pVBInfo->P3d4,
3502 0x35); /* shampoo add for new scratch */
3503 temp &= YPbPrMode;
3504 tempbx |= SetCRT2ToHiVisionTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303506 if (temp != YPbPrMode1080i) {
3507 tempbx
3508 &= (~SetCRT2ToHiVisionTV);
3509 tempbx
3510 |= SetCRT2ToYPbPr;
3511 }
3512 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003513
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303514 /* tempbx |= SetCRT2ToYPbPr; */
3515 }
3516 }
3517 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003518
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303519 tempax = push; /* restore CR31 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003520
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303521 if (pVBInfo->IF_DEF_LVDS == 0) {
3522 if (pVBInfo->IF_DEF_YPbPr == 1) {
3523 if (pVBInfo->IF_DEF_HiVision == 1)
3524 temp = 0x09FC;
3525 else
3526 temp = 0x097C;
3527 } else {
3528 if (pVBInfo->IF_DEF_HiVision == 1)
3529 temp = 0x01FC;
3530 else
3531 temp = 0x017C;
3532 }
3533 } else { /* 3nd party chip */
3534 if (pVBInfo->IF_DEF_CH7017 == 1)
3535 temp = (SetCRT2ToTV | SetCRT2ToLCD
3536 | SetCRT2ToLCDA);
3537 else if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/03 */
3538 temp = SetCRT2ToTV;
3539 } else
3540 temp = SetCRT2ToLCD;
3541 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003542
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303543 if (!(tempbx & temp)) {
3544 tempax |= DisableCRT2Display;
3545 tempbx = 0;
3546 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003547
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303548 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3549 if (!(pVBInfo->VBType & VB_NoLCD)) {
3550 if (tempbx & SetCRT2ToLCDA) {
3551 if (tempbx & SetSimuScanMode)
3552 tempbx
3553 &= (~(SetCRT2ToLCD
3554 | SetCRT2ToRAMDAC
3555 | SwitchToCRT2));
3556 else
3557 tempbx
3558 &= (~(SetCRT2ToLCD
3559 | SetCRT2ToRAMDAC
3560 | SetCRT2ToTV
3561 | SwitchToCRT2));
3562 }
3563 }
3564 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003565
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303566 /* shampoo add */
3567 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) { /* for driver abnormal */
3568 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3569 if (tempbx & SetCRT2ToRAMDAC) {
3570 tempbx &= (0xFF00 | SetCRT2ToRAMDAC
3571 | SwitchToCRT2
3572 | SetSimuScanMode);
3573 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3574 }
3575 } else {
3576 tempbx &= (~(SetCRT2ToRAMDAC | SetCRT2ToLCD
3577 | SetCRT2ToTV));
3578 }
3579 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303581 if (!(pVBInfo->VBType & VB_NoLCD)) {
3582 if (tempbx & SetCRT2ToLCD) {
3583 tempbx &= (0xFF00 | SetCRT2ToLCD | SwitchToCRT2
3584 | SetSimuScanMode);
3585 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3586 }
3587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303589 if (tempbx & SetCRT2ToSCART) {
3590 tempbx &= (0xFF00 | SetCRT2ToSCART | SwitchToCRT2
3591 | SetSimuScanMode);
3592 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3593 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003594
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303595 if (pVBInfo->IF_DEF_YPbPr == 1) {
3596 if (tempbx & SetCRT2ToYPbPr)
3597 tempbx &= (0xFF00 | SwitchToCRT2
3598 | SetSimuScanMode);
3599 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303601 if (pVBInfo->IF_DEF_HiVision == 1) {
3602 if (tempbx & SetCRT2ToHiVisionTV)
3603 tempbx &= (0xFF00 | SetCRT2ToHiVisionTV
3604 | SwitchToCRT2
3605 | SetSimuScanMode);
3606 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303608 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3609 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3610 tempbx = DisableCRT2Display;
3611 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303613 if (!(tempbx & DisableCRT2Display)) {
3614 if ((!(tempbx & DriverMode))
3615 || (!(modeflag & CRT2Mode))) {
3616 if (pVBInfo->IF_DEF_LCDA == 1) {
3617 if (!(tempbx & SetCRT2ToLCDA))
3618 tempbx
3619 |= (SetInSlaveMode
3620 | SetSimuScanMode);
3621 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303623 if (pVBInfo->IF_DEF_VideoCapture == 1) {
3624 if (((HwDeviceExtension->jChipType
3625 == XG40)
3626 && (pVBInfo->Set_VGAType
3627 == XG40))
3628 || ((HwDeviceExtension->jChipType
3629 == XG41)
3630 && (pVBInfo->Set_VGAType
3631 == XG41))
3632 || ((HwDeviceExtension->jChipType
3633 == XG42)
3634 && (pVBInfo->Set_VGAType
3635 == XG42))
3636 || ((HwDeviceExtension->jChipType
3637 == XG45)
3638 && (pVBInfo->Set_VGAType
3639 == XG45))) {
3640 if (ModeNo <= 13) {
3641 if (!(tempbx
3642 & SetCRT2ToRAMDAC)) { /*CRT2 not need to support*/
3643 tempbx
3644 &= (0x00FF
3645 | (~SetInSlaveMode));
3646 pVBInfo->SetFlag
3647 |= EnableVCMode;
3648 }
3649 }
3650 }
3651 }
3652 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 /* LCD+TV can't support in slave mode (Force LCDA+TV->LCDB) */
3655 if ((tempbx & SetInSlaveMode) && (tempbx
3656 & SetCRT2ToLCDA)) {
3657 tempbx ^= (SetCRT2ToLCD | SetCRT2ToLCDA
3658 | SetCRT2ToDualEdge);
3659 pVBInfo->SetFlag |= ReserveTVOption;
3660 }
3661 }
3662 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303664 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003665}
3666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303667void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3668 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003669{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303670 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003671
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303672 tempbx = 0;
3673 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003674
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303675 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3676 if (ModeNo <= 0x13) {
3677 modeflag
3678 = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
3679 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
3680 } else {
3681 modeflag
3682 = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3683 resinfo
3684 = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
3685 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303687 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3688 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x35);
3689 tempbx = temp;
3690 if (tempbx & SetPALTV) {
3691 tempbx &= (SetCHTVOverScan | SetPALMTV
3692 | SetPALNTV | SetPALTV);
3693 if (tempbx & SetPALMTV)
3694 tempbx &= ~SetPALTV; /* set to NTSC if PAL-M */
3695 } else
3696 tempbx &= (SetCHTVOverScan | SetNTSCJ
3697 | SetPALTV);
3698 /*
3699 if (pVBInfo->IF_DEF_LVDS == 0) {
3700 index1 = XGINew_GetReg1(pVBInfo->P3d4, 0x38); //PAL-M/PAL-N Info
3701 temp2 = (index1 & 0xC0) >> 5; //00:PAL, 01:PAL-M, 10:PAL-N
3702 tempbx |= temp2;
3703 if (temp2 & 0x02) //PAL-M
3704 tempbx &= (~SetPALTV);
3705 }
3706 */
3707 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003708
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303709 if (pVBInfo->IF_DEF_CH7017 == 1) {
3710 tempbx = XGINew_GetReg1(pVBInfo->P3d4, 0x35);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303712 if (tempbx & TVOverScan)
3713 tempbx |= SetCHTVOverScan;
3714 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303716 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/04 */
3717 tempbx = XGINew_GetReg1(pVBInfo->P3d4, 0x35);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303719 if (tempbx & TVOverScan)
3720 tempbx |= SetCHTVOverScan;
3721 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303723 if (pVBInfo->IF_DEF_LVDS == 0) {
3724 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3725 tempbx |= SetPALTV;
3726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303728 if (pVBInfo->IF_DEF_YPbPr == 1) {
3729 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
3730 index1 = XGINew_GetReg1(pVBInfo->P3d4, 0x35);
3731 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003732
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303733 if (index1 == YPbPrMode525i)
3734 tempbx |= SetYPbPrMode525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003735
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303736 if (index1 == YPbPrMode525p)
3737 tempbx = tempbx | SetYPbPrMode525p;
3738 if (index1 == YPbPrMode750p)
3739 tempbx = tempbx | SetYPbPrMode750p;
3740 }
3741 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743 if (pVBInfo->IF_DEF_HiVision == 1) {
3744 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3745 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
3746 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003747
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3749 if ((pVBInfo->VBInfo & SetInSlaveMode)
3750 && (!(pVBInfo->VBInfo & SetNotSimuMode)))
3751 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303753 if (!(tempbx & SetPALTV) && (modeflag > 13) && (resinfo
3754 == 8)) /* NTSC 1024x768, */
3755 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303757 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303759 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3760 if (pVBInfo->VBInfo & SetInSlaveMode)
3761 tempbx &= (~RPLLDIV2XO);
3762 } else {
3763 if (tempbx & (SetYPbPrMode525p
3764 | SetYPbPrMode750p))
3765 tempbx &= (~RPLLDIV2XO);
3766 else if (!(pVBInfo->VBType & (VB_XGI301B
3767 | VB_XGI302B | VB_XGI301LV
3768 | VB_XGI302LV | VB_XGI301C))) {
3769 if (tempbx & TVSimuMode)
3770 tempbx &= (~RPLLDIV2XO);
3771 }
3772 }
3773 }
3774 }
3775 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003776}
3777
Bill Pemberton108afbf2010-06-17 13:10:47 -04003778unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303779 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003780{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303781 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303783 pVBInfo->LCDResInfo = 0;
3784 pVBInfo->LCDTypeInfo = 0;
3785 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303787 if (ModeNo <= 0x13) {
3788 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag // */
3789 } else {
3790 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3791 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo // */
3792 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003793
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303794 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
3795 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303797 if (tempbx == 0)
3798 tempbx = Panel1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003799
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303800 /* LCD75 [2003/8/22] Vicent */
3801 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3802 if (pVBInfo->VBInfo & DriverMode) {
3803 tempax = XGINew_GetReg1(pVBInfo->P3d4, 0x33);
3804 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3805 tempax &= 0x0F;
3806 else
3807 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 if ((resinfo == 6) || (resinfo == 9)) {
3810 if (tempax >= 3)
3811 tempbx |= PanelRef75Hz;
3812 } else if ((resinfo == 7) || (resinfo == 8)) {
3813 if (tempax >= 4)
3814 tempbx |= PanelRef75Hz;
3815 }
3816 }
3817 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303819 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303821 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303823 if (pVBInfo->IF_DEF_OEMUtil == 1)
3824 pVBInfo->LCDTypeInfo = (temp & 0xf0) >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303826 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
3827 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303829 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003830
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303831 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303833 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303835 if ((pVBInfo->IF_DEF_ScaleLCD == 1) && (temp & LCDNonExpanding))
3836 temp &= ~EnableScalingLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303838 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003839
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303840 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003841
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303842 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303844 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3845 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3846 & VB_XGI301C)) && (tempax & LCDDualLink)) {
3847 tempbx |= SetLCDDualLink;
3848 }
3849 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303851 if (pVBInfo->IF_DEF_CH7017 == 1) {
3852 if (tempax & LCDDualLink)
3853 tempbx |= SetLCDDualLink;
3854 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303856 if (pVBInfo->IF_DEF_LVDS == 0) {
3857 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
3858 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3859 == 9) && (!(tempbx & EnableScalingLCD)))
3860 tempbx |= SetLCDtoNonExpanding; /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3861 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003862
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303863 /*
3864 if (tempax & LCDBToA) {
3865 tempbx |= SetLCDBToA;
3866 }
3867 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303869 if (pVBInfo->IF_DEF_ExpLink == 1) {
3870 if (modeflag & HalfDCLK) {
3871 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
3872 if (!(tempbx & SetLCDtoNonExpanding)) {
3873 tempbx |= EnableLVDSDDA;
3874 } else {
3875 if (ModeNo > 0x13) {
3876 if (pVBInfo->LCDResInfo
3877 == Panel1024x768) {
3878 if (resinfo == 4) { /* 512x384 */
3879 tempbx |= EnableLVDSDDA;
3880 }
3881 }
3882 }
3883 }
3884 }
3885 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303887 if (pVBInfo->VBInfo & SetInSlaveMode) {
3888 if (pVBInfo->VBInfo & SetNotSimuMode)
3889 tempbx |= LCDVESATiming;
3890 } else {
3891 tempbx |= LCDVESATiming;
3892 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003893
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303894 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003895
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303896 if (pVBInfo->IF_DEF_PWD == 1) {
3897 if (pVBInfo->LCDInfo & SetPWDEnable) {
3898 if ((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3899 & VB_XGI301C)) {
3900 if (!(tempax & PWDEnable))
3901 pVBInfo->LCDInfo &= ~SetPWDEnable;
3902 }
3903 }
3904 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303906 if (pVBInfo->IF_DEF_LVDS == 0) {
3907 if (tempax & (LockLCDBToA | StLCDBToA)) {
3908 if (pVBInfo->VBInfo & SetInSlaveMode) {
3909 if (!(tempax & LockLCDBToA)) {
3910 if (ModeNo <= 0x13) {
3911 pVBInfo->VBInfo
3912 &= ~(SetSimuScanMode
3913 | SetInSlaveMode
3914 | SetCRT2ToLCD);
3915 pVBInfo->VBInfo
3916 |= SetCRT2ToLCDA
3917 | SetCRT2ToDualEdge;
3918 }
3919 }
3920 }
3921 }
3922 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303924 /*
3925 if (pVBInfo->IF_DEF_LVDS == 0) {
3926 if (tempax & (LockLCDBToA | StLCDBToA)) {
3927 if (pVBInfo->VBInfo & SetInSlaveMode) {
3928 if (!((!(tempax & LockLCDBToA)) && (ModeNo > 0x13))) {
3929 pVBInfo->VBInfo&=~(SetSimuScanMode|SetInSlaveMode|SetCRT2ToLCD);
3930 pVBInfo->VBInfo|=SetCRT2ToLCDA|SetCRT2ToDualEdge;
3931 }
3932 }
3933 }
3934 }
3935 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303937 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003938}
3939
Bill Pemberton108afbf2010-06-17 13:10:47 -04003940unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303941 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003942{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303943 if (ModeNo <= 5)
3944 ModeNo |= 1;
3945 if (ModeNo <= 0x13) {
3946 /* for (*ModeIdIndex=0; *ModeIdIndex < sizeof(pVBInfo->SModeIDTable) / sizeof(struct XGI_StStruct); (*ModeIdIndex)++) */
3947 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
3948 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == ModeNo)
3949 break;
3950 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF)
3951 return 0;
3952 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003953
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303954 if (ModeNo == 0x07)
3955 (*ModeIdIndex)++; /* 400 lines */
3956 if (ModeNo <= 3)
3957 (*ModeIdIndex) += 2; /* 400 lines */
3958 /* else 350 lines */
3959 } else {
3960 /* for (*ModeIdIndex=0; *ModeIdIndex < sizeof(pVBInfo->EModeIDTable) / sizeof(struct XGI_ExtStruct); (*ModeIdIndex)++) */
3961 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
3962 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
3963 break;
3964 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
3965 return 0;
3966 }
3967 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303969 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003970}
3971
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003972/* win2000 MM adapter not support standard mode! */
3973
Randy Dunlap89229672010-08-10 08:46:44 -07003974#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07003975static unsigned char XGINew_CheckMemorySize(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303976 struct xgi_hw_device_info *HwDeviceExtension,
3977 unsigned short ModeNo,
3978 unsigned short ModeIdIndex,
3979 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003980{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303981 unsigned short memorysize, modeflag, temp, temp1, tmp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303983 /*
3984 if ((HwDeviceExtension->jChipType == XGI_650) ||
3985 (HwDeviceExtension->jChipType == XGI_650M)) {
3986 return 1;
3987 }
3988 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003989
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303990 if (ModeNo <= 0x13)
3991 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3992 else
3993 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995 /* ModeType = modeflag&ModeInfoFlag; // Get mode type */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303997 memorysize = modeflag & MemoryInfoFlag;
3998 memorysize = memorysize > MemorySizeShift;
3999 memorysize++; /* Get memory size */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004000
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304001 temp = XGINew_GetReg1(pVBInfo->P3c4, 0x14); /* Get DRAM Size */
4002 tmp = temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304004 if (HwDeviceExtension->jChipType == XG40) {
4005 temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */
4006 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4007 temp <<= 2;
4008 } else if ((tmp & 0x0c) == 0x08) { /* Dual channels */
4009 temp <<= 1;
4010 }
4011 } else if (HwDeviceExtension->jChipType == XG42) {
4012 temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */
4013 if ((tmp & 0x04) == 0x04) { /* Dual channels */
4014 temp <<= 1;
4015 }
4016 } else if (HwDeviceExtension->jChipType == XG45) {
4017 temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */
4018 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4019 temp <<= 2;
4020 } else if ((tmp & 0x0c) == 0x08) { /* triple channels */
4021 temp1 = temp;
4022 temp <<= 1;
4023 temp += temp1;
4024 } else if ((tmp & 0x0c) == 0x04) { /* Dual channels */
4025 temp <<= 1;
4026 }
4027 }
4028 if (temp < memorysize)
4029 return 0;
4030 else
4031 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004032}
Randy Dunlap89229672010-08-10 08:46:44 -07004033#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004034
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304035/*
4036void XGINew_IsLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned char XGINew_CheckMemorySize(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004037{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304038 unsigned short data ;
4039 unsigned short ModeFlag ;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304041 data = XGINew_GetReg1(pVBInfo->P3c4, 0x0F);
4042 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004043 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004044
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304045 if (ModeNo > 0x13) {
4046 ModeFlag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4047 if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
4048 data = XGINew_GetReg1(pVBInfo->P3c4, 0x0F);
4049 data |= 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004050 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304051 data = XGINew_GetReg1(pVBInfo->P3c4, 0x01);
4052 data &= 0xF7;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004053 xgifb_reg_set(pVBInfo->P3c4, 0x01, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304054 }
4055 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004056}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004057*/
4058
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004059static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
4060{
4061 unsigned char ujRet = 0;
4062 unsigned char i = 0;
4063
4064 for (i = 0; i < 8; i++) {
4065 ujRet = ujRet << 1;
4066 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
4067 ujRet |= (ujDate >> i) & 1;
4068 }
4069
4070 return ujRet;
4071}
4072
4073/*----------------------------------------------------------------------------*/
4074/* output */
4075/* bl[5] : LVDS signal */
4076/* bl[1] : LVDS backlight */
4077/* bl[0] : LVDS VDD */
4078/*----------------------------------------------------------------------------*/
4079static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
4080{
4081 unsigned char CR4A, temp;
4082
4083 CR4A = XGINew_GetReg1(pVBInfo->P3d4, 0x4A);
4084 XGINew_SetRegAND(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
4085
4086 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x48);
4087
4088 temp = XG21GPIODataTransfer(temp);
4089 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004090 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004091 return temp;
4092}
4093
4094/*----------------------------------------------------------------------------*/
4095/* output */
4096/* bl[5] : LVDS signal */
4097/* bl[1] : LVDS backlight */
4098/* bl[0] : LVDS VDD */
4099/*----------------------------------------------------------------------------*/
4100static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
4101{
4102 unsigned char CR4A, CRB4, temp;
4103
4104 CR4A = XGINew_GetReg1(pVBInfo->P3d4, 0x4A);
4105 XGINew_SetRegAND(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
4106
4107 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x48);
4108
4109 temp &= 0x0C;
4110 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004111 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004112 CRB4 = XGINew_GetReg1(pVBInfo->P3d4, 0xB4);
4113 temp |= ((CRB4 & 0x04) << 3);
4114 return temp;
4115}
4116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304117void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
4118 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004119{
4120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304121 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
4122 if (pXGIHWDE->jChipType == XG21) {
4123 if (pVBInfo->IF_DEF_LVDS == 1) {
4124 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
4125 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo); /* LVDS VDD on */
4126 XGI_XG21SetPanelDelay(2, pVBInfo);
4127 }
4128 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
4129 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo); /* LVDS signal on */
4130 XGI_XG21SetPanelDelay(3, pVBInfo);
4131 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo); /* LVDS backlight on */
4132 } else {
4133 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo); /* DVO/DVI signal on */
4134 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304136 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004137
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304138 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/23 For CH7007 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304140 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304142 if (pXGIHWDE->jChipType == XG27) {
4143 if (pVBInfo->IF_DEF_LVDS == 1) {
4144 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
4145 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo); /* LVDS VDD on */
4146 XGI_XG21SetPanelDelay(2, pVBInfo);
4147 }
4148 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
4149 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo); /* LVDS signal on */
4150 XGI_XG21SetPanelDelay(3, pVBInfo);
4151 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo); /* LVDS backlight on */
4152 } else {
4153 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo); /* DVO/DVI signal on */
4154 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304156 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004157}
4158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304159void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
4160 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004161{
4162
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304163 if (pXGIHWDE->jChipType == XG21) {
4164 if (pVBInfo->IF_DEF_LVDS == 1) {
4165 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo); /* LVDS backlight off */
4166 XGI_XG21SetPanelDelay(3, pVBInfo);
4167 } else {
4168 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo); /* DVO/DVI signal off */
4169 }
4170 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004171
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304172 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/23 For CH7007 */
4173 /* if (IsCH7007TVMode(pVBInfo) == 0) */
4174 {
4175 }
4176 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304178 if (pXGIHWDE->jChipType == XG27) {
4179 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
4180 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo); /* LVDS backlight off */
4181 XGI_XG21SetPanelDelay(3, pVBInfo);
4182 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184 if (pVBInfo->IF_DEF_LVDS == 0)
4185 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo); /* DVO/DVI signal off */
4186 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304188 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004189}
4190
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004191static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004192{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004193 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304194 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004195
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004196 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004198}
4199
Randy Dunlap89229672010-08-10 08:46:44 -07004200#if 0
Randy Dunlap89229672010-08-10 08:46:44 -07004201static void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004202{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004203 while (!(inb(pVBInfo->P3da) & 0x01));
4204 while (inb(pVBInfo->P3da) & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004205}
Randy Dunlap89229672010-08-10 08:46:44 -07004206#endif
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004207
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004208static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004209{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304210 if (!(pVBInfo->SetFlag & Win9xDOSMode))
4211 XGINew_SetRegOR(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004212}
4213
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004214static void XGI_SaveCRT2Info(unsigned short ModeNo, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004215{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304216 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004217
Aaro Koskinen8104e322011-03-13 12:26:22 +02004218 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304219 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
4220 temp2 = ~(SetInSlaveMode >> 8);
4221 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004222}
4223
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004224static void XGI_GetCRT2ResInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304225 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004226{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304227 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004228
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304229 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
4230 if (ModeNo <= 0x13) {
4231 xres = pVBInfo->StResInfo[resindex].HTotal;
4232 yres = pVBInfo->StResInfo[resindex].VTotal;
4233 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; si+St_ResInfo */
4234 } else {
4235 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4236 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4237 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004238
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304239 /*
4240 if (pVBInfo->IF_DEF_FSTN) {
4241 xres *= 2;
4242 yres *= 2;
4243 } else {
4244 */
4245 if (modeflag & HalfDCLK)
4246 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004247
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304248 if (modeflag & DoubleScanMode)
4249 yres *= 2;
4250 /* } */
4251 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304253 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4254 if (pVBInfo->IF_DEF_LVDS == 0) {
4255 if (pVBInfo->LCDResInfo == Panel1600x1200) {
4256 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4257 if (yres == 1024)
4258 yres = 1056;
4259 }
4260 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304262 if (pVBInfo->LCDResInfo == Panel1280x1024) {
4263 if (yres == 400)
4264 yres = 405;
4265 else if (yres == 350)
4266 yres = 360;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004267
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304268 if (pVBInfo->LCDInfo & LCDVESATiming) {
4269 if (yres == 360)
4270 yres = 375;
4271 }
4272 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004273
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304274 if (pVBInfo->LCDResInfo == Panel1024x768) {
4275 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4276 if (!(pVBInfo->LCDInfo
4277 & LCDNonExpanding)) {
4278 if (yres == 350)
4279 yres = 357;
4280 else if (yres == 400)
4281 yres = 420;
4282 else if (yres == 480)
4283 yres = 525;
4284 }
4285 }
4286 }
4287 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004288
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304289 if (xres == 720)
4290 xres = 640;
4291 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304293 pVBInfo->VGAHDE = xres;
4294 pVBInfo->HDE = xres;
4295 pVBInfo->VGAVDE = yres;
4296 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004297}
4298
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004299static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004300{
4301
Dan Carpentera65fd092011-01-04 09:02:27 +03004302 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
4303 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004305
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304306 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004307}
4308
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004309static void XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex,
4310 unsigned short RefreshRateTableIndex,
4311 struct vb_device_info *pVBInfo)
4312{
4313 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
4314 StandTableIndex, CRT1Index;
4315
4316 pVBInfo->RVBHCMAX = 1;
4317 pVBInfo->RVBHCFACT = 1;
4318
4319 if (ModeNo <= 0x13) {
4320 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4321 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
4322 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
4323 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
4324 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
4325 } else {
4326 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4327 CRT1Index
4328 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4329 CRT1Index &= IndexMask;
4330 temp1
4331 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
4332 temp2
4333 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4334 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
4335 tempbx
4336 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
4337 tempcx
4338 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14]
4339 << 8;
4340 tempcx &= 0x0100;
4341 tempcx = tempcx << 2;
4342 tempbx |= tempcx;
4343 temp1
4344 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
4345 }
4346
4347 if (temp1 & 0x01)
4348 tempbx |= 0x0100;
4349
4350 if (temp1 & 0x20)
4351 tempbx |= 0x0200;
4352 tempax += 5;
4353
4354 if (modeflag & Charx8Dot)
4355 tempax *= 8;
4356 else
4357 tempax *= 9;
4358
4359 pVBInfo->VGAHT = tempax;
4360 pVBInfo->HT = tempax;
4361 tempbx++;
4362 pVBInfo->VGAVT = tempbx;
4363 pVBInfo->VT = tempbx;
4364}
4365
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004366static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304367 unsigned short RefreshRateTableIndex,
4368 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004369{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004371
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304372 struct XGI_LCDDataStruct *LCDPtr = NULL;
4373 struct XGI_TVDataStruct *TVPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304375 if (ModeNo <= 0x13) {
4376 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
4377 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4378 } else {
4379 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
4380 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4381 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004382
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304383 pVBInfo->NewFlickerMode = 0;
4384 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304386 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4387 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4388 pVBInfo);
4389 return;
4390 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4395 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4396 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4397 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004398
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304399 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4400 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4401 pVBInfo->VGAHT = LCDPtr->VGAHT;
4402 pVBInfo->VGAVT = LCDPtr->VGAVT;
4403 pVBInfo->HT = LCDPtr->LCDHT;
4404 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304406 if (pVBInfo->LCDResInfo == Panel1024x768) {
4407 tempax = 1024;
4408 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004409
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304410 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4411 if (pVBInfo->VGAVDE == 357)
4412 tempbx = 527;
4413 else if (pVBInfo->VGAVDE == 420)
4414 tempbx = 620;
4415 else if (pVBInfo->VGAVDE == 525)
4416 tempbx = 775;
4417 else if (pVBInfo->VGAVDE == 600)
4418 tempbx = 775;
4419 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4420 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4421 else
4422 tempbx = 768;
4423 } else
4424 tempbx = 768;
4425 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4426 tempax = 1024;
4427 tempbx = 768;
4428 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4429 tempax = 1280;
4430 if (pVBInfo->VGAVDE == 360)
4431 tempbx = 768;
4432 else if (pVBInfo->VGAVDE == 375)
4433 tempbx = 800;
4434 else if (pVBInfo->VGAVDE == 405)
4435 tempbx = 864;
4436 else
4437 tempbx = 1024;
4438 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4439 tempax = 1280;
4440 tempbx = 1024;
4441 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4442 tempax = 1280;
4443 if (pVBInfo->VGAVDE == 350)
4444 tempbx = 700;
4445 else if (pVBInfo->VGAVDE == 400)
4446 tempbx = 800;
4447 else if (pVBInfo->VGAVDE == 1024)
4448 tempbx = 960;
4449 else
4450 tempbx = 960;
4451 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4452 tempax = 1400;
4453 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304455 if (pVBInfo->VGAVDE == 1024) {
4456 tempax = 1280;
4457 tempbx = 1024;
4458 }
4459 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4460 tempax = 1600;
4461 tempbx = 1200; /* alan 10/14/2003 */
4462 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4463 if (pVBInfo->VGAVDE == 350)
4464 tempbx = 875;
4465 else if (pVBInfo->VGAVDE == 400)
4466 tempbx = 1000;
4467 }
4468 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004469
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304470 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4471 tempax = pVBInfo->VGAHDE;
4472 tempbx = pVBInfo->VGAVDE;
4473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004474
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304475 pVBInfo->HDE = tempax;
4476 pVBInfo->VDE = tempbx;
4477 return;
4478 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304480 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4481 tempbx = 4;
4482 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4483 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4484 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304486 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4487 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4488 pVBInfo->VGAHT = TVPtr->VGAHT;
4489 pVBInfo->VGAVT = TVPtr->VGAVT;
4490 pVBInfo->HDE = TVPtr->TVHDE;
4491 pVBInfo->VDE = TVPtr->TVVDE;
4492 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4493 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004494
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304495 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4496 if (resinfo == 0x08)
4497 pVBInfo->NewFlickerMode = 0x40;
4498 else if (resinfo == 0x09)
4499 pVBInfo->NewFlickerMode = 0x40;
4500 else if (resinfo == 0x12)
4501 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304503 if (pVBInfo->VGAVDE == 350)
4504 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304506 tempax = ExtHiTVHT;
4507 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004508
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304509 if (pVBInfo->VBInfo & SetInSlaveMode) {
4510 if (pVBInfo->TVInfo & TVSimuMode) {
4511 tempax = StHiTVHT;
4512 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004513
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304514 if (!(modeflag & Charx8Dot)) {
4515 tempax = StHiTextTVHT;
4516 tempbx = StHiTextTVVT;
4517 }
4518 }
4519 }
4520 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4521 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4522 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4523 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4524 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004525
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304526 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4527 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4528 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4529 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4530 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4531 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4532 if (pVBInfo->TVInfo & NTSC1024x768)
4533 tempax = NTSC1024x768HT;
4534 }
4535 } else {
4536 tempax = PALHT;
4537 tempbx = PALVT;
4538 if (!(pVBInfo->TVInfo & SetPALTV)) {
4539 tempax = NTSCHT;
4540 tempbx = NTSCVT;
4541 if (pVBInfo->TVInfo & NTSC1024x768)
4542 tempax = NTSC1024x768HT;
4543 }
4544 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004545
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304546 pVBInfo->HT = tempax;
4547 pVBInfo->VT = tempbx;
4548 return;
4549 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004550}
4551
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004552static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 unsigned short RefreshRateTableIndex,
4554 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004555{
Bill Pemberton108afbf2010-06-17 13:10:47 -04004556 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004557
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304558 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4559 pVBInfo);
4560 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4561 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004562
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304563 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4564 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004565 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4566 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4567 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304568 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004569 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4570 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304571 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004572
Aaro Koskinen8104e322011-03-13 12:26:22 +02004573 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304575 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
4576 XGINew_SetRegOR(pVBInfo->Part4Port, 0x12, 0x28);
4577 else
4578 XGINew_SetRegOR(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004579}
4580
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004581static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4582 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004583{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004584 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4585 short index;
4586 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304587
4588 if (ModeNo <= 0x13)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004589 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304590 else
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004591 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304592
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004593 index = (modeflag & ModeInfoFlag) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304594
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004595 if (index < 0)
4596 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304597
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004598 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304599}
4600
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004601static unsigned short XGI_GetOffset(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304602 unsigned short RefreshRateTableIndex,
4603 struct xgi_hw_device_info *HwDeviceExtension,
4604 struct vb_device_info *pVBInfo)
4605{
4606 unsigned short temp, colordepth, modeinfo, index, infoflag,
4607 ColorDepth[] = { 0x01, 0x02, 0x04 };
4608
4609 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4610 if (ModeNo <= 0x14)
4611 infoflag = 0;
4612 else
4613 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
4614
4615 index = (modeinfo >> 8) & 0xFF;
4616
4617 temp = pVBInfo->ScreenOffset[index];
4618
4619 if (infoflag & InterlaceMode)
4620 temp = temp << 1;
4621
4622 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4623
4624 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4625 temp = ModeNo - 0x7C;
4626 colordepth = ColorDepth[temp];
4627 temp = 0x6B;
4628 if (infoflag & InterlaceMode)
4629 temp = temp << 1;
4630 return temp * colordepth;
4631 } else {
4632 return temp * colordepth;
4633 }
4634}
4635
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004636static void XGI_SetCRT2Offset(unsigned short ModeNo,
4637 unsigned short ModeIdIndex,
4638 unsigned short RefreshRateTableIndex,
4639 struct xgi_hw_device_info *HwDeviceExtension,
4640 struct vb_device_info *pVBInfo)
4641{
4642 unsigned short offset;
4643 unsigned char temp;
4644
4645 if (pVBInfo->VBInfo & SetInSlaveMode)
4646 return;
4647
4648 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4649 HwDeviceExtension, pVBInfo);
4650 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004651 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004652 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004653 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004654 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004655 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004656}
4657
Randy Dunlap89229672010-08-10 08:46:44 -07004658static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004659{
Aaro Koskinen8104e322011-03-13 12:26:22 +02004660 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B); /* threshold high ,disable auto threshold */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04); /* threshold low default 04h */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004662}
4663
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004664static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304665 struct xgi_hw_device_info *HwDeviceExtension,
4666 unsigned short RefreshRateTableIndex,
4667 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004668{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304669 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304671 if (ModeNo > 0x13) {
4672 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4673 CRT1Index &= IndexMask;
4674 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4675 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004676
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304677 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4678 HwDeviceExtension, pVBInfo);
4679 XGI_SetCRT2FIFO(pVBInfo);
4680 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004681
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304682 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004683 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004684
Aaro Koskinen8104e322011-03-13 12:26:22 +02004685 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4686 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004687}
4688
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004689static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304690 struct xgi_hw_device_info *HwDeviceExtension,
4691 unsigned short RefreshRateTableIndex,
4692 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004693{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304694 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4695 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004696
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304697 if (ModeNo > 0x13) {
4698 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4699 CRT1Index &= IndexMask;
4700 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004701 }
4702
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304703 if (ModeNo <= 0x13)
4704 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4705 else
4706 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304708 /* bainy change table name */
4709 if (modeflag & HalfDCLK) {
4710 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004711 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304712 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
4713 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
4714 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004715 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4717 pushbx = pVBInfo->VGAHDE / 2 + 16;
4718 tempcx = tempcx >> 1;
4719 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4720 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004721
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304722 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4723 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4724 tempbx |= ((pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14]
4725 & 0xC0) << 2);
4726 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4727 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4728 tempcx &= 0x1F;
4729 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4730 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4731 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4732 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304734 tempbx += 4;
4735 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004736
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304737 if (tempcx > (pVBInfo->VGAHT / 2))
4738 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304740 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004741
Aaro Koskinen8104e322011-03-13 12:26:22 +02004742 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304743 } else {
4744 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004745 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304746 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
4747 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
4748 temp = (pVBInfo->VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004749 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304750 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4751 pushbx = pVBInfo->VGAHDE + 16;
4752 tempcx = tempcx >> 1;
4753 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4754 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304756 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4757 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
4758 tempbx |= ((pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5]
4759 & 0xC0) << 2);
4760 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4761 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4762 tempcx &= 0x1F;
4763 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4764 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4765 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4766 tempbx += 16;
4767 tempcx += 16;
4768 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304770 if (tempcx > pVBInfo->VGAHT)
4771 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304773 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004774 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304775 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304777 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4778 tempbx = pushbx;
4779 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4780 tempax |= (tempbx & 0xFF00);
4781 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004782 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304783 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004784 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304785 tempcx = (pVBInfo->VGAVT - 1);
4786 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304788 if (pVBInfo->IF_DEF_CH7005 == 1) {
4789 if (pVBInfo->VBInfo & 0x0C)
4790 temp--;
4791 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Aaro Koskinen8104e322011-03-13 12:26:22 +02004793 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304794 tempbx = pVBInfo->VGAVDE - 1;
4795 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004796 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 temp = ((tempbx & 0xFF00) << 3) >> 8;
4798 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004799 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304801 tempax = pVBInfo->VGAVDE;
4802 tempbx = pVBInfo->VGAVDE;
4803 tempcx = pVBInfo->VGAVT;
4804 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */
4805 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4808 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4809 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004810
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304811 if (temp & 0x04)
4812 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004813
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304814 if (temp & 0x080)
4815 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304817 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304819 if (temp & 0x08)
4820 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004821
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304822 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4823 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4824 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304826 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004827 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304828 temp = ((tempbx & 0xFF00) >> 8) << 4;
4829 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004830 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304831 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304833 if (modeflag & DoubleScanMode)
4834 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004835
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304836 if (modeflag & HalfDCLK)
4837 tempax |= 0x40;
4838
4839 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004840}
4841
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004842static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4843{
4844 unsigned long tempax, tempbx;
4845
4846 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4847 & 0xFFFF;
4848 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4849 tempax = (tempax * pVBInfo->HT) / tempbx;
4850
4851 return (unsigned short) tempax;
4852}
4853
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004854static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304855 struct xgi_hw_device_info *HwDeviceExtension,
4856 unsigned short RefreshRateTableIndex,
4857 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004858{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304859 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4860 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304862 if (ModeNo <= 0x13) {
4863 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
4864 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4865 } else {
4866 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
4867 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4868 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4869 CRT1Index &= IndexMask;
4870 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304872 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4873 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004874
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304875 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004876 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304877 /* if (modeflag & Charx8Dot) */
4878 /* tempcx = 0x08; */
4879 /* else */
4880 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304882 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4883 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304885 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304887 if (modeflag & HalfDCLK)
4888 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004889
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304890 tempax = (tempax / tempcx) - 1;
4891 tempbx |= ((tempax & 0x00FF) << 8);
4892 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004893 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004894
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304895 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304897 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4898 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
4899 | VB_XGI302LV | VB_XGI301C)))
4900 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4903 if (pVBInfo->VBType & VB_XGI301LV) {
4904 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
4905 if (resinfo == 7)
4906 temp -= 2;
4907 }
4908 } else if (resinfo == 7) {
4909 temp -= 2;
4910 }
4911 }
4912 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004913
Aaro Koskinen8104e322011-03-13 12:26:22 +02004914 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */
4915 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03); /* 0x06 Horizontal Blank end */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304917 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
4918 if (pVBInfo->VBInfo & SetCRT2ToTV)
4919 tempax = pVBInfo->VGAHT;
4920 else
4921 tempax = XGI_GetVGAHT2(pVBInfo);
4922 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304924 if (tempax >= pVBInfo->VGAHT)
4925 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004926
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304927 if (modeflag & HalfDCLK)
4928 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304930 tempax = (tempax / tempcx) - 5;
4931 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
4932 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4933 temp = (tempbx & 0x00FF) - 1;
4934 if (!(modeflag & HalfDCLK)) {
4935 temp -= 6;
4936 if (pVBInfo->TVInfo & TVSimuMode) {
4937 temp -= 4;
4938 if (ModeNo > 0x13)
4939 temp -= 10;
4940 }
4941 }
4942 } else {
4943 /* tempcx = tempbx & 0x00FF ; */
4944 tempbx = (tempbx & 0xFF00) >> 8;
4945 tempcx = (tempcx + tempbx) >> 1;
4946 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004947
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304948 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4949 temp -= 1;
4950 if (!(modeflag & HalfDCLK)) {
4951 if ((modeflag & Charx8Dot)) {
4952 temp += 4;
4953 if (pVBInfo->VGAHDE >= 800)
4954 temp -= 6;
4955 }
4956 }
4957 } else {
4958 if (!(modeflag & HalfDCLK)) {
4959 temp -= 4;
4960 if (pVBInfo->LCDResInfo != Panel1280x960) {
4961 if (pVBInfo->VGAHDE >= 800) {
4962 temp -= 7;
4963 if (pVBInfo->ModeType
4964 == ModeEGA) {
4965 if (pVBInfo->VGAVDE
4966 == 1024) {
4967 temp += 15;
4968 if (pVBInfo->LCDResInfo
4969 != Panel1280x1024) {
4970 temp
4971 += 7;
4972 }
4973 }
4974 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304976 if (pVBInfo->VGAHDE >= 1280) {
4977 if (pVBInfo->LCDResInfo
4978 != Panel1280x960) {
4979 if (pVBInfo->LCDInfo
4980 & LCDNonExpanding) {
4981 temp
4982 += 28;
4983 }
4984 }
4985 }
4986 }
4987 }
4988 }
4989 }
4990 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004991
Aaro Koskinen8104e322011-03-13 12:26:22 +02004992 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */
4993 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0); /* 0x08 Horizontal Retrace End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304995 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4996 if (pVBInfo->TVInfo & TVSimuMode) {
4997 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
4998 == 0x11) || (ModeNo == 0x13) || (ModeNo
4999 == 0x0F)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005000 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
5001 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305002 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305004 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
5005 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005006 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305007 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005008 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305009 0x08, 0x61);
5010 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005011 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305012 0x07, 0x2A);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005013 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305014 0x08, 0x41);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005015 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 0x0C, 0xF0);
5017 }
5018 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305020 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
5021 == 0x07)) {
5022 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005023 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305024 0x07, 0x54);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005025 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305026 0x08, 0x00);
5027 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005028 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305029 0x07, 0x55);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005030 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305031 0x08, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005032 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305033 0x0C, 0xF0);
5034 }
5035 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305037 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
5038 == 0x0D) || (ModeNo == 0x50)) {
5039 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005040 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305041 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005042 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305043 0x08, 0x03);
5044 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005045 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305046 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005047 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305048 0x08, 0x02);
5049 }
5050 }
5051 }
5052 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005053
Aaro Koskinen8104e322011-03-13 12:26:22 +02005054 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305055 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005056 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005057
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305058 tempbx = pVBInfo->VGAVT;
5059 push1 = tempbx;
5060 tempcx = 0x121;
5061 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305063 if (tempbx == 357)
5064 tempbx = 350;
5065 if (tempbx == 360)
5066 tempbx = 350;
5067 if (tempbx == 375)
5068 tempbx = 350;
5069 if (tempbx == 405)
5070 tempbx = 400;
5071 if (tempbx == 525)
5072 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005073
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305074 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005075
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305076 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5077 if (pVBInfo->LCDResInfo == Panel1024x768) {
5078 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5079 if (tempbx == 350)
5080 tempbx += 5;
5081 if (tempbx == 480)
5082 tempbx += 5;
5083 }
5084 }
5085 }
5086 tempbx--;
5087 temp = tempbx & 0x00FF;
5088 tempbx--;
5089 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005090 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305091 tempbx = push2;
5092 tempbx--;
5093 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005094 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005095
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305096 if (tempbx & 0x0100)
5097 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305099 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305101 if (modeflag & DoubleScanMode)
5102 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305104 if (tempbx & 0x0200)
5105 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005106
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305107 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005108 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305110 if (tempbx & 0x0400)
5111 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005112
Aaro Koskinen8104e322011-03-13 12:26:22 +02005113 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00); /* 0x11 Vertival Blank End */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305114
5115 tempax = push1;
5116 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
5117 tempax = tempax >> 2;
5118 push1 = tempax; /* push ax */
5119
5120 if (resinfo != 0x09) {
5121 tempax = tempax << 1;
5122 tempbx += tempax;
5123 }
5124
5125 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5126 if (pVBInfo->VBType & VB_XGI301LV) {
5127 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5128 tempbx -= 10;
5129 } else {
5130 if (pVBInfo->TVInfo & TVSimuMode) {
5131 if (pVBInfo->TVInfo & SetPALTV) {
5132 if (pVBInfo->VBType
5133 & VB_XGI301LV) {
5134 if (!(pVBInfo->TVInfo
5135 & (SetYPbPrMode525p
5136 | SetYPbPrMode750p
5137 | SetYPbPrMode1080i)))
5138 tempbx += 40;
5139 } else {
5140 tempbx += 40;
5141 }
5142 }
5143 }
5144 }
5145 } else {
5146 tempbx -= 10;
5147 }
5148 } else {
5149 if (pVBInfo->TVInfo & TVSimuMode) {
5150 if (pVBInfo->TVInfo & SetPALTV) {
5151 if (pVBInfo->VBType & VB_XGI301LV) {
5152 if (!(pVBInfo->TVInfo
5153 & (SetYPbPrMode525p
5154 | SetYPbPrMode750p
5155 | SetYPbPrMode1080i)))
5156 tempbx += 40;
5157 } else {
5158 tempbx += 40;
5159 }
5160 }
5161 }
5162 }
5163 tempax = push1;
5164 tempax = tempax >> 2;
5165 tempax++;
5166 tempax += tempbx;
5167 push1 = tempax; /* push ax */
5168
5169 if ((pVBInfo->TVInfo & SetPALTV)) {
5170 if (tempbx <= 513) {
5171 if (tempax >= 513)
5172 tempbx = 513;
5173 }
5174 }
5175
5176 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005177 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305178 tempbx--;
5179 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005180 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305181
5182 if (tempbx & 0x0100)
5183 tempcx |= 0x0008;
5184
5185 if (tempbx & 0x0200)
5186 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
5187
5188 tempbx++;
5189
5190 if (tempbx & 0x0100)
5191 tempcx |= 0x0004;
5192
5193 if (tempbx & 0x0200)
5194 tempcx |= 0x0080;
5195
5196 if (tempbx & 0x0400)
5197 tempcx |= 0x0C00;
5198
5199 tempbx = push1; /* pop ax */
5200 temp = tempbx & 0x00FF;
5201 temp &= 0x0F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005202 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305203
5204 if (tempbx & 0x0010)
5205 tempcx |= 0x2000;
5206
5207 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005208 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305209 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005210 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305211 tempax = modeflag;
5212 temp = (tempax & 0xFF00) >> 8;
5213
5214 temp = (temp >> 1) & 0x09;
5215
5216 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
5217 temp |= 0x01;
5218
Aaro Koskinen8104e322011-03-13 12:26:22 +02005219 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
5220 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
5221 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305222
5223 if (pVBInfo->LCDInfo & LCDRGB18Bit)
5224 temp = 0x80;
5225 else
5226 temp = 0x00;
5227
Aaro Koskinen8104e322011-03-13 12:26:22 +02005228 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305229
5230 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005231}
5232
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005233static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305234 unsigned short RefreshRateTableIndex,
5235 struct xgi_hw_device_info *HwDeviceExtension,
5236 struct vb_device_info *pVBInfo)
5237{
5238 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
5239 modeflag, resinfo, crt2crtc;
5240 unsigned char *TimingPoint;
5241
5242 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
5243
5244 if (ModeNo <= 0x13) {
5245 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
5246 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5247 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5248 } else {
5249 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
5250 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
5251 crt2crtc
5252 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
5253 }
5254
5255 tempax = 0;
5256
5257 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
5258 tempax |= 0x0800;
5259
5260 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5261 tempax |= 0x0400;
5262
5263 if (pVBInfo->VBInfo & SetCRT2ToSCART)
5264 tempax |= 0x0200;
5265
5266 if (!(pVBInfo->TVInfo & SetPALTV))
5267 tempax |= 0x1000;
5268
5269 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5270 tempax |= 0x0100;
5271
5272 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
5273 tempax &= 0xfe00;
5274
5275 tempax = (tempax & 0xff00) >> 8;
5276
Aaro Koskinen8104e322011-03-13 12:26:22 +02005277 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305278 TimingPoint = pVBInfo->NTSCTiming;
5279
5280 if (pVBInfo->TVInfo & SetPALTV)
5281 TimingPoint = pVBInfo->PALTiming;
5282
5283 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5284 TimingPoint = pVBInfo->HiTVExtTiming;
5285
5286 if (pVBInfo->VBInfo & SetInSlaveMode)
5287 TimingPoint = pVBInfo->HiTVSt2Timing;
5288
5289 if (pVBInfo->SetFlag & TVSimuMode)
5290 TimingPoint = pVBInfo->HiTVSt1Timing;
5291
5292 if (!(modeflag & Charx8Dot))
5293 TimingPoint = pVBInfo->HiTVTextTiming;
5294 }
5295
5296 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5297 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5298 TimingPoint = pVBInfo->YPbPr525iTiming;
5299
5300 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5301 TimingPoint = pVBInfo->YPbPr525pTiming;
5302
5303 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5304 TimingPoint = pVBInfo->YPbPr750pTiming;
5305 }
5306
5307 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005308 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305309
5310 for (i = 0x39; i <= 0x45; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005311 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]); /* di->temp2[j] */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312
5313 if (pVBInfo->VBInfo & SetCRT2ToTV)
5314 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
5315
5316 temp = pVBInfo->NewFlickerMode;
5317 temp &= 0x80;
5318 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
5319
5320 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5321 tempax = 950;
5322
5323 if (pVBInfo->TVInfo & SetPALTV)
5324 tempax = 520;
5325 else
5326 tempax = 440;
5327
5328 if (pVBInfo->VDE <= tempax) {
5329 tempax -= pVBInfo->VDE;
5330 tempax = tempax >> 2;
5331 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
5332 push1 = tempax;
5333 temp = (tempax & 0xFF00) >> 8;
5334 temp += (unsigned short) TimingPoint[0];
5335
5336 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5337 | VB_XGI302LV | VB_XGI301C)) {
5338 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5339 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5340 | SetCRT2ToYPbPr)) {
5341 tempcx = pVBInfo->VGAHDE;
5342 if (tempcx >= 1024) {
5343 temp = 0x17; /* NTSC */
5344 if (pVBInfo->TVInfo & SetPALTV)
5345 temp = 0x19; /* PAL */
5346 }
5347 }
5348 }
5349
Aaro Koskinen8104e322011-03-13 12:26:22 +02005350 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305351 tempax = push1;
5352 temp = (tempax & 0xFF00) >> 8;
5353 temp += TimingPoint[1];
5354
5355 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5356 | VB_XGI302LV | VB_XGI301C)) {
5357 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5358 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5359 | SetCRT2ToYPbPr))) {
5360 tempcx = pVBInfo->VGAHDE;
5361 if (tempcx >= 1024) {
5362 temp = 0x1D; /* NTSC */
5363 if (pVBInfo->TVInfo & SetPALTV)
5364 temp = 0x52; /* PAL */
5365 }
5366 }
5367 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005368 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305369 }
5370
5371 /* 301b */
5372 tempcx = pVBInfo->HT;
5373
5374 if (XGI_IsLCDDualLink(pVBInfo))
5375 tempcx = tempcx >> 1;
5376
5377 tempcx -= 2;
5378 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005379 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305380
5381 temp = (tempcx & 0xFF00) >> 8;
5382 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
5383
5384 tempcx = pVBInfo->HT >> 1;
5385 push1 = tempcx; /* push cx */
5386 tempcx += 7;
5387
5388 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5389 tempcx -= 4;
5390
5391 temp = tempcx & 0x00FF;
5392 temp = temp << 4;
5393 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x22, 0x0F, temp);
5394
5395 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5396 tempbx += tempcx;
5397 push2 = tempbx;
5398 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005399 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305400 temp = (tempbx & 0xFF00) >> 8;
5401 temp = temp << 4;
5402 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x25, 0x0F, temp);
5403
5404 tempbx = push2;
5405 tempbx = tempbx + 8;
5406 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5407 tempbx = tempbx - 4;
5408 tempcx = tempbx;
5409 }
5410
5411 temp = (tempbx & 0x00FF) << 4;
5412 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x29, 0x0F, temp);
5413
5414 j += 2;
5415 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5416 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005417 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305418 temp = ((tempcx & 0xFF00) >> 8) << 4;
5419 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x28, 0x0F, temp);
5420
5421 tempcx += 8;
5422 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5423 tempcx -= 4;
5424
5425 temp = tempcx & 0xFF;
5426 temp = temp << 4;
5427 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
5428
5429 tempcx = push1; /* pop cx */
5430 j += 2;
5431 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5432 tempcx -= temp;
5433 temp = tempcx & 0x00FF;
5434 temp = temp << 4;
5435 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
5436
5437 tempcx -= 11;
5438
5439 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5440 tempax = XGI_GetVGAHT2(pVBInfo);
5441 tempcx = tempax - 1;
5442 }
5443 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005444 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305445
5446 tempbx = pVBInfo->VDE;
5447
5448 if (pVBInfo->VGAVDE == 360)
5449 tempbx = 746;
5450 if (pVBInfo->VGAVDE == 375)
5451 tempbx = 746;
5452 if (pVBInfo->VGAVDE == 405)
5453 tempbx = 853;
5454
5455 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5456 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5457 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5458 | SetYPbPrMode750p)))
5459 tempbx = tempbx >> 1;
5460 } else
5461 tempbx = tempbx >> 1;
5462 }
5463
5464 tempbx -= 2;
5465 temp = tempbx & 0x00FF;
5466
5467 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5468 if (pVBInfo->VBType & VB_XGI301LV) {
5469 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5470 if (pVBInfo->VBInfo & SetInSlaveMode) {
5471 if (ModeNo == 0x2f)
5472 temp += 1;
5473 }
5474 }
5475 } else {
5476 if (pVBInfo->VBInfo & SetInSlaveMode) {
5477 if (ModeNo == 0x2f)
5478 temp += 1;
5479 }
5480 }
5481 }
5482
Aaro Koskinen8104e322011-03-13 12:26:22 +02005483 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305484
5485 temp = (tempcx & 0xFF00) >> 8;
5486 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5487
5488 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5489 if (pVBInfo->VBType & VB_XGI301LV) {
5490 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5491 temp |= 0x10;
5492
5493 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5494 temp |= 0x20;
5495 }
5496 } else {
5497 temp |= 0x10;
5498 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5499 temp |= 0x20;
5500 }
5501 }
5502
Aaro Koskinen8104e322011-03-13 12:26:22 +02005503 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305504
5505 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5506 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5507 tempbx = pVBInfo->VDE;
5508 tempcx = tempbx - 2;
5509
5510 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5511 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5512 | SetYPbPrMode750p)))
5513 tempbx = tempbx >> 1;
5514 }
5515
5516 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5517 temp = 0;
5518 if (tempcx & 0x0400)
5519 temp |= 0x20;
5520
5521 if (tempbx & 0x0400)
5522 temp |= 0x40;
5523
Aaro Koskinen8104e322011-03-13 12:26:22 +02005524 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305525 }
5526
5527 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005528 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305529 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005530 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305531 }
5532
5533 tempbx = tempbx & 0x00FF;
5534
5535 if (!(modeflag & HalfDCLK)) {
5536 tempcx = pVBInfo->VGAHDE;
5537 if (tempcx >= pVBInfo->HDE) {
5538 tempbx |= 0x2000;
5539 tempax &= 0x00FF;
5540 }
5541 }
5542
5543 tempcx = 0x0101;
5544
5545 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5546 if (pVBInfo->VGAHDE >= 1024) {
5547 tempcx = 0x1920;
5548 if (pVBInfo->VGAHDE >= 1280) {
5549 tempcx = 0x1420;
5550 tempbx = tempbx & 0xDFFF;
5551 }
5552 }
5553 }
5554
5555 if (!(tempbx & 0x2000)) {
5556 if (modeflag & HalfDCLK)
5557 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5558
5559 push1 = tempbx;
5560 tempeax = pVBInfo->VGAHDE;
5561 tempebx = (tempcx & 0xFF00) >> 8;
5562 longtemp = tempeax * tempebx;
5563 tempecx = tempcx & 0x00FF;
5564 longtemp = longtemp / tempecx;
5565
5566 /* 301b */
5567 tempecx = 8 * 1024;
5568
5569 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5570 | VB_XGI302LV | VB_XGI301C)) {
5571 tempecx = tempecx * 8;
5572 }
5573
5574 longtemp = longtemp * tempecx;
5575 tempecx = pVBInfo->HDE;
5576 temp2 = longtemp % tempecx;
5577 tempeax = longtemp / tempecx;
5578 if (temp2 != 0)
5579 tempeax += 1;
5580
5581 tempax = (unsigned short) tempeax;
5582
5583 /* 301b */
5584 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5585 | VB_XGI302LV | VB_XGI301C)) {
5586 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5587 }
5588 /* end 301b */
5589
5590 tempbx = push1;
5591 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5592 | (tempbx & 0x00FF));
5593 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5594 | (tempax & 0x00FF));
5595 temp = (tempax & 0xFF00) >> 8;
5596 } else {
5597 temp = (tempax & 0x00FF) >> 8;
5598 }
5599
Aaro Koskinen8104e322011-03-13 12:26:22 +02005600 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 temp = (tempbx & 0xFF00) >> 8;
5602 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
5603 temp = tempcx & 0x00FF;
5604
5605 if (tempbx & 0x2000)
5606 temp = 0;
5607
5608 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5609 temp |= 0x18;
5610
5611 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
5612 if (pVBInfo->TVInfo & SetPALTV) {
5613 tempbx = 0x0382;
5614 tempcx = 0x007e;
5615 } else {
5616 tempbx = 0x0369;
5617 tempcx = 0x0061;
5618 }
5619
5620 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005621 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305622 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005623 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305624
5625 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5626 temp = temp << 2;
5627 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5628
5629 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5630 temp |= 0x10;
5631
5632 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5633 temp |= 0x20;
5634
5635 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5636 temp |= 0x60;
5637 }
5638
Aaro Koskinen8104e322011-03-13 12:26:22 +02005639 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305640 temp = XGINew_GetReg1(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005641 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305642
5643 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5644 if (pVBInfo->TVInfo & NTSC1024x768) {
5645 TimingPoint = XGI_NTSC1024AdjTime;
5646 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005647 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 TimingPoint[j]);
5649 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005650 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305651 }
5652 }
5653
5654 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5655 if (pVBInfo->VBType & VB_XGI301C) {
5656 if (pVBInfo->TVInfo & SetPALMTV)
5657 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x4E, ~0x08,
5658 0x08); /* PALM Mode */
5659 }
5660
5661 if (pVBInfo->TVInfo & SetPALMTV) {
5662 tempax = (unsigned char) XGINew_GetReg1(pVBInfo->Part2Port,
5663 0x01);
5664 tempax--;
5665 XGINew_SetRegAND(pVBInfo->Part2Port, 0x01, tempax);
5666
5667 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
5668 XGINew_SetRegAND(pVBInfo->Part2Port, 0x00, 0xEF);
5669 }
5670
5671 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5672 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02005673 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305674 }
5675
5676 if (pVBInfo->VBInfo & SetCRT2ToTV)
5677 return;
5678}
5679
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005680static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305681 struct xgi_hw_device_info *HwDeviceExtension,
5682 unsigned short RefreshRateTableIndex,
5683 struct vb_device_info *pVBInfo)
5684{
5685 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5686 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5687
5688 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5689
5690 if (ModeNo <= 0x13) {
5691 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
5692 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5693 } else {
5694 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
5695 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
5696 CRT1Index
5697 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
5698 CRT1Index &= IndexMask;
5699 }
5700
5701 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5702 return;
5703
5704 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5705
5706 if (XGI_IsLCDDualLink(pVBInfo))
5707 tempbx = tempbx >> 1;
5708
5709 tempbx -= 1;
5710 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005711 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305712 temp = (tempbx & 0xFF00) >> 8;
5713 temp = temp << 4;
5714 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
5715 temp = 0x01;
5716
5717 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5718 if (pVBInfo->ModeType == ModeEGA) {
5719 if (pVBInfo->VGAHDE >= 1024) {
5720 temp = 0x02;
5721 if (pVBInfo->LCDInfo & LCDVESATiming)
5722 temp = 0x01;
5723 }
5724 }
5725 }
5726
Aaro Koskinen8104e322011-03-13 12:26:22 +02005727 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305728 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5729 push1 = tempbx;
5730 tempbx--;
5731 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005732 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305733 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
5734 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
5735
5736 tempcx = pVBInfo->VT - 1;
5737 push2 = tempcx + 1;
5738 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005739 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305740 temp = (tempcx & 0xFF00) >> 8;
5741 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005742 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305743 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5744 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5745 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5746 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
5747
5748 /* Customized LCDB Des no add */
5749 tempbx = 5;
5750 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5751 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5752 tempah = pVBInfo->LCDResInfo;
5753 tempah &= PanelResInfo;
5754
5755 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
5756 tempbx = 1024;
5757 tempcx = 768;
5758 } else if ((tempah == Panel1280x1024) || (tempah == Panel1280x1024x75)) {
5759 tempbx = 1280;
5760 tempcx = 1024;
5761 } else if (tempah == Panel1400x1050) {
5762 tempbx = 1400;
5763 tempcx = 1050;
5764 } else {
5765 tempbx = 1600;
5766 tempcx = 1200;
5767 }
5768
5769 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5770 tempbx = pVBInfo->HDE;
5771 tempcx = pVBInfo->VDE;
5772 }
5773
5774 pushbx = tempbx;
5775 tempax = pVBInfo->VT;
5776 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5777 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5778 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5779 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5780 tempbx = pVBInfo->LCDVDES;
5781 tempcx += tempbx;
5782
5783 if (tempcx >= tempax)
5784 tempcx -= tempax; /* lcdvdes */
5785
5786 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005787 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305788 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005789 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305790 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5791 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5792 tempah = tempch;
5793 tempah = tempah << 3;
5794 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005795 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305796
5797 /* getlcdsync() */
5798 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5799 tempcx = tempbx;
5800 tempax = pVBInfo->VT;
5801 tempbx = pVBInfo->LCDVRS;
5802
5803 /* if (SetLCD_Info & EnableScalingLCD) */
5804 tempcx += tempbx;
5805 if (tempcx >= tempax)
5806 tempcx -= tempax;
5807
5808 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005809 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305810 temp = (tempbx & 0xFF00) >> 8;
5811 temp = temp << 4;
5812 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005813 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305814 tempcx = pushbx;
5815 tempax = pVBInfo->HT;
5816 tempbx = pVBInfo->LCDHDES;
5817 tempbx &= 0x0FFF;
5818
5819 if (XGI_IsLCDDualLink(pVBInfo)) {
5820 tempax = tempax >> 1;
5821 tempbx = tempbx >> 1;
5822 tempcx = tempcx >> 1;
5823 }
5824
5825 if (pVBInfo->VBType & VB_XGI302LV)
5826 tempbx += 1;
5827
5828 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5829 tempbx += 1;
5830
5831 tempcx += tempbx;
5832
5833 if (tempcx >= tempax)
5834 tempcx -= tempax;
5835
5836 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005837 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305838 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005839 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305840 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005841 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305842 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005843 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305844
5845 /* getlcdsync() */
5846 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5847 tempcx = tempax;
5848 tempax = pVBInfo->HT;
5849 tempbx = pVBInfo->LCDHRS;
5850 /* if ( SetLCD_Info & EnableScalingLCD) */
5851 if (XGI_IsLCDDualLink(pVBInfo)) {
5852 tempax = tempax >> 1;
5853 tempbx = tempbx >> 1;
5854 tempcx = tempcx >> 1;
5855 }
5856
5857 if (pVBInfo->VBType & VB_XGI302LV)
5858 tempbx += 1;
5859
5860 tempcx += tempbx;
5861
5862 if (tempcx >= tempax)
5863 tempcx -= tempax;
5864
5865 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005866 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305867
5868 temp = (tempbx & 0xFF00) >> 8;
5869 temp = temp << 4;
5870 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
5871 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005872 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305873
5874 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5875 if (pVBInfo->VGAVDE == 525) {
5876 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5877 | VB_XGI301LV | VB_XGI302LV
5878 | VB_XGI301C)) {
5879 temp = 0xC6;
5880 } else
5881 temp = 0xC4;
5882
Aaro Koskinen8104e322011-03-13 12:26:22 +02005883 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
5884 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305885 }
5886
5887 if (pVBInfo->VGAVDE == 420) {
5888 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5889 | VB_XGI301LV | VB_XGI302LV
5890 | VB_XGI301C)) {
5891 temp = 0x4F;
5892 } else
5893 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005894 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305895 }
5896 }
5897}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005898
5899/* --------------------------------------------------------------------- */
5900/* Function : XGI_GetTap4Ptr */
5901/* Input : */
5902/* Output : di -> Tap4 Reg. Setting Pointer */
5903/* Description : */
5904/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005905static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305906 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005907{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305908 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005909
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305910 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005911
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305912 if (tempcx == 0) {
5913 tempax = pVBInfo->VGAHDE;
5914 tempbx = pVBInfo->HDE;
5915 } else {
5916 tempax = pVBInfo->VGAVDE;
5917 tempbx = pVBInfo->VDE;
5918 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305920 if (tempax < tempbx)
5921 return &EnlargeTap4Timing[0];
5922 else if (tempax == tempbx)
5923 return &NoScaleTap4Timing[0]; /* 1:1 */
5924 else
5925 Tap4TimingPtr = NTSCTap4Timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005926
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305927 if (pVBInfo->TVInfo & SetPALTV)
5928 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305930 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5931 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5932 Tap4TimingPtr = YPbPr525iTap4Timing;
5933 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5934 Tap4TimingPtr = YPbPr525pTap4Timing;
5935 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5936 Tap4TimingPtr = YPbPr750pTap4Timing;
5937 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305939 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5940 Tap4TimingPtr = HiTVTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305942 i = 0;
5943 while (Tap4TimingPtr[i].DE != 0xFFFF) {
5944 if (Tap4TimingPtr[i].DE == tempax)
5945 break;
5946 i++;
5947 }
5948 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005949}
5950
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005951static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005952{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305953 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005954
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305955 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305957 if (!(pVBInfo->VBType & VB_XGI301C))
5958 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005959
5960#ifndef Tap4
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305961 XGINew_SetRegAND(pVBInfo->Part2Port, 0x4E, 0xEB); /* Disable Tap4 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005962#else /* Tap4 Setting */
5963
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305964 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
5965 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005966 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305968 if ((pVBInfo->VBInfo & SetCRT2ToTV) && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
5969 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo); /* Set Vertical Scaling */
5970 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005971 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305972 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005973
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305974 if ((pVBInfo->VBInfo & SetCRT2ToTV) && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
5975 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04); /* Enable V.Scaling */
5976 else
5977 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10); /* Enable H.Scaling */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005978#endif
5979}
5980
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005981static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305982 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005983{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305984 unsigned short i;
5985 unsigned char *tempdi;
5986 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005987
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305988 if (ModeNo <= 0x13)
5989 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
5990 else
5991 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005992
Aaro Koskinen8104e322011-03-13 12:26:22 +02005993 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305994 if (pVBInfo->TVInfo & SetPALTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005995 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
5996 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305997 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005998 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
5999 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306002 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6003 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306005 if (pVBInfo->TVInfo & SetPALMTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02006006 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
6007 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
6008 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306009 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306011 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
6012 & SetCRT2ToYPbPr)) {
6013 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6014 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306016 tempdi = pVBInfo->HiTVGroup3Data;
6017 if (pVBInfo->SetFlag & TVSimuMode) {
6018 tempdi = pVBInfo->HiTVGroup3Simu;
6019 if (!(modeflag & Charx8Dot))
6020 tempdi = pVBInfo->HiTVGroup3Text;
6021 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006022
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306023 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6024 tempdi = pVBInfo->Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006025
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306026 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6027 tempdi = pVBInfo->Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306029 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006030 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306032 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
6033 if (pVBInfo->TVInfo & SetYPbPrMode525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006034 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306035 }
6036 }
6037 return;
6038} /* {end of XGI_SetGroup3} */
6039
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006040static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306041 unsigned short RefreshRateTableIndex,
6042 struct xgi_hw_device_info *HwDeviceExtension,
6043 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006044{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306045 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306047 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006048
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306049 if (ModeNo <= 0x13)
6050 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
6051 else
6052 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306054 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006055 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306057 tempbx = pVBInfo->RVBHCMAX;
6058 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006059 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306060 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
6061 tempcx = pVBInfo->VGAHT - 1;
6062 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006063 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306065 temp = ((tempcx & 0xFF00) >> 8) << 3;
6066 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006067
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306068 tempcx = pVBInfo->VGAVT - 1;
6069 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6070 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006071
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306072 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006073 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306074 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006075 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306076 XGINew_SetRegOR(pVBInfo->Part4Port, 0x0D, 0x08);
6077 tempcx = pVBInfo->VBInfo;
6078 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306080 if (modeflag & HalfDCLK)
6081 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006082
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306083 if (XGI_IsLCDDualLink(pVBInfo))
6084 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006085
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306086 if (tempcx & SetCRT2ToHiVisionTV) {
6087 temp = 0;
6088 if (tempbx <= 1024)
6089 temp = 0xA0;
6090 if (tempbx == 1280)
6091 temp = 0xC0;
6092 } else if (tempcx & SetCRT2ToTV) {
6093 temp = 0xA0;
6094 if (tempbx <= 800)
6095 temp = 0x80;
6096 } else {
6097 temp = 0x80;
6098 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6099 temp = 0;
6100 if (tempbx > 800)
6101 temp = 0x60;
6102 }
6103 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306105 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
6106 temp = 0x00;
6107 if (pVBInfo->VGAHDE == 1280)
6108 temp = 0x40;
6109 if (pVBInfo->VGAHDE == 1024)
6110 temp = 0x20;
6111 }
6112 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306114 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006115
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306116 if (tempcx & SetCRT2ToHiVisionTV) {
6117 if (!(temp & 0xE000))
6118 tempbx = tempbx >> 1;
6119 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306121 tempcx = pVBInfo->RVBHRS;
6122 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006123 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306125 tempeax = pVBInfo->VGAVDE;
6126 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006127
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306128 if (tempeax <= tempebx) {
6129 tempcx = (tempcx & (~0x4000));
6130 tempeax = pVBInfo->VGAVDE;
6131 } else {
6132 tempeax -= tempebx;
6133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006134
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306135 templong = (tempeax * 256 * 1024) % tempebx;
6136 tempeax = (tempeax * 256 * 1024) / tempebx;
6137 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306139 if (templong != 0)
6140 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306142 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006143 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306145 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006146 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306147 tempbx = (unsigned short) (tempebx >> 16);
6148 temp = tempbx & 0x00FF;
6149 temp = temp << 4;
6150 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006151 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306153 /* 301b */
6154 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6155 | VB_XGI302LV | VB_XGI301C)) {
6156 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006157 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306158 tempax = pVBInfo->VGAHDE;
6159 if (modeflag & HalfDCLK)
6160 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306162 if (XGI_IsLCDDualLink(pVBInfo))
6163 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006164
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306165 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */
6166 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6167 if (tempax > 800)
6168 tempax -= 800;
6169 } else {
6170 if (pVBInfo->VGAHDE > 800) {
6171 if (pVBInfo->VGAHDE == 1024)
6172 tempax = (tempax * 25 / 32) - 1;
6173 else
6174 tempax = (tempax * 20 / 32) - 1;
6175 }
6176 }
6177 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306179 /*
6180 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6181 if (pVBInfo->VBType & VB_XGI301LV) {
6182 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i))) {
6183 if (pVBInfo->VGAHDE > 800) {
6184 if (pVBInfo->VGAHDE == 1024)
6185 tempax = (tempax * 25 / 32) - 1;
6186 else
6187 tempax = (tempax * 20 / 32) - 1;
6188 }
6189 }
6190 } else {
6191 if (pVBInfo->VGAHDE > 800) {
6192 if (pVBInfo->VGAHDE == 1024)
6193 tempax = (tempax * 25 / 32) - 1;
6194 else
6195 tempax = (tempax * 20 / 32) - 1;
6196 }
6197 }
6198 }
6199 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006200
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306201 temp = (tempax & 0xFF00) >> 8;
6202 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006203 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306204 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006205 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006206
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306207 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6208 if (pVBInfo->VGAHDE > 800)
6209 XGINew_SetRegOR(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306211 }
6212 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306214 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6215 if (!(pVBInfo->TVInfo & (NTSC1024x768
6216 | SetYPbPrMode525p | SetYPbPrMode750p
6217 | SetYPbPrMode1080i))) {
6218 temp |= 0x0001;
6219 if ((pVBInfo->VBInfo & SetInSlaveMode)
6220 && (!(pVBInfo->TVInfo
6221 & TVSimuMode)))
6222 temp &= (~0x0001);
6223 }
6224 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006225
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306226 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
6227 tempbx = pVBInfo->HT;
6228 if (XGI_IsLCDDualLink(pVBInfo))
6229 tempbx = tempbx >> 1;
6230 tempbx = (tempbx >> 1) - 2;
6231 temp = ((tempbx & 0x0700) >> 8) << 3;
6232 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
6233 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006234 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306235 }
6236 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306238 if (pVBInfo->ISXPDOS == 0)
6239 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6240 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006241}
6242
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006243static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
6244{
6245 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
6246}
6247
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006248static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306249 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006250{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306251 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306253 Pindex = pVBInfo->Part5Port;
6254 Pdata = pVBInfo->Part5Port + 1;
6255 if (pVBInfo->ModeType == ModeVGA) {
6256 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
6257 | CRT2DisplayFlag))) {
6258 XGINew_EnableCRT2(pVBInfo);
6259 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
6260 }
6261 }
6262 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006263}
6264
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006265static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306266 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006267{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306268 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006269}
6270
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006271static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306272 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006273{
6274
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306275 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006276}
6277
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006278/*----------------------------------------------------------------------------*/
6279/* input */
6280/* bl[5] : 1;LVDS signal on */
6281/* bl[1] : 1;LVDS backlight on */
6282/* bl[0] : 1:LVDS VDD on */
6283/* bh: 100000b : clear bit 5, to set bit5 */
6284/* 000010b : clear bit 1, to set bit1 */
6285/* 000001b : clear bit 0, to set bit0 */
6286/*----------------------------------------------------------------------------*/
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306287void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6288 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006289{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306290 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006291
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306292 CR4A = XGINew_GetReg1(pVBInfo->P3d4, 0x4A);
6293 tempbh &= 0x23;
6294 tempbl &= 0x23;
6295 XGINew_SetRegAND(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306297 if (tempbh & 0x20) {
6298 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306300 XGINew_SetRegANDOR(pVBInfo->P3d4, 0xB4, ~0x02, temp); /* CR B4[1] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306302 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306304 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006305
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306306 temp = XG21GPIODataTransfer(temp);
6307 temp &= ~tempbh;
6308 temp |= tempbl;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006309 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006310}
6311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306312void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6313 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006314{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306315 unsigned char CR4A, temp;
6316 unsigned short tempbh0, tempbl0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306318 tempbh0 = tempbh;
6319 tempbl0 = tempbl;
6320 tempbh0 &= 0x20;
6321 tempbl0 &= 0x20;
6322 tempbh0 >>= 3;
6323 tempbl0 >>= 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306325 if (tempbh & 0x20) {
6326 temp = (tempbl >> 4) & 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306328 XGINew_SetRegANDOR(pVBInfo->P3d4, 0xB4, ~0x02, temp); /* CR B4[1] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006329
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306330 }
6331 XGINew_SetRegANDOR(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006332
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306333 CR4A = XGINew_GetReg1(pVBInfo->P3d4, 0x4A);
6334 tempbh &= 0x03;
6335 tempbl &= 0x03;
6336 tempbh <<= 2;
6337 tempbl <<= 2; /* GPIOC,GPIOD */
6338 XGINew_SetRegAND(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
6339 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006340}
6341
6342/* --------------------------------------------------------------------- */
Bill Pemberton80adad82010-06-17 13:10:51 -04006343unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006344{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306345 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006346
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306347 index = XGINew_GetReg1(pVBInfo->P3d4, 0x36);
6348 if (index < sizeof(XGI21_LCDCapList)
6349 / sizeof(struct XGI21_LVDSCapStruct))
6350 return index;
6351 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006352}
6353
6354/* --------------------------------------------------------------------- */
6355/* Function : XGI_XG21SetPanelDelay */
6356/* Input : */
6357/* Output : */
6358/* Description : */
6359/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6360/* : bl : 2 ; T2 : the duration signal on and Vdd on */
6361/* : bl : 3 ; T3 : the duration between CPL off and signal off */
6362/* : bl : 4 ; T4 : the duration signal off and Vdd off */
6363/* --------------------------------------------------------------------- */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306364void XGI_XG21SetPanelDelay(unsigned short tempbl,
6365 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006366{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306367 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306369 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6370 if (tempbl == 1)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006371 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306373 if (tempbl == 2)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006374 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006375
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306376 if (tempbl == 3)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006377 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006378
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306379 if (tempbl == 4)
Aaro Koskinend80aaa02011-02-17 23:29:14 +02006380 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006381}
6382
Bill Pemberton82d6eb52010-06-17 13:10:46 -04006383unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306384 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006385{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306386 unsigned short xres, yres, colordepth, modeflag, resindex,
6387 lvdstableindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006388
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306389 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6390 if (ModeNo <= 0x13) {
6391 xres = pVBInfo->StResInfo[resindex].HTotal;
6392 yres = pVBInfo->StResInfo[resindex].VTotal;
6393 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
6394 } else {
6395 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6396 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6397 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
6398 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306400 if (!(modeflag & Charx8Dot)) {
6401 xres /= 9;
6402 xres *= 8;
6403 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006404
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306405 if (ModeNo > 0x13) {
6406 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6407 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306409 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6410 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306412 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306414 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6415 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6416 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04006417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306418 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6419 return 0;
6420
6421 if (ModeNo > 0x13) {
6422 if ((xres
6423 != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6424 || (yres
6425 != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))) {
6426 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex,
6427 pVBInfo);
6428 if (colordepth > 2)
6429 return 0;
6430
6431 }
6432 }
6433 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006434}
6435
Bill Pemberton80adad82010-06-17 13:10:51 -04006436void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006437{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306438 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306440 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
6441 temp = (temp & 1) << 6;
6442 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x06, ~0x40, temp); /* SR06[6] 18bit Dither */
6443 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80); /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006444
6445}
6446
Bill Pemberton80adad82010-06-17 13:10:51 -04006447void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006448{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306449 unsigned char temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006450
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306451 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37); /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
6452 temp = (temp & 3) << 6;
6453 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80); /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
6454 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80); /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006455
6456}
6457
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006458static void XGI_SetXG21LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306459 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006460{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306461 unsigned char temp, Miscdata;
6462 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6463 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6464 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6465 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306467 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006468
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306469 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability
6470 & (LCDPolarity << 8)) >> 8);
6471 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006472 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006473
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006474 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006475
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306476 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability
6477 & LCDPolarity);
6478 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80); /* SR35[7] FP VSync polarity */
6479 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1); /* SR30[5] FP HSync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006480
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306481 XGI_SetXG21FPBits(pVBInfo);
6482 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6483 if (ModeNo <= 0x13) {
6484 xres = pVBInfo->StResInfo[resindex].HTotal;
6485 yres = pVBInfo->StResInfo[resindex].VTotal;
6486 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
6487 } else {
6488 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6489 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6490 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
6491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306493 if (!(modeflag & Charx8Dot))
6494 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306496 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306498 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6499 - xres) / 2;
6500 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6501 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006502
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306503 if (LVDSHBS > LVDSHT)
6504 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006505
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306506 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6507 if (LVDSHRS > LVDSHT)
6508 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006509
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306510 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6511 if (LVDSHRE > LVDSHT)
6512 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006513
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306514 LVDSHBE = LVDSHBS + LVDSHT
6515 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006516
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306517 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006518
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306519 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6520 - yres) / 2;
6521 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6522 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006523
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306524 if (LVDSVBS > LVDSVT)
6525 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006526
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306527 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6528 if (LVDSVRS > LVDSVT)
6529 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306531 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
6532 if (LVDSVRE > LVDSVT)
6533 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006534
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306535 LVDSVBE = LVDSVBS + LVDSVT
6536 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006537
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306538 temp = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006539 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006540
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306541 if (!(modeflag & Charx8Dot))
6542 XGINew_SetRegOR(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006543
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306544 /* HT SR0B[1:0] CR00 */
6545 value = (LVDSHT >> 3) - 5;
6546 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006547 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006548
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306549 /* HBS SR0B[5:4] CR02 */
6550 value = (LVDSHBS >> 3) - 1;
6551 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006552 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306554 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6555 value = (LVDSHBE >> 3) - 1;
6556 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6557 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6558 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306560 /* HRS SR0B[7:6] CR04 */
6561 value = (LVDSHRS >> 3) + 2;
6562 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006563 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306565 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6566 value--;
6567 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006568 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006569
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306570 /* HRE SR0C[2] CR05[4:0] */
6571 value = (LVDSHRE >> 3) + 2;
6572 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6573 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306575 /* Panel HRE SR2F[7:2] */
6576 value--;
6577 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006578
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306579 /* VT SR0A[0] CR07[5][0] CR06 */
6580 value = LVDSVT - 2;
6581 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6582 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6583 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006584 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006585
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306586 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6587 value = LVDSVBS - 1;
6588 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6589 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6590 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006591 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306593 /* VBE SR0A[4] CR16 */
6594 value = LVDSVBE - 1;
6595 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006596 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306598 /* VRS SR0A[3] CR7[7][2] CR10 */
6599 value = LVDSVRS - 1;
6600 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6601 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6602 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006603 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306605 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6606 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x3F, ~0x03, (value & 0x600) >> 9);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006607 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306608 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306610 /* VRE SR0A[5] CR11[3:0] */
6611 value = LVDSVRE - 1;
6612 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6613 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306615 /* Panel VRE SR3F[7:2] *//* SR3F[7] has to be 0, h/w bug */
6616 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006617
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306618 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006619
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306620 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006621 xgifb_reg_set(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306622 0x2B,
6623 pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006624 xgifb_reg_set(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306625 0x2C,
6626 pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2);
6627 value += 0x10;
6628 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306630 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006631 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006632 outb(0x13, pVBInfo->P3c0); /* set index */
6633 outb(0x00, pVBInfo->P3c0); /* set data, panning = 0, shift left 1 dot*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006634
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006635 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006636 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306637
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006638 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306639 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006640
6641}
6642
6643/* no shadow case */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006644static void XGI_SetXG27LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306645 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006646{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306647 unsigned char temp, Miscdata;
6648 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6649 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6650 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6651 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306653 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6654 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability
6655 & (LCDPolarity << 8)) >> 8);
6656 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006657 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006658
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006659 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006660
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306661 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability
6662 & LCDPolarity);
6663 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80); /* SR35[7] FP VSync polarity */
6664 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1); /* SR30[5] FP HSync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306666 XGI_SetXG27FPBits(pVBInfo);
6667 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6668 if (ModeNo <= 0x13) {
6669 xres = pVBInfo->StResInfo[resindex].HTotal;
6670 yres = pVBInfo->StResInfo[resindex].VTotal;
6671 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
6672 } else {
6673 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6674 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6675 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
6676 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006677
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306678 if (!(modeflag & Charx8Dot))
6679 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006680
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306681 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306683 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6684 - xres) / 2;
6685 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6686 LVDSHBS -= xres / 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306688 if (LVDSHBS > LVDSHT)
6689 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006690
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306691 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6692 if (LVDSHRS > LVDSHT)
6693 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306695 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6696 if (LVDSHRE > LVDSHT)
6697 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006698
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306699 LVDSHBE = LVDSHBS + LVDSHT
6700 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306702 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306704 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6705 - yres) / 2;
6706 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6707 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006708
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306709 if (LVDSVBS > LVDSVT)
6710 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306712 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6713 if (LVDSVRS > LVDSVT)
6714 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306716 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
6717 if (LVDSVRE > LVDSVT)
6718 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306720 LVDSVBE = LVDSVBS + LVDSVT
6721 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306723 temp = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006724 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306726 if (!(modeflag & Charx8Dot))
6727 XGINew_SetRegOR(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006728
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306729 /* HT SR0B[1:0] CR00 */
6730 value = (LVDSHT >> 3) - 5;
6731 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006732 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306734 /* HBS SR0B[5:4] CR02 */
6735 value = (LVDSHBS >> 3) - 1;
6736 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006737 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306739 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6740 value = (LVDSHBE >> 3) - 1;
6741 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6742 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6743 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306745 /* HRS SR0B[7:6] CR04 */
6746 value = (LVDSHRS >> 3) + 2;
6747 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006748 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306750 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6751 value--;
6752 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006753 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006754
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306755 /* HRE SR0C[2] CR05[4:0] */
6756 value = (LVDSHRE >> 3) + 2;
6757 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6758 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006759
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306760 /* Panel HRE SR2F[7:2] */
6761 value--;
6762 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306764 /* VT SR0A[0] CR07[5][0] CR06 */
6765 value = LVDSVT - 2;
6766 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6767 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6768 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006769 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306771 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6772 value = LVDSVBS - 1;
6773 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6774 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6775 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006776 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306778 /* VBE SR0A[4] CR16 */
6779 value = LVDSVBE - 1;
6780 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006781 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306783 /* VRS SR0A[3] CR7[7][2] CR10 */
6784 value = LVDSVRS - 1;
6785 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6786 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6787 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006788 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306790 /* Panel VRS SR35[2:0] SR34[7:0] */
6791 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006792 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006793
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306794 /* VRE SR0A[5] CR11[3:0] */
6795 value = LVDSVRE - 1;
6796 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6797 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306799 /* Panel VRE SR3F[7:2] */
6800 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0xFC);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306802 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306804 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006805 xgifb_reg_set(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306806 0x2B,
6807 pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006808 xgifb_reg_set(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306809 0x2C,
6810 pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2);
6811 value += 0x10;
6812 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006813
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306814 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006815 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006816 outb(0x13, pVBInfo->P3c0); /* set index */
6817 outb(0x00, pVBInfo->P3c0); /* set data, panning = 0, shift left 1 dot*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006818
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006819 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006820 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306821
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006822 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306823 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006824
6825}
6826
6827/* --------------------------------------------------------------------- */
6828/* Function : XGI_IsLCDON */
6829/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006830/* Output : 0 : Skip PSC Control */
6831/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006832/* Description : */
6833/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006834static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006835{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306836 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306838 tempax = pVBInfo->VBInfo;
6839 if (tempax & SetCRT2ToDualEdge)
6840 return 0;
6841 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
6842 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006843
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306844 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006845}
6846
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006847/* --------------------------------------------------------------------- */
6848/* Function : XGI_DisableChISLCD */
6849/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04006850/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006851/* Description : */
6852/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006853static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006854{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306855 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306857 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
6858 tempah = ~((unsigned short) XGINew_GetReg1(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306860 if (tempbx & (EnableChA | DisableChA)) {
6861 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6862 return 0;
6863 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306865 if (!(tempbx & (EnableChB | DisableChB)))
6866 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006867
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306868 if (tempah & 0x01) /* Chk LCDB Mode */
6869 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006870
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306871 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006872}
6873
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006874/* --------------------------------------------------------------------- */
6875/* Function : XGI_EnableChISLCD */
6876/* Input : */
6877/* Output : 0 -> Not LCD mode */
6878/* Description : */
6879/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02006880static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006881{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306882 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006883
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306884 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
6885 tempah = ~((unsigned short) XGINew_GetReg1(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306887 if (tempbx & (EnableChA | DisableChA)) {
6888 if (!(tempah & 0x08)) /* Chk LCDA Mode */
6889 return 0;
6890 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006891
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306892 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04006893 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006894
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306895 if (tempah & 0x01) /* Chk LCDB Mode */
6896 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306898 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006899}
6900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306901void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
6902 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006903{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006904 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006905
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306906 if (pVBInfo->SetFlag == Win9xDOSMode)
6907 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006908
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306909 /*
6910 if (CH7017) {
6911 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2toLCDA)) || (XGI_DisableChISLCD(pVBInfo))) {
6912 if (!XGI_IsLCDON(pVBInfo)) {
6913 if (DISCHARGE) {
6914 tempbx = XGINew_GetCH7005(0x61);
6915 if (tempbx < 0x01) // first time we power up
6916 XGINew_SetCH7005(0x0066); // and disable power sequence
6917 else
6918 XGINew_SetCH7005(0x5f66); // leave VDD on - disable power
6919 }
6920 }
6921 }
6922 }
6923 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006924
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306925 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6926 | VB_XGI302LV | VB_XGI301C)) {
6927 tempah = 0x3F;
6928 if (!(pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode))) {
6929 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6930 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6931 tempah = 0x7F; /* Disable Channel A */
6932 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
6933 tempah = 0xBF; /* Disable Channel B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006934
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306935 if (pVBInfo->SetFlag & DisableChB)
6936 tempah &= 0xBF; /* force to disable Cahnnel */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006937
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306938 if (pVBInfo->SetFlag & DisableChA)
6939 tempah &= 0x7F; /* Force to disable Channel B */
6940 }
6941 }
6942 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306944 XGINew_SetRegAND(pVBInfo->Part4Port, 0x1F, tempah); /* disable part4_1f */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006945
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306946 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
6947 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
6948 || (XGI_DisableChISLCD(pVBInfo))
6949 || (XGI_IsLCDON(pVBInfo)))
6950 XGINew_SetRegOR(pVBInfo->Part4Port, 0x30, 0x80); /* LVDS Driver power down */
6951 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306953 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6954 & (DisableCRT2Display | SetCRT2ToLCDA
6955 | SetSimuScanMode))) {
6956 if (pVBInfo->SetFlag & GatingCRT)
6957 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
6958 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
6959 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306961 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
6962 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
6963 & SetCRT2ToLCDA))
6964 XGINew_SetRegAND(pVBInfo->Part1Port, 0x1e, 0xdf); /* Power down */
6965 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006966
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306967 XGINew_SetRegAND(pVBInfo->P3c4, 0x32, 0xdf); /* disable TV as primary VGA swap */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306969 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
6970 XGINew_SetRegAND(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006971
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306972 if ((pVBInfo->SetFlag & DisableChB) || (pVBInfo->VBInfo
6973 & (DisableCRT2Display | SetSimuScanMode))
6974 || ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
6975 && (pVBInfo->VBInfo
6976 & (SetCRT2ToRAMDAC
6977 | SetCRT2ToLCD
6978 | SetCRT2ToTV))))
6979 XGINew_SetRegOR(pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306981 if ((pVBInfo->SetFlag & DisableChB) || (pVBInfo->VBInfo
6982 & (DisableCRT2Display | SetSimuScanMode))
6983 || (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
6984 || (pVBInfo->VBInfo & (SetCRT2ToRAMDAC
6985 | SetCRT2ToLCD | SetCRT2ToTV))) {
6986 tempah = XGINew_GetReg1(pVBInfo->Part1Port, 0x00); /* save Part1 index 0 */
6987 XGINew_SetRegOR(pVBInfo->Part1Port, 0x00, 0x10); /* BTDAC = 1, avoid VB reset */
6988 XGINew_SetRegAND(pVBInfo->Part1Port, 0x1E, 0xDF); /* disable CRT2 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006989 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah); /* restore Part1 index 0 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306990 }
6991 } else { /* {301} */
6992 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
6993 XGINew_SetRegOR(pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */
6994 XGINew_SetRegAND(pVBInfo->Part1Port, 0x1E, 0xDF); /* Disable CRT2 */
6995 XGINew_SetRegAND(pVBInfo->P3c4, 0x32, 0xDF); /* Disable TV asPrimary VGA swap */
6996 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006997
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306998 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
6999 | SetSimuScanMode))
7000 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7001 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007002}
7003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007004/* --------------------------------------------------------------------- */
7005/* Function : XGI_GetTVPtrIndex */
7006/* Input : */
7007/* Output : */
7008/* Description : bx 0 : ExtNTSC */
7009/* 1 : StNTSC */
7010/* 2 : ExtPAL */
7011/* 3 : StPAL */
7012/* 4 : ExtHiTV */
7013/* 5 : StHiTV */
7014/* 6 : Ext525i */
7015/* 7 : St525i */
7016/* 8 : Ext525p */
7017/* 9 : St525p */
7018/* A : Ext750p */
7019/* B : St750p */
7020/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007021static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007022{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307023 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007024
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307025 if (pVBInfo->TVInfo & SetPALTV)
7026 tempbx = 2;
7027 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
7028 tempbx = 4;
7029 if (pVBInfo->TVInfo & SetYPbPrMode525i)
7030 tempbx = 6;
7031 if (pVBInfo->TVInfo & SetYPbPrMode525p)
7032 tempbx = 8;
7033 if (pVBInfo->TVInfo & SetYPbPrMode750p)
7034 tempbx = 10;
7035 if (pVBInfo->TVInfo & TVSimuMode)
7036 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007037
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307038 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007039}
7040
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007041/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007042/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007043/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007044/* Output : bx 0 : NTSC */
7045/* 1 : PAL */
7046/* 2 : PALM */
7047/* 3 : PALN */
7048/* 4 : NTSC1024x768 */
7049/* 5 : PAL-M 1024x768 */
7050/* 6-7: reserved */
7051/* cl 0 : YFilter1 */
7052/* 1 : YFilter2 */
7053/* ch 0 : 301A */
7054/* 1 : 301B/302B/301LV/302LV */
7055/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007056/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007057static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
7058 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007059{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007060 *tempbx = 0;
7061 *tempcl = 0;
7062 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007063
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007064 if (pVBInfo->TVInfo & SetPALTV)
7065 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007066
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007067 if (pVBInfo->TVInfo & SetPALMTV)
7068 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007069
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007070 if (pVBInfo->TVInfo & SetPALNTV)
7071 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007072
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007073 if (pVBInfo->TVInfo & NTSC1024x768) {
7074 *tempbx = 4;
7075 if (pVBInfo->TVInfo & SetPALMTV)
7076 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307077 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007078
7079 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7080 | VB_XGI302LV | VB_XGI301C)) {
7081 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
7082 & TVSimuMode)) {
7083 *tempbx += 8;
7084 *tempcl += 1;
7085 }
7086 }
7087
7088 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7089 | VB_XGI302LV | VB_XGI301C))
7090 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007091}
7092
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007093static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007094{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307095 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007096
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307097 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307099 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7100 | VB_XGI302LV | VB_XGI301C)) {
7101 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
7102 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
7103 tempbl = 0;
7104 tempbh = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307106 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
7107 tempbl = pVBInfo->XGI_TVDelayList[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307109 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7110 | VB_XGI301LV | VB_XGI302LV
7111 | VB_XGI301C))
7112 tempbl = pVBInfo->XGI_TVDelayList2[index];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307114 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7115 tempbl = tempbl >> 4;
7116 /*
7117 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
7118 tempbl = CRT2Delay1; // Get CRT2 Delay
7119 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
7120 tempbl = CRT2Delay2;
7121 */
7122 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7123 index = XGI_GetLCDCapPtr(pVBInfo); /* Get LCD Delay */
7124 tempbh = pVBInfo->LCDCapList[index].LCD_DelayCompensation;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307126 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
7127 tempbl = tempbh;
7128 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007129
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307130 tempbl &= 0x0F;
7131 tempbh &= 0xF0;
7132 tempah = XGINew_GetReg1(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307134 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
7135 | SetCRT2ToTV)) { /* Channel B */
7136 tempah &= 0xF0;
7137 tempah |= tempbl;
7138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307140 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
7141 tempah &= 0x0F;
7142 tempah |= tempbh;
7143 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02007144 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307145 }
7146 } else if (pVBInfo->IF_DEF_LVDS == 1) {
7147 tempbl = 0;
7148 tempbh = 0;
7149 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
7150 tempah
7151 = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(
7152 pVBInfo)].LCD_DelayCompensation; /* / Get LCD Delay */
7153 tempah &= 0x0f;
7154 tempah = tempah << 4;
7155 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2D, 0x0f,
7156 tempah);
7157 }
7158 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007159}
7160
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007161static void XGI_SetLCDCap_A(unsigned short tempcx, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007162{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307163 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007164
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307165 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007166
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307167 if (temp & LCDRGB18Bit) {
7168 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
7169 (unsigned short) (0x20 | (tempcx & 0x00C0))); /* Enable Dither */
7170 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
7171 } else {
7172 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
7173 (unsigned short) (0x30 | (tempcx & 0x00C0)));
7174 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
7175 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007176
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307177 /*
7178 if (tempcx & EnableLCD24bpp) { // 24bits
7179 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F, (unsigned short)(0x30 | (tempcx&0x00C0)));
7180 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
7181 } else {
7182 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F, (unsigned short)(0x20 | (tempcx&0x00C0))); // Enable Dither
7183 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
7184 }
7185 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007186}
7187
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007188/* --------------------------------------------------------------------- */
7189/* Function : XGI_SetLCDCap_B */
7190/* Input : cx -> LCD Capability */
7191/* Output : */
7192/* Description : */
7193/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007194static void XGI_SetLCDCap_B(unsigned short tempcx, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007195{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307196 if (tempcx & EnableLCD24bpp) /* 24bits */
7197 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
7198 (unsigned short) (((tempcx & 0x00ff) >> 6)
7199 | 0x0c));
7200 else
7201 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
7202 (unsigned short) (((tempcx & 0x00ff) >> 6)
7203 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007204}
7205
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007206static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007207{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307208 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007209
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307210 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007211
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307212 XGINew_SetRegAND(pVBInfo->Part4Port, 0x30, 0x8F); /* disable down spectrum D[4] */
7213 XGI_LongWait(pVBInfo);
7214 XGINew_SetRegOR(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
7215 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007216
Aaro Koskinen8104e322011-03-13 12:26:22 +02007217 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307218 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007219 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307220 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007221 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307222 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007223 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307224 pVBInfo->LCDCapList[index].Spectrum_34);
7225 XGI_LongWait(pVBInfo);
7226 XGINew_SetRegOR(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007227}
7228
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007229static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
7230{
7231 unsigned short tempcx;
7232
7233 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
7234
7235 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7236 | VB_XGI302LV | VB_XGI301C)) {
7237 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { /* 301LV/302LV only */
7238 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007239 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007240 (unsigned char) (tempcx & 0x1F));
7241 }
7242 /* VB Driving */
7243 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x0D,
7244 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
7245 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
7246 | EnablePLLSPLOW)) >> 8));
7247 }
7248
7249 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7250 | VB_XGI302LV | VB_XGI301C)) {
7251 if (pVBInfo->VBInfo & SetCRT2ToLCD)
7252 XGI_SetLCDCap_B(tempcx, pVBInfo);
7253 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7254 XGI_SetLCDCap_A(tempcx, pVBInfo);
7255
7256 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7257 if (tempcx & EnableSpectrum)
7258 SetSpectrum(pVBInfo);
7259 }
7260 } else {
7261 /* LVDS,CH7017 */
7262 XGI_SetLCDCap_A(tempcx, pVBInfo);
7263 }
7264}
7265
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007266/* --------------------------------------------------------------------- */
7267/* Function : XGI_SetAntiFlicker */
7268/* Input : */
7269/* Output : */
7270/* Description : Set TV Customized Param. */
7271/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007272static void XGI_SetAntiFlicker(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307273 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007274{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307275 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307277 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307279 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
7280 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007281
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307282 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7283 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307285 if (ModeNo <= 0x13)
7286 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
7287 else
7288 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307290 tempbx += index;
7291 tempah = TVAntiFlickList[tempbx];
7292 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307294 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007295}
7296
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007297static void XGI_SetEdgeEnhance(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307298 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007299{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307300 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307302 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307304 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7305 tempbx &= 0xFE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307307 if (ModeNo <= 0x13)
7308 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
7309 else
7310 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307312 tempbx += index;
7313 tempah = TVEdgeList[tempbx];
7314 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007315
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307316 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007317}
7318
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007319static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007320{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307321 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007322
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307323 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307325 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007326
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307327 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
7328 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007329
Aaro Koskinen8104e322011-03-13 12:26:22 +02007330 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307331 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007332 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307333 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007334 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307335 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02007336 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307337 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007338}
7339
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007340static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307341 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007342{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307343 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307345 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007346
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307347 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307349 switch (tempbx) {
7350 case 0x00:
7351 case 0x04:
7352 filterPtr = NTSCYFilter1;
7353 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307355 case 0x01:
7356 filterPtr = PALYFilter1;
7357 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007358
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307359 case 0x02:
7360 case 0x05:
7361 case 0x0D:
7362 filterPtr = PALMYFilter1;
7363 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007364
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307365 case 0x03:
7366 filterPtr = PALNYFilter1;
7367 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007368
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307369 case 0x08:
7370 case 0x0C:
7371 filterPtr = NTSCYFilter2;
7372 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307374 case 0x0A:
7375 filterPtr = PALMYFilter2;
7376 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007377
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307378 case 0x0B:
7379 filterPtr = PALNYFilter2;
7380 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007381
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307382 case 0x09:
7383 filterPtr = PALYFilter2;
7384 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307386 default:
7387 return;
7388 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307390 if (ModeNo <= 0x13)
7391 tempal = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
7392 else
7393 tempal
7394 = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307396 if (tempcl == 0)
7397 index = tempal * 4;
7398 else
7399 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307401 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007402 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
7403 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
7404 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
7405 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307406 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007407 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
7408 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
7409 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
7410 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307411 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007412
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307413 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7414 | VB_XGI302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02007415 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
7416 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
7417 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307418 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007419}
7420
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007421/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007422/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007423/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007424/* Output : */
7425/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007426/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007427static void XGI_OEM310Setting(unsigned short ModeNo, unsigned short ModeIdIndex,
7428 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007429{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007430 if (pVBInfo->SetFlag & Win9xDOSMode)
7431 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007432
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007433 /* GetPart1IO(); */
7434 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007435
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007436 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
7437 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007438
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007439 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7440 /* GetPart2IO() */
7441 XGI_SetPhaseIncr(pVBInfo);
7442 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
7443 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007444
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007445 if (pVBInfo->VBType & VB_XGI301)
7446 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307447 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007448}
7449
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007450/* --------------------------------------------------------------------- */
7451/* Function : XGI_SetCRT2ModeRegs */
7452/* Input : */
7453/* Output : */
7454/* Description : Origin code for crt2group */
7455/* --------------------------------------------------------------------- */
Bill Pemberton82d6eb52010-06-17 13:10:46 -04007456void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307457 struct xgi_hw_device_info *HwDeviceExtension,
7458 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007459{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307460 unsigned short tempbl;
7461 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307463 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007464
Aaro Koskinen8104e322011-03-13 12:26:22 +02007465 /* xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); // fix write part1 index 0 BTDRAM bit Bug */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307466 tempah = 0;
7467 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7468 tempah = XGINew_GetReg1(pVBInfo->Part1Port, 0x00);
7469 tempah &= ~0x10; /* BTRAMDAC */
7470 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007471
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307472 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7473 | SetCRT2ToLCD)) {
7474 tempah = 0x40; /* BTDRAM */
7475 if (ModeNo > 0x13) {
7476 tempcl = pVBInfo->ModeType;
7477 tempcl -= ModeVGA;
7478 if (tempcl >= 0) {
7479 tempah = (0x008 >> tempcl); /* BT Color */
7480 if (tempah == 0)
7481 tempah = 1;
7482 tempah |= 0x040;
7483 }
7484 }
7485 if (pVBInfo->VBInfo & SetInSlaveMode)
7486 tempah ^= 0x50; /* BTDAC */
7487 }
7488 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307490 /* 0210 shampoo
7491 if (pVBInfo->VBInfo & DisableCRT2Display) {
7492 tempah = 0;
7493 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007494
Aaro Koskinen8104e322011-03-13 12:26:22 +02007495 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307496 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7497 tempcl = pVBInfo->ModeType;
7498 if (ModeNo > 0x13) {
7499 tempcl -= ModeVGA;
7500 if ((tempcl > 0) || (tempcl == 0)) {
7501 tempah=(0x008>>tempcl) ;
7502 if (tempah == 0)
7503 tempah = 1;
7504 tempah |= 0x040;
7505 }
7506 } else {
7507 tempah = 0x040;
7508 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007509
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307510 if (pVBInfo->VBInfo & SetInSlaveMode) {
7511 tempah = (tempah ^ 0x050);
7512 }
7513 }
7514 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007515
Aaro Koskinen8104e322011-03-13 12:26:22 +02007516 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307517 tempah = 0x08;
7518 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307520 if (pVBInfo->VBInfo & DisableCRT2Display) {
7521 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
7522 } else {
7523 tempah = 0x00;
7524 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007525
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307526 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7527 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
7528 if ((pVBInfo->VBInfo & SetCRT2ToLCDA)
7529 && (!(pVBInfo->VBInfo & SetSimuScanMode))) {
7530 tempbl &= 0xf7;
7531 tempah |= 0x01;
7532 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2e,
7533 tempbl, tempah);
7534 } else {
7535 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7536 tempbl &= 0xf7;
7537 tempah |= 0x01;
7538 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007539
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307540 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC
7541 | SetCRT2ToTV | SetCRT2ToLCD)) {
7542 tempbl &= 0xf8;
7543 tempah = 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307545 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7546 tempah |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007547
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307548 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7549 tempah = tempah ^ 0x05;
7550 if (!(pVBInfo->VBInfo
7551 & SetCRT2ToLCD))
7552 tempah = tempah ^ 0x01;
7553 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007554
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307555 if (!(pVBInfo->VBInfo
7556 & SetCRT2ToDualEdge))
7557 tempah |= 0x08;
7558 XGINew_SetRegANDOR(pVBInfo->Part1Port,
7559 0x2e, tempbl, tempah);
7560 } else {
7561 XGINew_SetRegANDOR(pVBInfo->Part1Port,
7562 0x2e, tempbl, tempah);
7563 }
7564 }
7565 } else {
7566 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2e, tempbl,
7567 tempah);
7568 }
7569 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307571 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7572 | SetCRT2ToLCDA)) {
7573 tempah &= (~0x08);
7574 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7575 & SetInSlaveMode))) {
7576 tempah |= 0x010;
7577 }
7578 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007579
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307580 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7581 /* if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) { */
7582 tempah |= 0x020;
7583 if (ModeNo > 0x13) {
7584 if (pVBInfo->VBInfo & DriverMode)
7585 tempah = tempah ^ 0x20;
7586 }
7587 /* } */
7588 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007589
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307590 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
7591 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307593 if (pVBInfo->LCDInfo & SetLCDDualLink)
7594 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307596 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7597 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) && (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
7598 if (pVBInfo->TVInfo & RPLLDIV2XO)
7599 tempah |= 0x40;
7600 /* } */
7601 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307603 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7604 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7605 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307607 if (pVBInfo->LCDResInfo == Panel1280x960)
7608 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007609
Aaro Koskinen8104e322011-03-13 12:26:22 +02007610 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307611 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307613 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7614 | VB_XGI302LV | VB_XGI301C)) {
7615 tempah = 0;
7616 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007617
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307618 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7619 tempbl = 0xff;
7620 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7621 tempah |= 0x04; /* shampoo 0129 */
7622 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007623
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307624 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x13, tempbl, tempah);
7625 tempah = 0x00;
7626 tempbl = 0xcf;
7627 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7628 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7629 tempah |= 0x30;
7630 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307632 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
7633 tempah = 0;
7634 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307636 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7637 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7638 tempah |= 0xc0;
7639 }
7640 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x21, tempbl, tempah);
7641 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007642
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307643 tempah = 0;
7644 tempbl = 0x7f;
7645 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
7646 tempbl = 0xff;
7647 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
7648 tempah |= 0x80;
7649 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307651 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007652
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307653 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7654 if (pVBInfo->LCDInfo & SetLCDDualLink) {
7655 XGINew_SetRegOR(pVBInfo->Part4Port, 0x27, 0x20);
7656 XGINew_SetRegOR(pVBInfo->Part4Port, 0x34, 0x10);
7657 }
7658 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007659}
7660
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007661static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307662 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007663{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307664 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307666 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307668 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7669 tempbx = 0x08A0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007670
7671}
7672
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307673void XGI_OpenCRTC(struct xgi_hw_device_info *HwDeviceExtension,
7674 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007675{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307676 unsigned short tempbx;
7677 tempbx = 0;
7678}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007679
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307680void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7681 struct vb_device_info *pVBInfo)
7682{
7683
7684 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007685
7686}
7687
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307688void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7689 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007690{
7691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307692 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007693
7694}
7695
Bill Pemberton80adad82010-06-17 13:10:51 -04007696unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007697{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307698 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307700 if (pVBInfo->IF_DEF_LVDS == 1) {
7701 return 1;
7702 } else {
7703 flag = XGINew_GetReg1(pVBInfo->Part4Port, 0x00);
7704 if ((flag == 1) || (flag == 2))
7705 return 1; /* 301b */
7706 else
7707 return 0;
7708 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007709}
7710
Bill Pemberton80adad82010-06-17 13:10:51 -04007711void XGI_LongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007712{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307713 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007714
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307715 i = XGINew_GetReg1(pVBInfo->P3c4, 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007716
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307717 if (!(i & 0xC0)) {
7718 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007719 if (!(inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307720 break;
7721 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307723 for (i = 0; i < 0xFFFF; i++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007724 if ((inb(pVBInfo->P3da) & 0x08))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307725 break;
7726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007727 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007728}
7729
Aaro Koskinen063b9c42011-03-08 22:16:13 +02007730static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007731{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307732 unsigned short tempal, temp, i, j;
7733 return;
7734 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
7735 temp = 0;
7736 for (i = 0; i < 3; i++) {
7737 for (j = 0; j < 100; j++) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02007738 tempal = inb(pVBInfo->P3da);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307739 if (temp & 0x01) { /* VBWaitMode2 */
7740 if ((tempal & 0x08))
7741 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307743 if (!(tempal & 0x08))
7744 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007745
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307746 } else { /* VBWaitMode1 */
7747 if (!(tempal & 0x08))
7748 continue;
7749
7750 if ((tempal & 0x08))
7751 break;
7752 }
7753 }
7754 temp = temp ^ 0x01;
7755 }
7756 } else {
7757 XGI_LongWait(pVBInfo);
7758 }
7759 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007760}
7761
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007762unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
7763 unsigned short ModeNo, unsigned short ModeIdIndex,
7764 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007765{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007766 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
7767 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
7768 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007769
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007770 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007771
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007772 if (ModeNo <= 0x13)
7773 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7774 else
7775 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7776
7777 if (pVBInfo->IF_DEF_CH7005 == 1) {
7778 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7779 if (modeflag & HalfDCLK)
7780 return 0;
7781 }
7782 }
7783
7784 if (ModeNo < 0x14)
7785 return 0xFFFF;
7786
7787 index = XGINew_GetReg1(pVBInfo->P3d4, 0x33);
7788 index = index >> pVBInfo->SelectCRT2Rate;
7789 index &= 0x0F;
7790
7791 if (pVBInfo->LCDInfo & LCDNonExpanding)
7792 index = 0;
7793
7794 if (index > 0)
7795 index--;
7796
7797 if (pVBInfo->SetFlag & ProgrammingCRT2) {
7798 if (pVBInfo->IF_DEF_CH7005 == 1) {
7799 if (pVBInfo->VBInfo & SetCRT2ToTV)
7800 index = 0;
7801 }
7802
7803 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7804 if (pVBInfo->IF_DEF_LVDS == 0) {
7805 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7806 | VB_XGI301LV | VB_XGI302LV
7807 | VB_XGI301C))
7808 temp
7809 = LCDARefreshIndex[pVBInfo->LCDResInfo
7810 & 0x0F]; /* 301b */
7811 else
7812 temp
7813 = LCDRefreshIndex[pVBInfo->LCDResInfo
7814 & 0x0F];
7815
7816 if (index > temp)
7817 index = temp;
7818 } else {
7819 index = 0;
7820 }
7821 }
7822 }
7823
7824 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
7825 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
7826 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
7827 /*
7828 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag & XG2xNotSupport) {
7829 index++;
7830 }
7831 */
7832 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800)
7833 && (pVBInfo->RefIndex[RefreshRateTableIndex].YRes
7834 == 600)) {
7835 index++;
7836 }
7837 /* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */
7838 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024)
7839 && (pVBInfo->RefIndex[RefreshRateTableIndex].YRes
7840 == 768)) {
7841 index++;
7842 }
7843 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280)
7844 && (pVBInfo->RefIndex[RefreshRateTableIndex].YRes
7845 == 1024)) {
7846 index++;
7847 }
7848 }
7849
7850 i = 0;
7851 do {
7852 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].ModeID
7853 != ModeNo)
7854 break;
7855 temp
7856 = pVBInfo->RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
7857 temp &= ModeInfoFlag;
7858 if (temp < pVBInfo->ModeType)
7859 break;
7860 i++;
7861 index--;
7862
7863 } while (index != 0xFFFF);
7864 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
7865 if (pVBInfo->VBInfo & SetInSlaveMode) {
7866 temp
7867 = pVBInfo->RefIndex[RefreshRateTableIndex
7868 + i - 1].Ext_InfoFlag;
7869 if (temp & InterlaceMode)
7870 i++;
7871 }
7872 }
7873 i--;
7874 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
7875 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
7876 RefreshRateTableIndex, &i, pVBInfo);
7877 }
7878 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007879}
7880
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007881static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05307882 struct xgi_hw_device_info *HwDeviceExtension,
7883 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007884{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007885 unsigned short RefreshRateTableIndex;
7886 /* unsigned short temp ; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007887
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007888 /* pVBInfo->SelectCRT2Rate = 0; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007889
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007890 pVBInfo->SetFlag |= ProgrammingCRT2;
7891 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7892 ModeIdIndex, pVBInfo);
7893 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
7894 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7895 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7896 HwDeviceExtension, pVBInfo);
7897 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7898 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007899}
7900
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007901unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
7902 struct xgi_hw_device_info *HwDeviceExtension,
7903 struct vb_device_info *pVBInfo)
7904{
7905 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
7906
7907 tempbx = pVBInfo->VBInfo;
7908 pVBInfo->SetFlag |= ProgrammingCRT2;
7909 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
7910 pVBInfo->SelectCRT2Rate = 4;
7911 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
7912 ModeIdIndex, pVBInfo);
7913 XGI_SaveCRT2Info(ModeNo, pVBInfo);
7914 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
7915 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7916 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7917 RefreshRateTableIndex, pVBInfo);
7918 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
7919 RefreshRateTableIndex, pVBInfo);
7920 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7921 RefreshRateTableIndex, pVBInfo);
7922 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7923 HwDeviceExtension, pVBInfo);
7924 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
7925 RefreshRateTableIndex, pVBInfo);
7926 XGI_SetTap4Regs(pVBInfo);
7927 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
7928 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
7929 HwDeviceExtension, pVBInfo);
7930 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
7931 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
7932 XGI_AutoThreshold(pVBInfo);
7933 return 1;
7934}
7935
7936void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
7937{
7938 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
7939 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
7940 0x05, 0x00 };
7941
7942 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
7943
7944 unsigned char CR17, CR63, SR31;
7945 unsigned short temp;
7946 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
7947
7948 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02007949 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007950
7951 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02007952 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
7953 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (XGINew_GetReg1(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007954 pVBInfo->P3d4, 0x53) | 0x02));
7955
7956 SR31 = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x31);
7957 CR63 = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x63);
7958 SR01 = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x01);
7959
Aaro Koskinen8104e322011-03-13 12:26:22 +02007960 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
7961 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007962
7963 CR17 = (unsigned char) XGINew_GetReg1(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007964 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007965
7966 SR1F = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007967 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007968
7969 SR07 = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007970 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007971 SR06 = (unsigned char) XGINew_GetReg1(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02007972 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007973
Aaro Koskinen8104e322011-03-13 12:26:22 +02007974 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007975
7976 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007977 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007978
7979 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007980 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007981 CRTCData[i]);
7982
7983 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007984 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007985 CRTCData[i]);
7986
7987 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02007988 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007989 CRTCData[i]);
7990
Aaro Koskinen8104e322011-03-13 12:26:22 +02007991 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007992 & 0xE0));
7993
Aaro Koskinen8104e322011-03-13 12:26:22 +02007994 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
7995 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
7996 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007997
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02007998 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02007999
8000 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008001 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
8002 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
8003 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008004 }
8005
8006 XGI_VBLongWait(pVBInfo);
8007 XGI_VBLongWait(pVBInfo);
8008 XGI_VBLongWait(pVBInfo);
8009
8010 mdelay(1);
8011
8012 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008013 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008014
8015 if (temp & 0x10)
8016 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
8017 else
8018 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
8019
8020 /* alan, avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008021 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008022
8023 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008024 outb(0, (pVBInfo->P3c8 + 1));
8025 outb(0, (pVBInfo->P3c8 + 1));
8026 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008027 }
8028
Aaro Koskinen8104e322011-03-13 12:26:22 +02008029 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
8030 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
8031 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008032
8033 /* [2004/05/11] Vicent */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008034 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (XGINew_GetReg1(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008035 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02008036 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008037}
8038
8039void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
8040 struct vb_device_info *pVBInfo)
8041{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02008042 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008043
8044 if (pVBInfo->SetFlag == Win9xDOSMode) {
8045 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8046 | VB_XGI302LV | VB_XGI301C)) {
8047 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8048 return;
8049 } else
8050 /* LVDS or CH7017 */
8051 return;
8052 }
8053
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008054 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8055 | VB_XGI302LV | VB_XGI301C)) {
8056 if (!(pVBInfo->SetFlag & DisableChA)) {
8057 if (pVBInfo->SetFlag & EnableChA) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008058 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008059 } else {
8060 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { /* SetCRT2ToLCDA ) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008061 xgifb_reg_set(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008062 0x1E, 0x20); /* Power on */
8063 }
8064 }
8065 }
8066
8067 if (!(pVBInfo->SetFlag & DisableChB)) {
8068 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
8069 & (SetCRT2ToLCD | SetCRT2ToTV
8070 | SetCRT2ToRAMDAC))) {
8071 tempah = (unsigned char) XGINew_GetReg1(
8072 pVBInfo->P3c4, 0x32);
8073 tempah &= 0xDF;
8074 if (pVBInfo->VBInfo & SetInSlaveMode) {
8075 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC))
8076 tempah |= 0x20;
8077 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02008078 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008079 XGINew_SetRegOR(pVBInfo->P3c4, 0x1E, 0x20);
8080
8081 tempah = (unsigned char) XGINew_GetReg1(
8082 pVBInfo->Part1Port, 0x2E);
8083
8084 if (!(tempah & 0x80))
8085 XGINew_SetRegOR(pVBInfo->Part1Port,
8086 0x2E, 0x80); /* BVBDOENABLE = 1 */
8087
8088 XGINew_SetRegAND(pVBInfo->Part1Port, 0x00, 0x7F); /* BScreenOFF = 0 */
8089 }
8090 }
8091
8092 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
8093 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
8094 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x00, ~0xE0,
8095 0x20); /* shampoo 0129 */
8096 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
8097 if (!XGI_DisableChISLCD(pVBInfo)) {
8098 if (XGI_EnableChISLCD(pVBInfo)
8099 || (pVBInfo->VBInfo
8100 & (SetCRT2ToLCD
8101 | SetCRT2ToLCDA)))
8102 XGINew_SetRegAND(
8103 pVBInfo->Part4Port,
8104 0x2A, 0x7F); /* LVDS PLL power on */
8105 }
8106 XGINew_SetRegAND(pVBInfo->Part4Port, 0x30, 0x7F); /* LVDS Driver power on */
8107 }
8108 }
8109
8110 tempah = 0x00;
8111
8112 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
8113 tempah = 0xc0;
8114
8115 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
8116 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8117 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
8118 tempah = tempah & 0x40;
8119 if (pVBInfo->VBInfo
8120 & SetCRT2ToLCDA)
8121 tempah = tempah ^ 0xC0;
8122
8123 if (pVBInfo->SetFlag
8124 & DisableChB)
8125 tempah &= 0xBF;
8126
8127 if (pVBInfo->SetFlag
8128 & DisableChA)
8129 tempah &= 0x7F;
8130
8131 if (pVBInfo->SetFlag
8132 & EnableChB)
8133 tempah |= 0x40;
8134
8135 if (pVBInfo->SetFlag
8136 & EnableChA)
8137 tempah |= 0x80;
8138 }
8139 }
8140 }
8141 }
8142
8143 XGINew_SetRegOR(pVBInfo->Part4Port, 0x1F, tempah); /* EnablePart4_1F */
8144
8145 if (pVBInfo->SetFlag & Win9xDOSMode) {
8146 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8147 return;
8148 }
8149
8150 if (!(pVBInfo->SetFlag & DisableChA)) {
8151 XGI_VBLongWait(pVBInfo);
8152 if (!(pVBInfo->SetFlag & GatingCRT)) {
8153 XGI_DisableGatingCRT(HwDeviceExtension, pVBInfo);
8154 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8155 XGI_VBLongWait(pVBInfo);
8156 }
8157 }
8158 } /* 301 */
8159 else { /* LVDS */
8160 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
8161 | SetCRT2ToLCDA))
8162 XGINew_SetRegOR(pVBInfo->Part1Port, 0x1E, 0x20); /* enable CRT2 */
8163
8164 tempah = (unsigned char) XGINew_GetReg1(pVBInfo->Part1Port,
8165 0x2E);
8166 if (!(tempah & 0x80))
8167 XGINew_SetRegOR(pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */
8168
8169 XGINew_SetRegAND(pVBInfo->Part1Port, 0x00, 0x7F);
8170 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8171 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008172}
8173
8174static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
8175 unsigned short ModeNo, unsigned short ModeIdIndex,
8176 struct vb_device_info *pVBInfo)
8177{
8178 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
8179
8180 unsigned short XGINew_P3cc = pVBInfo->P3cc;
8181
8182 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
8183 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
8184 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
8185 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
8186 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8187 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
8188 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
8189 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8190 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
8191 XGI_ClearExt1Regs(pVBInfo);
8192
8193 /* if (pVBInfo->IF_DEF_ExpLink) */
8194 if (HwDeviceExtension->jChipType == XG27) {
8195 if (pVBInfo->IF_DEF_LVDS == 0)
8196 XGI_SetDefaultVCLK(pVBInfo);
8197 }
8198
8199 temp = ~ProgrammingCRT2;
8200 pVBInfo->SetFlag &= temp;
8201 pVBInfo->SelectCRT2Rate = 0;
8202
8203 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8204 | VB_XGI302LV | VB_XGI301C)) {
8205 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
8206 | SetInSlaveMode)) {
8207 pVBInfo->SetFlag |= ProgrammingCRT2;
8208 }
8209 }
8210
8211 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8212 ModeIdIndex, pVBInfo);
8213 if (RefreshRateTableIndex != 0xFFFF) {
8214 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
8215 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8216 pVBInfo, HwDeviceExtension);
8217 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
8218 RefreshRateTableIndex, pVBInfo);
8219 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8220 HwDeviceExtension, pVBInfo);
8221 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
8222 RefreshRateTableIndex, pVBInfo);
8223 }
8224
8225 if ((HwDeviceExtension->jChipType >= XG20)
8226 && (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
8227 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008228 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
8229 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008230 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008231 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008232 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
8233 == 0x0D)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02008234 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8235 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02008236 b3CC = (unsigned char) inb(XGINew_P3cc);
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02008237 outb((b3CC |= 0x0C), XGINew_P3cc);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008238 }
8239 }
8240
8241 if (HwDeviceExtension->jChipType >= XG21) {
8242 temp = XGINew_GetReg1(pVBInfo->P3d4, 0x38);
8243 if (temp & 0xA0) {
8244
8245 /* XGINew_SetRegAND(pVBInfo->P3d4, 0x4A, ~0x20); *//* Enable write GPIOF */
8246 /* XGINew_SetRegAND(pVBInfo->P3d4, 0x48, ~0x20); *//* P. DWN */
8247 /* XG21 CRT1 Timing */
8248 if (HwDeviceExtension->jChipType == XG27)
8249 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
8250 RefreshRateTableIndex, pVBInfo);
8251 else
8252 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
8253 RefreshRateTableIndex, pVBInfo);
8254
8255 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
8256 RefreshRateTableIndex);
8257
8258 if (HwDeviceExtension->jChipType == XG27)
8259 XGI_SetXG27LCD(pVBInfo, RefreshRateTableIndex,
8260 ModeNo);
8261 else
8262 XGI_SetXG21LCD(pVBInfo, RefreshRateTableIndex,
8263 ModeNo);
8264
8265 if (pVBInfo->IF_DEF_LVDS == 1) {
8266 if (HwDeviceExtension->jChipType == XG27)
8267 XGI_SetXG27LVDSPara(ModeNo,
8268 ModeIdIndex, pVBInfo);
8269 else
8270 XGI_SetXG21LVDSPara(ModeNo,
8271 ModeIdIndex, pVBInfo);
8272 }
8273 /* XGINew_SetRegOR(pVBInfo->P3d4, 0x48, 0x20); *//* P. ON */
8274 }
8275 }
8276
8277 pVBInfo->SetFlag &= (~ProgrammingCRT2);
8278 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
8279 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
8280 RefreshRateTableIndex, pVBInfo);
8281
8282 /* XGI_LoadCharacter(); //dif ifdef TVFont */
8283
8284 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
8285 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
8286}
8287
8288unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
8289 unsigned short ModeNo)
8290{
8291 unsigned short ModeIdIndex;
8292 /* unsigned char *pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress; */
8293 struct vb_device_info VBINF;
8294 struct vb_device_info *pVBInfo = &VBINF;
8295 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
8296 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
8297 pVBInfo->IF_DEF_LVDS = 0;
8298 pVBInfo->IF_DEF_CH7005 = 0;
8299 pVBInfo->IF_DEF_LCDA = 1;
8300 pVBInfo->IF_DEF_CH7017 = 0;
8301 pVBInfo->IF_DEF_CH7007 = 0; /* [Billy] 2007/05/14 */
8302 pVBInfo->IF_DEF_VideoCapture = 0;
8303 pVBInfo->IF_DEF_ScaleLCD = 0;
8304 pVBInfo->IF_DEF_OEMUtil = 0;
8305 pVBInfo->IF_DEF_PWD = 0;
8306
8307 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
8308 pVBInfo->IF_DEF_YPbPr = 0;
8309 pVBInfo->IF_DEF_HiVision = 0;
8310 pVBInfo->IF_DEF_CRT2Monitor = 0;
8311 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008312 } else {
8313 pVBInfo->IF_DEF_YPbPr = 1;
8314 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02008315 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008316 }
8317
8318 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
8319 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
8320 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
8321 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
8322 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
8323 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
8324 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
8325 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
8326 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
8327 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
8328 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
8329 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
8330 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
8331 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
8332 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
8333 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
8334 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
8335 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
8336
8337 if (HwDeviceExtension->jChipType == XG21) { /* for x86 Linux, XG21 LVDS */
8338 if ((XGINew_GetReg1(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
8339 pVBInfo->IF_DEF_LVDS = 1;
8340 }
8341 if (HwDeviceExtension->jChipType == XG27) {
8342 if ((XGINew_GetReg1(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
8343 if (XGINew_GetReg1(pVBInfo->P3d4, 0x30) & 0x20)
8344 pVBInfo->IF_DEF_LVDS = 1;
8345 }
8346 }
8347
8348 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
8349 XGI_GetVBType(pVBInfo);
8350
8351 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
8352 if (ModeNo & 0x80) {
8353 ModeNo = ModeNo & 0x7F;
8354 /* XGINew_flag_clearbuffer = 0; */
8355 }
8356 /* else {
8357 XGINew_flag_clearbuffer = 1;
8358 }
8359 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02008360 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02008361
8362 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
8363 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
8364
8365 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8366
8367 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
8368
8369 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8370 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
8371 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
8372 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
8373 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
8374 /* XGI_OpenCRTC(HwDeviceExtension, pVBInfo); */
8375
8376 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
8377 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8378 ModeIdIndex, pVBInfo);
8379
8380 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8381 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8382 HwDeviceExtension, pVBInfo);
8383 }
8384 } else {
8385 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
8386 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8387 ModeIdIndex, pVBInfo);
8388 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8389 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8390 HwDeviceExtension,
8391 pVBInfo);
8392 }
8393 }
8394 }
8395
8396 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
8397 switch (HwDeviceExtension->ujVBChipID) {
8398 case VB_CHIP_301:
8399 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8400 pVBInfo); /*add for CRT2 */
8401 break;
8402
8403 case VB_CHIP_302:
8404 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8405 pVBInfo); /*add for CRT2 */
8406 break;
8407
8408 default:
8409 break;
8410 }
8411 }
8412
8413 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
8414 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
8415 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
8416 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
8417 } /* !XG20 */
8418 else {
8419 if (pVBInfo->IF_DEF_LVDS == 1)
8420 if (!XGI_XG21CheckLVDSMode(ModeNo, ModeIdIndex, pVBInfo))
8421 return 0;
8422
8423 if (ModeNo <= 0x13) {
8424 pVBInfo->ModeType
8425 = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag
8426 & ModeInfoFlag;
8427 } else {
8428 pVBInfo->ModeType
8429 = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag
8430 & ModeInfoFlag;
8431 }
8432
8433 pVBInfo->SetFlag = 0;
8434 if (pVBInfo->IF_DEF_CH7007 != 1)
8435 pVBInfo->VBInfo = DisableCRT2Display;
8436
8437 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
8438
8439 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
8440 pVBInfo);
8441
8442 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8443 /*
8444 if (HwDeviceExtension->jChipType == XG21)
8445 XGINew_SetRegANDOR(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
8446 */
8447 }
8448
8449 /*
8450 if (ModeNo <= 0x13) {
8451 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
8452 } else {
8453 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
8454 }
8455 pVBInfo->ModeType = modeflag&ModeInfoFlag;
8456 pVBInfo->SetFlag = 0x00;
8457 pVBInfo->VBInfo = DisableCRT2Display;
8458 temp = XGINew_CheckMemorySize(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
8459
8460 if (temp == 0)
8461 return (0);
8462
8463 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
8464 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
8465 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8466 */
8467
8468 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
8469
8470 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8471 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
8472 }
8473
8474 return 1;
8475}