blob: ef8775e27055762a8a813566b526553b88355930 [file] [log] [blame]
Aaro Koskinend80aaa02011-02-17 23:29:14 +02001#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_util.h"
6#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02007#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020010#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
Aaro Koskinen624554d2011-10-11 21:47:35 +030012static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040013 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020023
Bill Pemberton80adad82010-06-17 13:10:51 -040024void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020025{
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030026 pVBInfo->StandTable = (struct SiS_StandTable_S *) &XGI330_StandTable;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053027 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
28 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
29 pVBInfo->XGINEWUB_CRT1Table
30 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031
Peter Huewefc39dcb2012-01-15 19:22:12 +010032 pVBInfo->MCLKData = (struct SiS_MCLKData *) XGI340New_MCLKData;
Aaro Koskinen06587332011-03-13 12:26:10 +020033 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
Peter Huewefc39dcb2012-01-15 19:22:12 +010034 pVBInfo->VCLKData = (struct SiS_VCLKData *) XGI_VCLKData;
Aaro Koskinene8cb03d2012-09-11 00:15:31 +030035 pVBInfo->VBVCLKData = XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053036 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Peter Huewefc39dcb2012-01-15 19:22:12 +010037 pVBInfo->StResInfo = (struct SiS_StResInfo_S *) XGI330_StResInfo;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053038 pVBInfo->ModeResInfo
Peter Huewefc39dcb2012-01-15 19:22:12 +010039 = (struct SiS_ModeResInfo_S *) XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053041 pVBInfo->LCDResInfo = 0;
42 pVBInfo->LCDTypeInfo = 0;
43 pVBInfo->LCDInfo = 0;
44 pVBInfo->VBInfo = 0;
45 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 pVBInfo->SR15 = XGI340_SR13;
48 pVBInfo->CR40 = XGI340_cr41;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053049 pVBInfo->CR6B = XGI340_CR6B;
50 pVBInfo->CR6E = XGI340_CR6E;
51 pVBInfo->CR6F = XGI340_CR6F;
52 pVBInfo->CR89 = XGI340_CR89;
53 pVBInfo->AGPReg = XGI340_AGPReg;
54 pVBInfo->SR16 = XGI340_SR16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020055
Peter Huewe6d12dae2012-06-14 00:21:52 +020056 pVBInfo->SR21 = 0xa3;
57 pVBInfo->SR22 = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020058
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053059 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
60 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
61 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020062
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053063 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010064 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053065 pVBInfo->LCDCapList = XGI_LCDDLCapList;
66 else
67 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053069 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020070 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020071
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053072 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040073 unsigned char temp;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053074 pVBInfo->MCLKData
Peter Huewefc39dcb2012-01-15 19:22:12 +010075 = (struct SiS_MCLKData *) XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053076 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020077 pVBInfo->XGINew_CR97 = 0xc1;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040078 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020079
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040080 /*Z11m DDR*/
81 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
82 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
83 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020084 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053085 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020086
87}
88
Kenji Toyama1d7f6562011-04-23 19:36:49 +080089static void XGI_SetSeqRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +080090 unsigned short ModeIdIndex,
91 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020092{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053093 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053094 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020095
Aaro Koskinen34c13ee2012-04-07 01:14:01 +030096 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020097
Aaro Koskinen8104e322011-03-13 12:26:22 +020098 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030099 tempah = pVBInfo->StandTable->SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200100
Peter Huewea3d675c2012-02-09 21:11:47 +0100101 i = XGI_SetCRT2ToLCDA;
102 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530103 tempah |= 0x01;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300104 } else if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
105 if (pVBInfo->VBInfo & SetInSlaveMode)
106 tempah |= 0x01;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530107 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200110 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530112 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800113 /* Get SR2,3,4 from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300114 SRdata = pVBInfo->StandTable->SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200115 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530116 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200117}
118
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200119static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800120 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200121{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530122 unsigned char CRTCdata;
123 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200124
Aaro Koskinen58839b02011-03-13 12:26:23 +0200125 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200127 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530129 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800130 /* Get CRTC from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300131 CRTCdata = pVBInfo->StandTable->CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200132 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530133 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200134}
135
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800136static void XGI_SetATTRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800137 unsigned short ModeIdIndex,
138 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530140 unsigned char ARdata;
141 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200142
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300143 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530145 for (i = 0; i <= 0x13; i++) {
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300146 ARdata = pVBInfo->StandTable->ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200147
148 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
149 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
150 ARdata = 0;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300151 } else if ((pVBInfo->VBInfo &
Miguel Gómez661a6382012-07-06 12:40:45 +0200152 (SetCRT2ToTV | SetCRT2ToLCD)) &&
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300153 (pVBInfo->VBInfo & SetInSlaveMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530154 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530155 }
156 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200157
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200158 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200159 outb(i, pVBInfo->P3c0); /* set index */
160 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530161 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200162
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200163 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200164 outb(0x14, pVBInfo->P3c0); /* set index */
165 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200166 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200167 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200168}
169
Aaro Koskinena1579612012-04-07 01:14:05 +0300170static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200171{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530172 unsigned char GRdata;
173 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530175 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800176 /* Get GR from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300177 GRdata = pVBInfo->StandTable->GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200178 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530181 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200182 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530183 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200184 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530185 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186}
187
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200188static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200189{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530190 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200191
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530192 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200193 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200194}
195
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200196static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200197{
198
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200199 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200200 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
201 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200202
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200203 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200204 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
205 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206
Aaro Koskinendc505562011-03-13 12:26:26 +0200207 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530208 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209}
210
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200211static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530212 unsigned short ModeIdIndex,
213 unsigned short RefreshRateTableIndex, unsigned short *i,
214 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200215{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530216 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200217
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300218 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530219 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
220 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
221 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530223 if (pVBInfo->IF_DEF_LVDS == 0) {
224 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
225 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530227 if (pVBInfo->VBType & VB_XGI301C)
228 tempax |= SupportCRT2in301C;
229 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200230
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800231 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100232 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530233 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200234
Miguel Gómez3b175622012-07-06 12:40:46 +0200235 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
236 pVBInfo->LCDResInfo != Panel_1280x960 &&
237 (pVBInfo->LCDInfo & LCDNonExpanding) &&
238 resinfo >= 9)
239 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530240 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200241
Peter Huewe599801f2012-02-09 21:11:45 +0100242 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300243 tempax |= SupportHiVision;
244 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
245 ((resinfo == 4) ||
246 (resinfo == 3 &&
247 (pVBInfo->SetFlag & TVSimuMode)) ||
248 (resinfo > 7)))
Miguel Gómez3b175622012-07-06 12:40:46 +0200249 return 0;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300250 } else if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800251 SetCRT2ToSVIDEO |
252 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100253 SetCRT2ToYPbPr525750 |
254 SetCRT2ToHiVision)) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300255 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300257 if (pVBInfo->VBType & (VB_SIS301B |
258 VB_SIS302B |
259 VB_SIS301LV |
260 VB_SIS302LV |
261 VB_XGI301C))
262 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200263
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300264 if (!(pVBInfo->VBInfo & TVSetPAL) &&
265 (modeflag & NoSupportSimuTV) &&
266 (pVBInfo->VBInfo & SetInSlaveMode) &&
267 (!(pVBInfo->VBInfo & SetNotSimuMode)))
268 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530269 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300270 } else if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* for LVDS */
271 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200272
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300273 if (resinfo > 0x08)
274 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200275
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300276 if (pVBInfo->LCDResInfo < Panel_1024x768) {
277 if (resinfo > 0x07)
278 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200279
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300280 if (resinfo == 0x04)
281 return 0; /* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530282 }
283 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200284
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800285 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
286 tempbx; (*i)--) {
287 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
288 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530289 if (infoflag & tempax)
290 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200291
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530292 if ((*i) == 0)
293 break;
294 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200295
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530296 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800297 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
298 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530299 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
300 != tempbx) {
301 return 0;
302 }
303
304 if (infoflag & tempax)
305 return 1;
306 }
307 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200308}
309
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200310static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530311 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200312{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530313 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200314
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800315 /* di+0x00 */
316 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530317 sync &= 0xC0;
318 temp = 0x2F;
319 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200320 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200321}
322
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200323static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530324 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200325{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530326 unsigned char data, data1, pushax;
327 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200328
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800329 /* unlock cr0-7 */
330 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530331 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200332 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200335 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 for (i = 0x01; i <= 0x04; i++) {
338 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200339 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530340 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 for (i = 0x05; i <= 0x06; i++) {
343 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200344 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200346
Aaro Koskinen58839b02011-03-13 12:26:23 +0200347 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530348 j &= 0x1F;
349 data = pVBInfo->TimingH[0].data[7];
350 data &= 0xE0;
351 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200352 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530354 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200355 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200357 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200358 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530359 data1 = data;
360 data1 &= 0xE0;
361 data &= 0x1F;
362 if (data == 0) {
363 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200364 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530365 0x0c);
366 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200367 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530368 data = pushax;
369 }
370 data = data - 1;
371 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200372 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200373 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530374 data = data >> 5;
375 data = data + 3;
376 if (data > 7)
377 data = data - 7;
378 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200379 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530380 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200381}
382
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800383static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
384 unsigned short ModeNo,
385 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200386{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530387 unsigned char data;
388 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 for (i = 0x00; i <= 0x01; i++) {
391 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200392 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530393 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200394
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530395 for (i = 0x02; i <= 0x03; i++) {
396 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200397 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530398 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 for (i = 0x04; i <= 0x05; i++) {
401 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200402 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530403 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200404
Aaro Koskinen58839b02011-03-13 12:26:23 +0200405 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530406 j &= 0xC0;
407 data = pVBInfo->TimingV[0].data[6];
408 data &= 0x3F;
409 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200410 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530412 data = pVBInfo->TimingV[0].data[6];
413 data &= 0x80;
414 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200415
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300416 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530417 i &= DoubleScanMode;
418 if (i)
419 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200420
Aaro Koskinen58839b02011-03-13 12:26:23 +0200421 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530422 j &= 0x5F;
423 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200425}
426
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200427static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
428 unsigned short RefreshRateTableIndex,
429 struct vb_device_info *pVBInfo,
430 struct xgi_hw_device_info *HwDeviceExtension)
431{
432 unsigned char index, data;
433 unsigned short i;
434
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800435 /* Get index */
436 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200437 index = index & IndexMask;
438
Aaro Koskinen58839b02011-03-13 12:26:23 +0200439 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200440 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200441 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200442
443 for (i = 0; i < 8; i++)
444 pVBInfo->TimingH[0].data[i]
445 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
446
447 for (i = 0; i < 7; i++)
448 pVBInfo->TimingV[0].data[i]
449 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
450
451 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
452
453 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
454
455 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200456 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200457}
458
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200459/* --------------------------------------------------------------------- */
460/* Function : XGI_SetXG21CRTC */
461/* Input : Stand or enhance CRTC table */
462/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
463/* Description : Set LCD timing */
464/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200465static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530466 unsigned short RefreshRateTableIndex,
467 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200468{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300469 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530470 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200471
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300472 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
473 /* Tempax: CR4 HRS */
474 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
475 Tempcx = Tempax; /* Tempcx: HRS */
476 /* SR2E[7:0]->HRS */
477 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200478
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300479 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
480 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
481 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
482 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
483 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800484
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300485 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
486 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200487
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300488 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
489 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
490 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
491 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200492
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300493 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
494 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200495
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300496 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
497 if (Tempax < Tempcx) /* HRE < HRS */
498 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200499
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300500 Temp2 &= 0xFF;
501 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
502 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
503 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
504 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
505 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
506 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
507 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200508
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300509 /* CR10 VRS */
510 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
511 Tempbx = Tempax; /* Tempbx: VRS */
512 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
513 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
514 /* CR7[2][7] VRE */
515 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
516 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
517 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
518 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
519 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
520 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200521
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300522 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
523 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
524 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
525 Tempax &= 0x80;
526 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
527 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
528 /* Tempax: SRA */
529 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
530 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
531 Temp2 = Tempax;
532 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
533 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200534
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300535 /* Tempax: CR11 VRE */
536 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
537 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
538 /* Tempbx: SRA */
539 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
540 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
541 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
542 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
543 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
544 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200545
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300546 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
547 if (Tempax < Temp3) /* VRE < VRS */
548 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200549
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300550 Temp2 &= 0xFF;
551 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
552 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
553 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
554 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
555 Tempbx = (unsigned char) Temp1;
556 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
557 Tempax &= 0x7F;
558 /* SR3F D[7:2]->VRE D[1:0]->VRS */
559 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200560}
561
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800562static void XGI_SetXG27CRTC(unsigned short ModeNo,
563 unsigned short ModeIdIndex,
564 unsigned short RefreshRateTableIndex,
565 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300567 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200568
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300569 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
570 /* Tempax: CR4 HRS */
571 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
572 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
573 /* SR2E[7:0]->HRS */
574 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200575
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300576 /* SR0B */
577 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
578 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
579 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200580
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300581 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
582 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
583 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200584
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300585 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
586 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
587 Tempax <<= 3; /* Tempax[5]: HRE[5] */
588 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200589
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300590 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
591 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200592
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300593 /* Tempax: CR4 HRS */
594 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
595 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
596 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
597 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200598
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300599 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
600 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
601 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
602 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
603 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
604 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
605 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300607 /* CR10 VRS */
608 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
609 /* SR34[7:0]->VRS[7:0] */
610 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200611
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300612 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
613 /* CR7[7][2] VRS[9][8] */
614 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
615 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
616 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
617 Tempax >>= 2; /* Tempax[0]: VRS[8] */
618 /* SR35[0]: VRS[8] */
619 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
620 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
621 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
622 /* Tempax: SR0A */
623 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
624 Tempax &= 0x08; /* SR0A[3] VRS[10] */
625 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200626
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300627 /* Tempax: CR11 VRE */
628 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
629 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
630 /* Tempbx: SR0A */
631 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
632 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
633 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
634 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
635 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
636 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
637 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300639 if (Tempbx <= Tempcx) /* VRE <= VRS */
640 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200641
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300642 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
643 Tempax = (Tempbx << 2) & 0xFF;
644 /* SR3F[7:2]:VRE[5:0] */
645 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
646 Tempax = Tempcx >> 8;
647 /* SR35[2:0]:VRS[10:8] */
648 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200649}
650
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200651static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
652{
653 unsigned char temp;
654
655 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
656 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
657 temp = (temp & 3) << 6;
658 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
659 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
660 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
661 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
662
663}
664
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300665static void xgifb_set_lcd(int chip_id,
666 struct vb_device_info *pVBInfo,
667 unsigned short RefreshRateTableIndex,
668 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200669{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300670 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400671 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200672
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530673 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200674
Aaro Koskinen8104e322011-03-13 12:26:22 +0200675 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
676 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
677 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
678 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300679
680 if (chip_id == XG27) {
681 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
682 if ((Temp & 0x03) == 0) { /* dual 12 */
683 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
684 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
685 }
686 }
687
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300688 if (chip_id == XG27) {
689 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530690 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300691 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
692 if (Temp & 0x01) {
693 /* 18 bits FP */
694 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
695 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
696 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530697 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200698
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200699 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200700
Aaro Koskinendc505562011-03-13 12:26:26 +0200701 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
702 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200703
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300704 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
705 if (Data & 0x4000)
706 /* Hsync polarity */
707 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
708 if (Data & 0x8000)
709 /* Vsync polarity */
710 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200711}
712
713/* --------------------------------------------------------------------- */
714/* Function : XGI_UpdateXG21CRTC */
715/* Input : */
716/* Output : CRT1 CRTC */
717/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
718/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800719static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
720 struct vb_device_info *pVBInfo,
721 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300723 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200724
Aaro Koskinendc505562011-03-13 12:26:26 +0200725 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300726 if (ModeNo == 0x2E &&
727 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
728 RES640x480x60))
729 index = 12;
730 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800731 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300732 index = 13;
733 else if (ModeNo == 0x2F)
734 index = 14;
735 else if (ModeNo == 0x50)
736 index = 15;
737 else if (ModeNo == 0x59)
738 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200739
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530740 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200741 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530742 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200743 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530744 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200745 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530746 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200747 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530748 pVBInfo->UpdateCRT1[index].CR16);
749 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200750}
751
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200752static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530753 unsigned short ModeNo, unsigned short ModeIdIndex,
754 unsigned short RefreshRateTableIndex,
755 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200756{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400757 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530759 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200760
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300761 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200762
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300763 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
764 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
765 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530767 if (modeflag & HalfDCLK)
768 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200769
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300770 if (modeflag & HalfDCLK)
771 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200772
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300773 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200774
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300775 if (temp & InterlaceMode)
776 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200777
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300778 if (modeflag & DoubleScanMode)
779 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530781 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530783 tempax /= tempcx;
784 tempax -= 1;
785 tempbx -= 1;
786 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200787 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
788 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530789 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200790 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
791 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200792 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530793 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200794 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530795 tempax = 0;
796 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530798 if (tempbx & 0x01)
799 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530801 if (tempbx & 0x02)
802 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200803
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200804 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200805 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530806 data &= 0xFF;
807 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200808
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530809 if (tempbx & 0x04)
810 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200811
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200812 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200813 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200814}
815
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800816static void XGI_SetCRT1Offset(unsigned short ModeNo,
817 unsigned short ModeIdIndex,
818 unsigned short RefreshRateTableIndex,
819 struct xgi_hw_device_info *HwDeviceExtension,
820 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200821{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530822 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530824 /* GetOffset */
825 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
826 temp = temp >> 8;
827 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530829 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
830 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530832 if (temp2)
833 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530835 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200836
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530837 switch (temp2) {
838 case 0:
839 temp2 = 1;
840 break;
841 case 1:
842 temp2 = 2;
843 break;
844 case 2:
845 temp2 = 4;
846 break;
847 case 3:
848 temp2 = 4;
849 break;
850 case 4:
851 temp2 = 6;
852 break;
853 case 5:
854 temp2 = 8;
855 break;
856 default:
857 break;
858 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530860 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
861 temp = temp * temp2 + temp2 / 2;
862 else
863 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530865 /* SetOffset */
866 DisplayUnit = temp;
867 temp2 = temp;
868 temp = temp >> 8; /* ah */
869 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200870 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530871 i &= 0xF0;
872 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200873 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200874
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530875 temp = (unsigned char) temp2;
876 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200877 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200878
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530879 /* SetDisplayUnit */
880 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
881 temp2 &= InterlaceMode;
882 if (temp2)
883 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530885 DisplayUnit = DisplayUnit << 5;
886 ah = (DisplayUnit & 0xff00) >> 8;
887 al = DisplayUnit & 0x00ff;
888 if (al == 0)
889 ah += 1;
890 else
891 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200892
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530893 if (HwDeviceExtension->jChipType >= XG20)
894 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
895 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Aaro Koskinen8104e322011-03-13 12:26:22 +0200897 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200898}
899
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200900static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
901 unsigned short ModeIdIndex,
902 unsigned short RefreshRateTableIndex,
903 struct xgi_hw_device_info *HwDeviceExtension,
904 struct vb_device_info *pVBInfo)
905{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200906 unsigned short CRT2Index, VCLKIndex;
907 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200908
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300909 /* si+Ext_ResInfo */
910 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
911 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
912 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200913
914 if (pVBInfo->IF_DEF_LVDS == 0) {
915 CRT2Index = CRT2Index >> 6; /* for LCD */
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200916 if (pVBInfo->VBInfo &
917 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100918 if (pVBInfo->LCDResInfo != Panel_1024x768)
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200919 /* LCDXlat2VCLK */
920 VCLKIndex = VCLK108_2_315 + 5;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200921 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200922 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100923 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200924 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200925 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200926 else
Peter Huewe95072592012-06-14 00:21:48 +0200927 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200928
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200929 if (pVBInfo->SetFlag & TVSimuMode) {
930 if (modeflag & Charx8Dot) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200931 VCLKIndex = TVCLKBASE_315_25 +
932 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200933 } else {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200934 VCLKIndex = TVCLKBASE_315_25 +
935 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200936 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200937 }
938
939 /* 301lv */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300940 if (pVBInfo->VBType & VB_SIS301LV) {
941 if (pVBInfo->SetFlag & RPLLDIV2XO)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200942 VCLKIndex = YPbPr525iVCLK_2;
943 else
944 VCLKIndex = YPbPr525iVCLK;
945 }
946 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200947 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200948 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200949 else
Peter Huewe95072592012-06-14 00:21:48 +0200950 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200951 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300952 /* di+Ext_CRTVCLK */
953 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800954 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300955 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200956 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300957 } else if ((pVBInfo->LCDResInfo == Panel_800x600) ||
958 (pVBInfo->LCDResInfo == Panel_320x480)) { /* LVDS */
959 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
960 } else {
961 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK, LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200962 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200963
964 return VCLKIndex;
965}
966
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800967static void XGI_SetCRT1VCLK(unsigned short ModeNo,
968 unsigned short ModeIdIndex,
969 struct xgi_hw_device_info *HwDeviceExtension,
970 unsigned short RefreshRateTableIndex,
971 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200972{
Bill Pemberton108afbf2010-06-17 13:10:47 -0400973 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530974 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530976 if (pVBInfo->IF_DEF_LVDS == 1) {
977 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200978 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200979 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
980 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530981 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200982 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530983 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200984 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +0100985 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
986 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +0100987 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530988 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
989 RefreshRateTableIndex, HwDeviceExtension,
990 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200991 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200992 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530993 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200994 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530995 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200996 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
997 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530998 } else {
999 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001000 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001001 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1002 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301003 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001004 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301005 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001006 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301007 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301009 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001010 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1011 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001012 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001013 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001014 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301015 index = data;
1016 index &= 0xE0;
1017 data &= 0x1F;
1018 data = data << 1;
1019 data += 1;
1020 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001021 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301022 }
1023 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001024}
1025
Aaro Koskinene85f2032011-11-27 23:03:07 +02001026static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1027{
1028 unsigned char temp;
1029
1030 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1031 temp = (temp & 1) << 6;
1032 /* SR06[6] 18bit Dither */
1033 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1034 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1035 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1036
1037}
1038
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001039static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301040 struct xgi_hw_device_info *HwDeviceExtension,
1041 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001042{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301043 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001044
Aaro Koskinen58839b02011-03-13 12:26:23 +02001045 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301046 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001047 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001048
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001049 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1050 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1051 data &= 0xC0;
1052 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1053 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1054 data |= 0x01;
1055 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301057 if (HwDeviceExtension->jChipType == XG21)
1058 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001059}
1060
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001061static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1062 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1063 struct vb_device_info *pVBInfo)
1064{
1065 unsigned short data, data2 = 0;
1066 short VCLK;
1067
1068 unsigned char index;
1069
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001070 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1071 index &= IndexMask;
1072 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001073
Aaro Koskinen58839b02011-03-13 12:26:23 +02001074 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001075 data &= 0xf3;
1076 if (VCLK >= 200)
1077 data |= 0x0c; /* VCLK > 200 */
1078
1079 if (HwDeviceExtension->jChipType >= XG20)
1080 data &= ~0x04; /* 2 pixel mode */
1081
Aaro Koskinen8104e322011-03-13 12:26:22 +02001082 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001083
1084 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001085 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001086 data &= 0xE7;
1087 if (VCLK < 200)
1088 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001089 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001090 }
1091
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001092 data2 = 0x00;
1093
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001094 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001095 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001096 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001097
1098}
1099
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001100static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301101 unsigned short ModeNo, unsigned short ModeIdIndex,
1102 unsigned short RefreshRateTableIndex,
1103 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001104{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301105 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1106 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001108 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1109 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001110
Aaro Koskinen58839b02011-03-13 12:26:23 +02001111 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001112 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001113
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001114 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301115 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001116 data2 |= 0x02;
1117 data3 = pVBInfo->ModeType - ModeVGA;
1118 data3 = data3 << 2;
1119 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301120 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001121
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301122 if (data)
1123 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001124
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001125 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001126 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001127 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301129 data = 0x0000;
1130 if (infoflag & InterlaceMode) {
1131 if (xres == 1024)
1132 data = 0x0035;
1133 else if (xres == 1280)
1134 data = 0x0048;
1135 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001136
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301137 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001138 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001140 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301142 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001143 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001144
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301145 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301147 if (modeflag & LineCompareOff)
1148 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001149
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001150 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301151 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001152 data = data ^ 0x60;
1153 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001154 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301156 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1157 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001158
Aaro Koskinen58839b02011-03-13 12:26:23 +02001159 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301161 if (HwDeviceExtension->jChipType == XG27) {
1162 if (data & 0x40)
1163 data = 0x2c;
1164 else
1165 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001166 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001167 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301168 } else if (HwDeviceExtension->jChipType >= XG20) {
1169 if (data & 0x40)
1170 data = 0x33;
1171 else
1172 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001173 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1174 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301175 } else {
1176 if (data & 0x40)
1177 data = 0x2c;
1178 else
1179 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001180 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
1183}
1184
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001185static void XGI_WriteDAC(unsigned short dl,
1186 unsigned short ah,
1187 unsigned short al,
1188 unsigned short dh,
1189 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001190{
1191 unsigned short temp, bh, bl;
1192
1193 bh = ah;
1194 bl = al;
1195
1196 if (dl != 0) {
1197 temp = bh;
1198 bh = dh;
1199 dh = temp;
1200 if (dl == 1) {
1201 temp = bl;
1202 bl = dh;
1203 dh = temp;
1204 } else {
1205 temp = bl;
1206 bl = bh;
1207 bh = temp;
1208 }
1209 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001210 outb((unsigned short) dh, pVBInfo->P3c9);
1211 outb((unsigned short) bh, pVBInfo->P3c9);
1212 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001213}
1214
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001215static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301216 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001217{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001218 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1219 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001220
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001221 outb(0xFF, pVBInfo->P3c6);
1222 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001223
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001224 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301225 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301227 for (k = 0; k < 3; k++) {
1228 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301230 if (data & 0x01)
1231 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001232
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301233 if (data & 0x02)
1234 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001235
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001236 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301237 data = data >> 2;
1238 }
1239 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001240
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001241 for (i = 16; i < 32; i++) {
1242 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001243
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001244 for (k = 0; k < 3; k++)
1245 outb(data, pVBInfo->P3c9);
1246 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001247
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001248 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001249
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001250 for (m = 0; m < 9; m++) {
1251 di = si;
1252 bx = si + 0x04;
1253 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001254
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001255 for (n = 0; n < 3; n++) {
1256 for (o = 0; o < 5; o++) {
1257 dh = table[si];
1258 ah = table[di];
1259 al = table[bx];
1260 si++;
1261 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301262 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001263
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001264 si -= 2;
1265
1266 for (o = 0; o < 3; o++) {
1267 dh = table[bx];
1268 ah = table[di];
1269 al = table[si];
1270 si--;
1271 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1272 }
1273
1274 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301275 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001276
1277 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301278 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001279}
1280
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001281static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1282 unsigned short ModeIdIndex,
1283 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001284{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301285 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001286
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001287 /* si+Ext_ResInfo */
1288 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001289
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001290 /* si+Ext_ResInfo */
1291 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001292
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001293 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1294 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001295
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001296 if (modeflag & HalfDCLK)
1297 xres = xres << 1;
1298
1299 if (modeflag & DoubleScanMode)
1300 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301302 if (xres == 720)
1303 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001304
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301305 pVBInfo->VGAHDE = xres;
1306 pVBInfo->HDE = xres;
1307 pVBInfo->VGAVDE = yres;
1308 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001309}
1310
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001311static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1312 unsigned short ModeIdIndex,
1313 unsigned short RefreshRateTableIndex,
1314 struct vb_device_info *pVBInfo)
1315{
Aaro Koskinen898df162012-09-11 00:15:25 +03001316 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001317
1318 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1319
1320 tempbx = BX;
1321
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001322 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1323 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001324
1325 tempal = tempal & 0x0f;
1326
1327 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001328 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001329
Peter Huewea3d675c2012-02-09 21:11:47 +01001330 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001331 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001332 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001333 }
1334
1335 if (tempbx & 0x01)
1336 tempal = (tempal >> 4);
1337
1338 tempal = (tempal & 0x0f);
1339 }
1340
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001341 switch (tempbx) {
1342 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001343 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001344 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001345 break;
1346 case 2:
1347 tempdi = XGI_EPLLCDDataPtr;
1348 break;
1349 case 3:
1350 tempdi = XGI_EPLLCDDesDataPtr;
1351 break;
1352 case 4:
1353 tempdi = XGI_LCDDataTable;
1354 break;
1355 case 5:
1356 tempdi = XGI_LCDDesDataTable;
1357 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001358 default:
1359 break;
1360 }
1361
1362 if (tempdi == NULL) /* OEMUtil */
1363 return NULL;
1364
1365 table = tempbx;
1366 i = 0;
1367
1368 while (tempdi[i].PANELID != 0xff) {
1369 tempdx = pVBInfo->LCDResInfo;
1370 if (tempbx & 0x0080) { /* OEMUtil */
1371 tempbx &= (~0x0080);
1372 tempdx = pVBInfo->LCDTypeInfo;
1373 }
1374
1375 if (pVBInfo->LCDInfo & EnableScalingLCD)
1376 tempdx &= (~PanelResInfo);
1377
1378 if (tempdi[i].PANELID == tempdx) {
1379 tempbx = tempdi[i].MASK;
1380 tempdx = pVBInfo->LCDInfo;
1381
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001382 if (modeflag & HalfDCLK)
1383 tempdx |= SetLCDLowResolution;
1384
1385 tempbx &= tempdx;
1386 if (tempbx == tempdi[i].CAP)
1387 break;
1388 }
1389 i++;
1390 }
1391
1392 if (table == 0) {
1393 switch (tempdi[i].DATAPTR) {
1394 case 0:
1395 return &XGI_LVDSCRT11024x768_1_H[tempal];
1396 break;
1397 case 1:
1398 return &XGI_LVDSCRT11024x768_2_H[tempal];
1399 break;
1400 case 2:
1401 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1402 break;
1403 case 3:
1404 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1405 break;
1406 case 4:
1407 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1408 break;
1409 case 5:
1410 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1411 break;
1412 case 6:
1413 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1414 break;
1415 case 7:
1416 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1417 break;
1418 case 8:
1419 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1420 break;
1421 case 9:
1422 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1423 break;
1424 case 10:
1425 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1426 break;
1427 default:
1428 break;
1429 }
1430 } else if (table == 1) {
1431 switch (tempdi[i].DATAPTR) {
1432 case 0:
1433 return &XGI_LVDSCRT11024x768_1_V[tempal];
1434 break;
1435 case 1:
1436 return &XGI_LVDSCRT11024x768_2_V[tempal];
1437 break;
1438 case 2:
1439 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1440 break;
1441 case 3:
1442 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1443 break;
1444 case 4:
1445 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1446 break;
1447 case 5:
1448 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1449 break;
1450 case 6:
1451 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1452 break;
1453 case 7:
1454 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1455 break;
1456 case 8:
1457 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1458 break;
1459 case 9:
1460 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1461 break;
1462 case 10:
1463 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1464 break;
1465 default:
1466 break;
1467 }
1468 } else if (table == 2) {
1469 switch (tempdi[i].DATAPTR) {
1470 case 0:
1471 return &XGI_LVDS1024x768Data_1[tempal];
1472 break;
1473 case 1:
1474 return &XGI_LVDS1024x768Data_2[tempal];
1475 break;
1476 case 2:
1477 return &XGI_LVDS1280x1024Data_1[tempal];
1478 break;
1479 case 3:
1480 return &XGI_LVDS1280x1024Data_2[tempal];
1481 break;
1482 case 4:
1483 return &XGI_LVDS1400x1050Data_1[tempal];
1484 break;
1485 case 5:
1486 return &XGI_LVDS1400x1050Data_2[tempal];
1487 break;
1488 case 6:
1489 return &XGI_LVDS1600x1200Data_1[tempal];
1490 break;
1491 case 7:
1492 return &XGI_LVDSNoScalingData[tempal];
1493 break;
1494 case 8:
1495 return &XGI_LVDS1024x768Data_1x75[tempal];
1496 break;
1497 case 9:
1498 return &XGI_LVDS1024x768Data_2x75[tempal];
1499 break;
1500 case 10:
1501 return &XGI_LVDS1280x1024Data_1x75[tempal];
1502 break;
1503 case 11:
1504 return &XGI_LVDS1280x1024Data_2x75[tempal];
1505 break;
1506 case 12:
1507 return &XGI_LVDSNoScalingDatax75[tempal];
1508 break;
1509 default:
1510 break;
1511 }
1512 } else if (table == 3) {
1513 switch (tempdi[i].DATAPTR) {
1514 case 0:
1515 return &XGI_LVDS1024x768Des_1[tempal];
1516 break;
1517 case 1:
1518 return &XGI_LVDS1024x768Des_3[tempal];
1519 break;
1520 case 2:
1521 return &XGI_LVDS1024x768Des_2[tempal];
1522 break;
1523 case 3:
1524 return &XGI_LVDS1280x1024Des_1[tempal];
1525 break;
1526 case 4:
1527 return &XGI_LVDS1280x1024Des_2[tempal];
1528 break;
1529 case 5:
1530 return &XGI_LVDS1400x1050Des_1[tempal];
1531 break;
1532 case 6:
1533 return &XGI_LVDS1400x1050Des_2[tempal];
1534 break;
1535 case 7:
1536 return &XGI_LVDS1600x1200Des_1[tempal];
1537 break;
1538 case 8:
1539 return &XGI_LVDSNoScalingDesData[tempal];
1540 break;
1541 case 9:
1542 return &XGI_LVDS1024x768Des_1x75[tempal];
1543 break;
1544 case 10:
1545 return &XGI_LVDS1024x768Des_3x75[tempal];
1546 break;
1547 case 11:
1548 return &XGI_LVDS1024x768Des_2x75[tempal];
1549 break;
1550 case 12:
1551 return &XGI_LVDS1280x1024Des_1x75[tempal];
1552 break;
1553 case 13:
1554 return &XGI_LVDS1280x1024Des_2x75[tempal];
1555 break;
1556 case 14:
1557 return &XGI_LVDSNoScalingDesDatax75[tempal];
1558 break;
1559 default:
1560 break;
1561 }
1562 } else if (table == 4) {
1563 switch (tempdi[i].DATAPTR) {
1564 case 0:
1565 return &XGI_ExtLCD1024x768Data[tempal];
1566 break;
1567 case 1:
1568 return &XGI_StLCD1024x768Data[tempal];
1569 break;
1570 case 2:
1571 return &XGI_CetLCD1024x768Data[tempal];
1572 break;
1573 case 3:
1574 return &XGI_ExtLCD1280x1024Data[tempal];
1575 break;
1576 case 4:
1577 return &XGI_StLCD1280x1024Data[tempal];
1578 break;
1579 case 5:
1580 return &XGI_CetLCD1280x1024Data[tempal];
1581 break;
1582 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001583 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001584 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001585 break;
1586 case 8:
1587 return &XGI_CetLCD1400x1050Data[tempal];
1588 break;
1589 case 9:
1590 return &XGI_ExtLCD1600x1200Data[tempal];
1591 break;
1592 case 10:
1593 return &XGI_StLCD1600x1200Data[tempal];
1594 break;
1595 case 11:
1596 return &XGI_NoScalingData[tempal];
1597 break;
1598 case 12:
1599 return &XGI_ExtLCD1024x768x75Data[tempal];
1600 break;
1601 case 13:
1602 return &XGI_ExtLCD1024x768x75Data[tempal];
1603 break;
1604 case 14:
1605 return &XGI_CetLCD1024x768x75Data[tempal];
1606 break;
1607 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001608 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001609 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001610 break;
1611 case 17:
1612 return &XGI_CetLCD1280x1024x75Data[tempal];
1613 break;
1614 case 18:
1615 return &XGI_NoScalingDatax75[tempal];
1616 break;
1617 default:
1618 break;
1619 }
1620 } else if (table == 5) {
1621 switch (tempdi[i].DATAPTR) {
1622 case 0:
1623 return &XGI_ExtLCDDes1024x768Data[tempal];
1624 break;
1625 case 1:
1626 return &XGI_StLCDDes1024x768Data[tempal];
1627 break;
1628 case 2:
1629 return &XGI_CetLCDDes1024x768Data[tempal];
1630 break;
1631 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001632 if ((pVBInfo->VBType & VB_SIS301LV) ||
1633 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001634 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1635 else
1636 return &XGI_ExtLCDDes1280x1024Data[tempal];
1637 break;
1638 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001639 if ((pVBInfo->VBType & VB_SIS301LV) ||
1640 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001641 return &XGI_StLCDDLDes1280x1024Data[tempal];
1642 else
1643 return &XGI_StLCDDes1280x1024Data[tempal];
1644 break;
1645 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001646 if ((pVBInfo->VBType & VB_SIS301LV) ||
1647 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001648 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1649 else
1650 return &XGI_CetLCDDes1280x1024Data[tempal];
1651 break;
1652 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001653 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001654 if ((pVBInfo->VBType & VB_SIS301LV) ||
1655 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001656 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001657 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001658 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001659 break;
1660 case 8:
1661 return &XGI_CetLCDDes1400x1050Data[tempal];
1662 break;
1663 case 9:
1664 return &XGI_CetLCDDes1400x1050Data2[tempal];
1665 break;
1666 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001667 if ((pVBInfo->VBType & VB_SIS301LV) ||
1668 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001669 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1670 else
1671 return &XGI_ExtLCDDes1600x1200Data[tempal];
1672 break;
1673 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001674 if ((pVBInfo->VBType & VB_SIS301LV) ||
1675 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001676 return &XGI_StLCDDLDes1600x1200Data[tempal];
1677 else
1678 return &XGI_StLCDDes1600x1200Data[tempal];
1679 break;
1680 case 12:
1681 return &XGI_NoScalingDesData[tempal];
1682 break;
1683 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001684 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001685 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001686 break;
1687 case 15:
1688 return &XGI_CetLCDDes1024x768x75Data[tempal];
1689 break;
1690 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001691 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001692 if ((pVBInfo->VBType & VB_SIS301LV) ||
1693 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001694 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001695 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001696 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001697 break;
1698 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001699 if ((pVBInfo->VBType & VB_SIS301LV) ||
1700 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001701 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1702 else
1703 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1704 break;
1705 case 19:
1706 return &XGI_NoScalingDesDatax75[tempal];
1707 break;
1708 default:
1709 break;
1710 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001711 }
1712 return NULL;
1713}
1714
Aaro Koskinen24572542012-09-11 00:15:21 +03001715static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001716 unsigned short ModeIdIndex,
1717 unsigned short RefreshRateTableIndex,
1718 struct vb_device_info *pVBInfo)
1719{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001720 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001721
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001722 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1723 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001724 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001725 tempdx = pVBInfo->TVInfo;
1726
1727 if (pVBInfo->VBInfo & SetInSlaveMode)
1728 tempdx = tempdx | SetTVLockMode;
1729
1730 if (modeflag & HalfDCLK)
1731 tempdx = tempdx | SetTVLowResolution;
1732
1733 i = 0;
1734
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001735 while (XGI_TVDataTable[i].MASK != 0xffff) {
1736 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1737 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001738 break;
1739 i++;
1740 }
1741
Aaro Koskinen18ba8662012-09-11 00:15:22 +03001742 return &XGI_TVDataTable[i].DATAPTR[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001743}
1744
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001745static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301746 unsigned short RefreshRateTableIndex,
1747 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001748{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301749 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001750 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301752 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001753
Peter Huewea3d675c2012-02-09 21:11:47 +01001754 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe51f984b2012-06-14 00:21:51 +02001755 LCDPtr = (struct SiS_LVDSData *)XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301756 ModeNo, ModeIdIndex, RefreshRateTableIndex,
1757 pVBInfo);
1758 pVBInfo->VGAHT = LCDPtr->VGAHT;
1759 pVBInfo->VGAVT = LCDPtr->VGAVT;
1760 pVBInfo->HT = LCDPtr->LCDHT;
1761 pVBInfo->VT = LCDPtr->LCDVT;
1762 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001763
Peter Huewea3d675c2012-02-09 21:11:47 +01001764 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301765 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1766 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001767 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1768 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301769 pVBInfo->HDE = 1024;
1770 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001771 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001772 (pVBInfo->LCDResInfo ==
1773 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301774 pVBInfo->HDE = 1280;
1775 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001776 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301777 pVBInfo->HDE = 1400;
1778 pVBInfo->VDE = 1050;
1779 } else {
1780 pVBInfo->HDE = 1600;
1781 pVBInfo->VDE = 1200;
1782 }
1783 }
1784 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001785}
1786
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001787static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301788 unsigned short RefreshRateTableIndex,
1789 struct xgi_hw_device_info *HwDeviceExtension,
1790 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001791{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301792 unsigned char index;
1793 unsigned short tempbx, i;
1794 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1795 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001796
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001797 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301798 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001799
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001800 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001801
Peter Huewea3d675c2012-02-09 21:11:47 +01001802 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001803 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
1804 XGI_GetLcdPtr(tempbx, ModeNo,
1805 ModeIdIndex,
1806 RefreshRateTableIndex,
1807 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001808
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001809 for (i = 0; i < 8; i++)
1810 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301811 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001812
1813 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1814
1815 tempbx = 1;
1816
Peter Huewea3d675c2012-02-09 21:11:47 +01001817 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001818 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
1819 XGI_GetLcdPtr(
1820 tempbx,
1821 ModeNo,
1822 ModeIdIndex,
1823 RefreshRateTableIndex,
1824 pVBInfo);
1825 for (i = 0; i < 7; i++)
1826 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1827 }
1828
1829 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001830}
1831
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001832static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1833{
1834 unsigned char tempal, tempah, tempbl, i;
1835
Aaro Koskinen58839b02011-03-13 12:26:23 +02001836 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001837 tempal = tempah & 0x0F;
1838 tempah = tempah & 0xF0;
1839 i = 0;
1840 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1841
1842 while (tempbl != 0xFF) {
1843 if (tempbl & 0x80) { /* OEMUtil */
1844 tempal = tempah;
1845 tempbl = tempbl & ~(0x80);
1846 }
1847
1848 if (tempal == tempbl)
1849 break;
1850
1851 i++;
1852
1853 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1854 }
1855
1856 return i;
1857}
1858
1859static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1860{
1861 unsigned short tempah, tempal, tempbl, i;
1862
1863 tempal = pVBInfo->LCDResInfo;
1864 tempah = pVBInfo->LCDTypeInfo;
1865
1866 i = 0;
1867 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1868
1869 while (tempbl != 0xFF) {
1870 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1871 tempal = tempah;
1872 tempbl &= ~0x80;
1873 }
1874
1875 if (tempal == tempbl)
1876 break;
1877
1878 i++;
1879 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1880 }
1881
1882 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001883 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001884 pVBInfo->LCDTypeInfo = 0;
1885 i = 0;
1886 }
1887
1888 return i;
1889}
1890
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001891static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1892 unsigned short *VSyncWidth,
1893 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001894{
1895 unsigned short Index;
1896
1897 Index = XGI_GetLCDCapPtr(pVBInfo);
1898 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1899 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1900
1901 return;
1902}
1903
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001904static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301905 unsigned short RefreshRateTableIndex,
1906 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001907{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301908 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1909 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03001910 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301911 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001912
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001913 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03001914 tempbx = 3;
1915 if (pVBInfo->LCDInfo & EnableScalingLCD)
1916 LCDPtr1 =
1917 (struct XGI330_LCDDataDesStruct2 *)
1918 XGI_GetLcdPtr(
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001919 tempbx,
1920 ModeNo,
1921 ModeIdIndex,
1922 RefreshRateTableIndex,
1923 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03001924 else
1925 LCDPtr =
Aaro Koskinend00d12f2012-04-07 01:14:10 +03001926 (struct XGI_LCDDesStruct *)
Aaro Koskinen66cface2011-08-31 21:46:13 +03001927 XGI_GetLcdPtr(
1928 tempbx,
1929 ModeNo,
1930 ModeIdIndex,
1931 RefreshRateTableIndex,
1932 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001933
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001934 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1935 push1 = tempbx;
1936 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001937
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001938 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01001939 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1940 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001941 tempax = 1024;
1942 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001943 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1944 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001945 tempax = 1280;
1946 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001947 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001948 tempax = 1400;
1949 tempbx = 1050;
1950 } else {
1951 tempax = 1600;
1952 tempbx = 1200;
1953 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001954
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001955 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1956 pVBInfo->HDE = tempax;
1957 pVBInfo->VDE = tempbx;
1958 pVBInfo->VGAHDE = tempax;
1959 pVBInfo->VGAVDE = tempbx;
1960 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001961
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001962 tempax = pVBInfo->HT;
1963
1964 if (pVBInfo->LCDInfo & EnableScalingLCD)
1965 tempbx = LCDPtr1->LCDHDES;
1966 else
1967 tempbx = LCDPtr->LCDHDES;
1968
1969 tempcx = pVBInfo->HDE;
1970 tempbx = tempbx & 0x0fff;
1971 tempcx += tempbx;
1972
1973 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001974 tempcx -= tempax;
1975
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001976 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001977
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001978 tempcx = tempcx >> 3;
1979 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001980
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001981 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1982 (unsigned short) (tempbx & 0xff));
1983 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1984 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001985
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001986 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001987
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001988 if (pVBInfo->LCDInfo & EnableScalingLCD)
1989 tempbx = LCDPtr1->LCDHRS;
1990 else
1991 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001992
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001993 tempcx = push2;
1994
1995 if (pVBInfo->LCDInfo & EnableScalingLCD)
1996 tempcx = LCDPtr1->LCDHSync;
1997
1998 tempcx += tempbx;
1999
2000 if (tempcx >= tempax)
2001 tempcx -= tempax;
2002
2003 tempax = tempbx & 0x07;
2004 tempax = tempax >> 5;
2005 tempcx = tempcx >> 3;
2006 tempbx = tempbx >> 3;
2007
2008 tempcx &= 0x1f;
2009 tempax |= tempcx;
2010
2011 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2012 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2013 (unsigned short) (tempbx & 0xff));
2014
2015 tempax = pVBInfo->VT;
2016 if (pVBInfo->LCDInfo & EnableScalingLCD)
2017 tempbx = LCDPtr1->LCDVDES;
2018 else
2019 tempbx = LCDPtr->LCDVDES;
2020 tempcx = pVBInfo->VDE;
2021
2022 tempbx = tempbx & 0x0fff;
2023 tempcx += tempbx;
2024 if (tempcx >= tempax)
2025 tempcx -= tempax;
2026
2027 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2028 (unsigned short) (tempbx & 0xff));
2029 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2030 (unsigned short) (tempcx & 0xff));
2031
2032 tempbx = (tempbx >> 8) & 0x07;
2033 tempcx = (tempcx >> 8) & 0x07;
2034
2035 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2036 (unsigned short) ((tempcx << 3)
2037 | tempbx));
2038
2039 tempax = pVBInfo->VT;
2040 if (pVBInfo->LCDInfo & EnableScalingLCD)
2041 tempbx = LCDPtr1->LCDVRS;
2042 else
2043 tempbx = LCDPtr->LCDVRS;
2044
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002045 tempcx = push1;
2046
2047 if (pVBInfo->LCDInfo & EnableScalingLCD)
2048 tempcx = LCDPtr1->LCDVSync;
2049
2050 tempcx += tempbx;
2051 if (tempcx >= tempax)
2052 tempcx -= tempax;
2053
2054 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2055 (unsigned short) (tempbx & 0xff));
2056 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2057 (unsigned short) (tempcx & 0x0f));
2058
2059 tempax = ((tempbx >> 8) & 0x07) << 3;
2060
2061 tempbx = pVBInfo->VGAVDE;
2062 if (tempbx != pVBInfo->VDE)
2063 tempax |= 0x40;
2064
Peter Huewea3d675c2012-02-09 21:11:47 +01002065 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002066 tempax |= 0x40;
2067
2068 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2069 tempax);
2070
2071 tempcx = pVBInfo->VGAVT;
2072 tempbx = pVBInfo->VDE;
2073 tempax = pVBInfo->VGAVDE;
2074 tempcx -= tempax;
2075
2076 temp = tempax; /* 0430 ylshieh */
2077 temp1 = (temp << 18) / tempbx;
2078
2079 tempdx = (unsigned short) ((temp << 18) % tempbx);
2080
2081 if (tempdx != 0)
2082 temp1 += 1;
2083
2084 temp2 = temp1;
2085 push3 = temp2;
2086
2087 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2088 (unsigned short) (temp2 & 0xff));
2089 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2090 (unsigned short) ((temp2 >> 8) & 0xff));
2091
2092 tempbx = (unsigned short) (temp2 >> 16);
2093 tempax = tempbx & 0x03;
2094
2095 tempbx = pVBInfo->VGAVDE;
2096 if (tempbx == pVBInfo->VDE)
2097 tempax |= 0x04;
2098
2099 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2100
2101 if (pVBInfo->VBType & VB_XGI301C) {
2102 temp2 = push3;
2103 xgifb_reg_set(pVBInfo->Part4Port,
2104 0x3c,
2105 (unsigned short) (temp2 & 0xff));
2106 xgifb_reg_set(pVBInfo->Part4Port,
2107 0x3b,
2108 (unsigned short) ((temp2 >> 8) &
2109 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002110 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002111 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2112 ~0xc0,
2113 (unsigned short) ((tempbx &
2114 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002115
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002116 tempcx = pVBInfo->VGAVDE;
2117 if (tempcx == pVBInfo->VDE)
2118 xgifb_reg_and_or(pVBInfo->Part4Port,
2119 0x30, ~0x0c, 0x00);
2120 else
2121 xgifb_reg_and_or(pVBInfo->Part4Port,
2122 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302123 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002124
2125 tempcx = pVBInfo->VGAHDE;
2126 tempbx = pVBInfo->HDE;
2127
2128 temp1 = tempcx << 16;
2129
2130 tempax = (unsigned short) (temp1 / tempbx);
2131
2132 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2133 tempax = 65535;
2134
2135 temp3 = tempax;
2136 temp1 = pVBInfo->VGAHDE << 16;
2137
2138 temp1 /= temp3;
2139 temp3 = temp3 << 16;
2140 temp1 -= 1;
2141
2142 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2143
2144 tempax = (unsigned short) (temp3 & 0xff);
2145 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2146
2147 temp1 = pVBInfo->VGAVDE << 18;
2148 temp1 = temp1 / push3;
2149 tempbx = (unsigned short) (temp1 & 0xffff);
2150
Peter Huewe255aabd2012-02-09 21:11:44 +01002151 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002152 tempbx -= 1;
2153
2154 tempax = ((tempbx >> 8) & 0xff) << 3;
2155 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2156 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2157 (unsigned short) (tempax & 0xff));
2158 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2159 (unsigned short) (tempbx & 0xff));
2160
2161 temp3 = temp3 >> 16;
2162
2163 if (modeflag & HalfDCLK)
2164 temp3 = temp3 >> 1;
2165
2166 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2167 (unsigned short) ((temp3 >> 8) & 0xff));
2168 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2169 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002170}
2171
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002172/* --------------------------------------------------------------------- */
2173/* Function : XGI_GETLCDVCLKPtr */
2174/* Input : */
2175/* Output : al -> VCLK Index */
2176/* Description : */
2177/* --------------------------------------------------------------------- */
2178static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2179 struct vb_device_info *pVBInfo)
2180{
2181 unsigned short index;
2182
Peter Huewea3d675c2012-02-09 21:11:47 +01002183 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002184 index = XGI_GetLCDCapPtr1(pVBInfo);
2185
2186 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2187 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2188 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2189 } else { /* LCDA */
2190 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2191 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2192 }
2193 }
2194 return;
2195}
2196
2197static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2198 unsigned short ModeNo, unsigned short ModeIdIndex,
2199 struct vb_device_info *pVBInfo)
2200{
2201
2202 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002203 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002204
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002205 /* si+Ext_ResInfo */
2206 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002207
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002208 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2209 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002210 index = XGI_GetLCDCapPtr(pVBInfo);
2211 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2212
Peter Huewea3d675c2012-02-09 21:11:47 +01002213 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002214 return tempal;
2215
2216 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002217 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002218 (VB_SIS301B |
2219 VB_SIS302B |
2220 VB_SIS301LV |
2221 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002222 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002223 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002224 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002225 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002226 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002227 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002228 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002229 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002230 tempal = TVCLKBASE_315 +
2231 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002232
2233 }
2234 return tempal;
2235 }
2236
Peter Huewe599801f2012-02-09 21:11:45 +01002237 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002238 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002239 return tempal;
2240 }
2241
Peter Huewe599801f2012-02-09 21:11:45 +01002242 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002243 tempal = YPbPr525pVCLK;
2244 return tempal;
2245 }
2246
2247 tempal = NTSC1024VCLK;
2248
2249 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002250 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002251 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002252 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002253 }
2254
2255 if (pVBInfo->VBInfo & SetCRT2ToTV)
2256 return tempal;
2257 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002258 } /* {End of VB} */
2259
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002260 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002261 tempal = tempal >> 2;
2262 tempal &= 0x03;
2263
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002264 /* for Dot8 Scaling LCD */
2265 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002266 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2267
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002268 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2269 return tempal;
2270}
2271
2272static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2273 unsigned char *di_1, struct vb_device_info *pVBInfo)
2274{
Peter Huewe6896b942012-02-09 21:11:46 +01002275 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2276 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002277 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
2278 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinene8cb03d2012-09-11 00:15:31 +03002279 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
2280 *di_1 = XGI_VBVCLKData[tempal].Part4_C;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002281 }
2282 } else {
2283 *di_0 = XGI_VCLKData[tempal].SR2B;
2284 *di_1 = XGI_VCLKData[tempal].SR2C;
2285 }
2286}
2287
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002288static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302289 unsigned short RefreshRateTableIndex,
2290 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002291{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302292 unsigned char di_0, di_1, tempal;
2293 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002294
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302295 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2296 pVBInfo);
2297 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2298 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302300 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002301 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302302 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002303 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302304 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002305 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2306 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302307 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002308 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2309 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302310 }
2311 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002312}
2313
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002314static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302315 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002316{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302317 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002318
Peter Huewe6896b942012-02-09 21:11:46 +01002319 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2320 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302321 tempcl = 0;
2322 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002323 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302325 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002326 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302327 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002328 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302329 if (!(temp & 0x40))
2330 tempcl |= ActiveCRT1;
2331 }
2332 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002333
Aaro Koskinen58839b02011-03-13 12:26:23 +02002334 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302335 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302337 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002338 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002339 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302340 if (tempax & 0x04)
2341 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002342
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302343 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302345 if (!(tempcl & ActiveLCD))
2346 if (temp == 0x01)
2347 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002348
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302349 if (temp == 0x04)
2350 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302352 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002353 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302355 if (!(temp & 0x08))
2356 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002357
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302358 if (!(temp & 0x04))
2359 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002360
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302361 if (temp & 0x02)
2362 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002363
Peter Huewe599801f2012-02-09 21:11:45 +01002364 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302365 if (temp & 0x01)
2366 tempch |= ActiveHiTV;
2367 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002368
Peter Huewe599801f2012-02-09 21:11:45 +01002369 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002370 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302371 pVBInfo->Part2Port,
2372 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302374 if (temp & 0x10)
2375 tempch |= ActiveYPbPr;
2376 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002377
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302378 if (tempch != 0)
2379 tempcl |= ActiveTV;
2380 }
2381 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002382
Aaro Koskinen58839b02011-03-13 12:26:23 +02002383 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302384 if (tempcl & ActiveLCD) {
2385 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2386 if (temp & ActiveTV)
2387 tempcl |= ActiveTV;
2388 }
2389 }
2390 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002391 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002392 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002393
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302394 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002395 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302396 } else {
2397 return;
2398 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002399}
2400
Bill Pemberton80adad82010-06-17 13:10:51 -04002401void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002402{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302403 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002404
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002405 if (pVBInfo->IF_DEF_LVDS != 0)
2406 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002407
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002408 tempbx = VB_SIS302B;
2409 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2410 if (flag == 0x02)
2411 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002412
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002413 tempbx = VB_SIS301;
2414 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2415 if (flag < 0xB0)
2416 goto finish;
2417
2418 tempbx = VB_SIS301B;
2419 if (flag < 0xC0)
2420 goto bigger_than_0xB0;
2421
2422 tempbx = VB_XGI301C;
2423 if (flag < 0xD0)
2424 goto bigger_than_0xB0;
2425
2426 tempbx = VB_SIS301LV;
2427 if (flag < 0xE0)
2428 goto bigger_than_0xB0;
2429
2430 tempbx = VB_SIS302LV;
2431 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2432 if (tempah != 0xFF)
2433 tempbx = VB_XGI301C;
2434
2435bigger_than_0xB0:
2436 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2437 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2438 if (!(flag & 0x02))
2439 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302440 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002441
2442finish:
2443 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002444}
2445
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002446static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302447 struct xgi_hw_device_info *HwDeviceExtension,
2448 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002449{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302450 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002451
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002452 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302453 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002454 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302455 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002456
Miguel Gómezf9317352012-07-06 12:40:48 +02002457 if (!(pVBInfo->VBType & 0xFFFF))
2458 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002459
Miguel Gómezf9317352012-07-06 12:40:48 +02002460 /* Check Display Device */
2461 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2462 tempbx = tempbx | temp;
2463 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2464 push = temp;
2465 push = push << 8;
2466 tempax = temp << 8;
2467 tempbx = tempbx | tempax;
2468 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2469 | SetInSlaveMode | DisableCRT2Display);
2470 temp = 0xFFFF ^ temp;
2471 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002472
Miguel Gómezf9317352012-07-06 12:40:48 +02002473 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002474
Aaro Koskinen4d8f5ca2012-09-11 00:15:17 +03002475 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002476 if (pVBInfo->VBType &
2477 (VB_SIS302B |
2478 VB_SIS301LV |
2479 VB_SIS302LV |
2480 VB_XGI301C)) {
2481 if (temp & EnableDualEdge) {
2482 tempbx |= SetCRT2ToDualEdge;
2483 if (temp & SetToLCDA)
2484 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002485 }
2486 }
2487 }
2488
2489 if (pVBInfo->IF_DEF_YPbPr == 1) {
2490 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2491 ((pVBInfo->VBType & VB_SIS301LV) ||
2492 (pVBInfo->VBType & VB_SIS302LV) ||
2493 (pVBInfo->VBType & VB_XGI301C)))) {
2494 if (temp & SetYPbPr) {
2495 if (pVBInfo->IF_DEF_HiVision == 1) {
2496 /* shampoo add for new
2497 * scratch */
2498 temp = xgifb_reg_get(
2499 pVBInfo->P3d4,
2500 0x35);
2501 temp &= YPbPrMode;
2502 tempbx |= SetCRT2ToHiVision;
2503
2504 if (temp != YPbPrMode1080i) {
2505 tempbx &=
2506 (~SetCRT2ToHiVision);
2507 tempbx |=
2508 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302509 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302510 }
2511 }
2512 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002513 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002514
Miguel Gómezf9317352012-07-06 12:40:48 +02002515 tempax = push; /* restore CR31 */
2516
2517 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302518 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002519 if (pVBInfo->IF_DEF_HiVision == 1)
2520 temp = 0x09FC;
2521 else
2522 temp = 0x097C;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002523 } else if (pVBInfo->IF_DEF_HiVision == 1) {
2524 temp = 0x01FC;
Miguel Gómezf9317352012-07-06 12:40:48 +02002525 } else {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002526 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302527 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002528 } else { /* 3nd party chip */
2529 temp = SetCRT2ToLCD;
2530 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002531
Miguel Gómezf9317352012-07-06 12:40:48 +02002532 if (!(tempbx & temp)) {
2533 tempax |= DisableCRT2Display;
2534 tempbx = 0;
2535 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002536
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002537 if (!(pVBInfo->VBType & VB_NoLCD)) {
2538 if (tempbx & XGI_SetCRT2ToLCDA) {
2539 if (tempbx & SetSimuScanMode)
2540 tempbx &= (~(SetCRT2ToLCD |
2541 SetCRT2ToRAMDAC |
2542 SwitchCRT2));
2543 else
2544 tempbx &= (~(SetCRT2ToLCD |
2545 SetCRT2ToRAMDAC |
2546 SetCRT2ToTV |
2547 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002548 }
2549 }
2550
2551 /* shampoo add */
2552 /* for driver abnormal */
2553 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2554 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2555 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002556 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002557 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002558 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002559 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002560 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302561 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002562 } else {
2563 tempbx &= (~(SetCRT2ToRAMDAC |
2564 SetCRT2ToLCD |
2565 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302566 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002567 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002568
Miguel Gómezf9317352012-07-06 12:40:48 +02002569 if (!(pVBInfo->VBType & VB_NoLCD)) {
2570 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002571 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002572 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002573 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002574 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002575 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302576 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002577 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002578
Miguel Gómezf9317352012-07-06 12:40:48 +02002579 if (tempbx & SetCRT2ToSCART) {
2580 tempbx &= (0xFF00 |
2581 SetCRT2ToSCART |
2582 SwitchCRT2 |
2583 SetSimuScanMode);
2584 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2585 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002586
Miguel Gómezf9317352012-07-06 12:40:48 +02002587 if (pVBInfo->IF_DEF_YPbPr == 1) {
2588 if (tempbx & SetCRT2ToYPbPr525750)
2589 tempbx &= (0xFF00 |
2590 SwitchCRT2 |
2591 SetSimuScanMode);
2592 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002593
Miguel Gómezf9317352012-07-06 12:40:48 +02002594 if (pVBInfo->IF_DEF_HiVision == 1) {
2595 if (tempbx & SetCRT2ToHiVision)
2596 tempbx &= (0xFF00 |
2597 SetCRT2ToHiVision |
2598 SwitchCRT2 |
2599 SetSimuScanMode);
2600 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002601
Miguel Gómezf9317352012-07-06 12:40:48 +02002602 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2603 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2604 tempbx = DisableCRT2Display;
2605 }
2606
2607 if (!(tempbx & DisableCRT2Display)) {
2608 if ((!(tempbx & DriverMode)) ||
2609 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002610 if (!(tempbx & XGI_SetCRT2ToLCDA))
2611 tempbx |= (SetInSlaveMode |
2612 SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02002613 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002614
Miguel Gómezf9317352012-07-06 12:40:48 +02002615 /* LCD+TV can't support in slave mode
2616 * (Force LCDA+TV->LCDB) */
2617 if ((tempbx & SetInSlaveMode) &&
2618 (tempbx & XGI_SetCRT2ToLCDA)) {
2619 tempbx ^= (SetCRT2ToLCD |
2620 XGI_SetCRT2ToLCDA |
2621 SetCRT2ToDualEdge);
2622 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302623 }
2624 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302626 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002627}
2628
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002629static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302630 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002631{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302632 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302634 tempbx = 0;
2635 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302637 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002638 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2639 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302641 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002642 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302643 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002644 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002645 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002646 TVSetPALM |
2647 TVSetPALN |
2648 TVSetPAL);
2649 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002650 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002651 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302652 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002653 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002654 TVSetNTSCJ |
2655 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302656 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302658 if (pVBInfo->IF_DEF_LVDS == 0) {
2659 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002660 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302661 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002662
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302663 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002664 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002665 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302666 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002667
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302668 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002669 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302671 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002672 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302673 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002674 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302675 }
2676 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002677
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302678 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002679 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2680 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302681 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302683 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002684 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2685 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302686 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002687
Peter Huewe599801f2012-02-09 21:11:45 +01002688 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002689 (modeflag > 13) &&
2690 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302691 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002692
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302693 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002694
Peter Huewe599801f2012-02-09 21:11:45 +01002695 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302696 if (pVBInfo->VBInfo & SetInSlaveMode)
2697 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002698 } else if (tempbx &
2699 (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302700 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002701 } else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002702 (VB_SIS301B |
2703 VB_SIS302B |
2704 VB_SIS301LV |
2705 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002706 VB_XGI301C))) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002707 if (tempbx & TVSimuMode)
2708 tempbx &= (~RPLLDIV2XO);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302709 }
2710 }
2711 }
2712 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002713}
2714
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002715static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2716 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002717{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302718 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302720 pVBInfo->LCDResInfo = 0;
2721 pVBInfo->LCDTypeInfo = 0;
2722 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002723
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002724 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2725 /* si+Ext_ResInfo // */
2726 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002727 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302728 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002729
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302730 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002731 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002732
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002733 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002734 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302735 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002736 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002737 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302738 tempax &= 0x0F;
2739 else
2740 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302742 if ((resinfo == 6) || (resinfo == 9)) {
2743 if (tempax >= 3)
2744 tempbx |= PanelRef75Hz;
2745 } else if ((resinfo == 7) || (resinfo == 8)) {
2746 if (tempax >= 4)
2747 tempbx |= PanelRef75Hz;
2748 }
2749 }
2750 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002751
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302752 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002753
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302754 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002755
Peter Huewea3d675c2012-02-09 21:11:47 +01002756 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302757 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302759 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002760
Aaro Koskinen58839b02011-03-13 12:26:23 +02002761 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002762
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302763 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302765 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002766
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302767 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002768
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302769 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302771 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002772 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002773 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302774 tempbx |= SetLCDDualLink;
2775 }
2776 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302778 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002779 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002780 & SetCRT2ToLCD) && (resinfo == 9) &&
2781 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002782 /*
2783 * set to center in 1280x1024 LCDB
2784 * for Panel_1400x1050
2785 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002786 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302787 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302789 if (pVBInfo->VBInfo & SetInSlaveMode) {
2790 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002791 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302792 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002793 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302794 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302796 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302798 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002799}
2800
Bill Pemberton108afbf2010-06-17 13:10:47 -04002801unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302802 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002803{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002804 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2805 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2806 break;
2807 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2808 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302809 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002810
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302811 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002812}
2813
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002814static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2815{
2816 unsigned char ujRet = 0;
2817 unsigned char i = 0;
2818
2819 for (i = 0; i < 8; i++) {
2820 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002821 ujRet |= (ujDate >> i) & 1;
2822 }
2823
2824 return ujRet;
2825}
2826
2827/*----------------------------------------------------------------------------*/
2828/* output */
2829/* bl[5] : LVDS signal */
2830/* bl[1] : LVDS backlight */
2831/* bl[0] : LVDS VDD */
2832/*----------------------------------------------------------------------------*/
2833static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2834{
2835 unsigned char CR4A, temp;
2836
Aaro Koskinen58839b02011-03-13 12:26:23 +02002837 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002838 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002839
Aaro Koskinen58839b02011-03-13 12:26:23 +02002840 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002841
2842 temp = XG21GPIODataTransfer(temp);
2843 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002844 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002845 return temp;
2846}
2847
2848/*----------------------------------------------------------------------------*/
2849/* output */
2850/* bl[5] : LVDS signal */
2851/* bl[1] : LVDS backlight */
2852/* bl[0] : LVDS VDD */
2853/*----------------------------------------------------------------------------*/
2854static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2855{
2856 unsigned char CR4A, CRB4, temp;
2857
Aaro Koskinen58839b02011-03-13 12:26:23 +02002858 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002859 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002860
Aaro Koskinen58839b02011-03-13 12:26:23 +02002861 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002862
2863 temp &= 0x0C;
2864 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002865 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002866 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002867 temp |= ((CRB4 & 0x04) << 3);
2868 return temp;
2869}
2870
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002871/*----------------------------------------------------------------------------*/
2872/* input */
2873/* bl[5] : 1;LVDS signal on */
2874/* bl[1] : 1;LVDS backlight on */
2875/* bl[0] : 1:LVDS VDD on */
2876/* bh: 100000b : clear bit 5, to set bit5 */
2877/* 000010b : clear bit 1, to set bit1 */
2878/* 000001b : clear bit 0, to set bit0 */
2879/*----------------------------------------------------------------------------*/
2880static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2881 struct vb_device_info *pVBInfo)
2882{
2883 unsigned char CR4A, temp;
2884
2885 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2886 tempbh &= 0x23;
2887 tempbl &= 0x23;
2888 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2889
2890 if (tempbh & 0x20) {
2891 temp = (tempbl >> 4) & 0x02;
2892
2893 /* CR B4[1] */
2894 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2895
2896 }
2897
2898 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2899
2900 temp = XG21GPIODataTransfer(temp);
2901 temp &= ~tempbh;
2902 temp |= tempbl;
2903 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2904}
2905
Aaro Koskinen776115a2011-11-27 23:03:10 +02002906static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2907 struct vb_device_info *pVBInfo)
2908{
2909 unsigned char CR4A, temp;
2910 unsigned short tempbh0, tempbl0;
2911
2912 tempbh0 = tempbh;
2913 tempbl0 = tempbl;
2914 tempbh0 &= 0x20;
2915 tempbl0 &= 0x20;
2916 tempbh0 >>= 3;
2917 tempbl0 >>= 3;
2918
2919 if (tempbh & 0x20) {
2920 temp = (tempbl >> 4) & 0x02;
2921
2922 /* CR B4[1] */
2923 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2924
2925 }
2926 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2927
2928 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2929 tempbh &= 0x03;
2930 tempbl &= 0x03;
2931 tempbh <<= 2;
2932 tempbl <<= 2; /* GPIOC,GPIOD */
2933 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2934 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2935}
2936
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002937static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2938 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302939 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002940{
2941
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002942 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 if (pXGIHWDE->jChipType == XG21) {
2944 if (pVBInfo->IF_DEF_LVDS == 1) {
2945 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002946 /* LVDS VDD on */
2947 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002948 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302949 }
2950 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002951 /* LVDS signal on */
2952 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002953 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002954 /* LVDS backlight on */
2955 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302956 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002957 /* DVO/DVI signal on */
2958 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302959 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302961 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302963 if (pXGIHWDE->jChipType == XG27) {
2964 if (pVBInfo->IF_DEF_LVDS == 1) {
2965 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002966 /* LVDS VDD on */
2967 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002968 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302969 }
2970 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002971 /* LVDS signal on */
2972 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002973 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002974 /* LVDS backlight on */
2975 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302976 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002977 /* DVO/DVI signal on */
2978 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302979 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302981 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002982}
2983
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002984void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2985 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302986 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002987{
2988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302989 if (pXGIHWDE->jChipType == XG21) {
2990 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002991 /* LVDS backlight off */
2992 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002993 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302994 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002995 /* DVO/DVI signal off */
2996 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 }
2998 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002999
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303000 if (pXGIHWDE->jChipType == XG27) {
3001 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003002 /* LVDS backlight off */
3003 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03003004 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303005 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003006
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303007 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003008 /* DVO/DVI signal off */
3009 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303010 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003011
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003012 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003013}
3014
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003015static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003016{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003017 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303018 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003019
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02003020 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303021 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003022}
3023
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003024static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003025{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003026 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003027}
3028
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003029static void XGI_SaveCRT2Info(unsigned short ModeNo,
3030 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003031{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303032 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003033
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003034 /* reserve CR34 for CRT1 Mode No */
3035 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303036 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3037 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003038 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003039}
3040
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003041static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3042 unsigned short ModeIdIndex,
3043 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003044{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303045 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003046
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003047 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003048 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3049 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3050 /* si+St_ModeFlag */
3051 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003052
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003053 if (modeflag & HalfDCLK)
3054 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003055
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003056 if (modeflag & DoubleScanMode)
3057 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003058
Miguel Gómez3339db82012-07-06 12:40:49 +02003059 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3060 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003061
Miguel Gómez3339db82012-07-06 12:40:49 +02003062 if (pVBInfo->IF_DEF_LVDS == 0) {
3063 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3064 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3065 if (yres == 1024)
3066 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303067 }
3068 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003069
Miguel Gómez3339db82012-07-06 12:40:49 +02003070 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3071 if (yres == 400)
3072 yres = 405;
3073 else if (yres == 350)
3074 yres = 360;
3075
3076 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3077 if (yres == 360)
3078 yres = 375;
3079 }
3080 }
3081
3082 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3083 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3084 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3085 if (yres == 350)
3086 yres = 357;
3087 else if (yres == 400)
3088 yres = 420;
3089 else if (yres == 480)
3090 yres = 525;
3091 }
3092 }
3093 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303094 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003095
Miguel Gómez3339db82012-07-06 12:40:49 +02003096 if (xres == 720)
3097 xres = 640;
3098
3099exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303100 pVBInfo->VGAHDE = xres;
3101 pVBInfo->HDE = xres;
3102 pVBInfo->VGAVDE = yres;
3103 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003104}
3105
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003106static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003107{
3108
Peter Huewea3d675c2012-02-09 21:11:47 +01003109 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003110 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003112
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303113 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003114}
3115
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003116static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3117 unsigned short ModeIdIndex,
3118 unsigned short RefreshRateTableIndex,
3119 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003120{
3121 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003122 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003123
3124 pVBInfo->RVBHCMAX = 1;
3125 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003126 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3127 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3128 CRT1Index &= IndexMask;
3129 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3130 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3131 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3132 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3133 tempcx = (unsigned short)
3134 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3135 tempcx &= 0x0100;
3136 tempcx = tempcx << 2;
3137 tempbx |= tempcx;
3138 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003139
3140 if (temp1 & 0x01)
3141 tempbx |= 0x0100;
3142
3143 if (temp1 & 0x20)
3144 tempbx |= 0x0200;
3145 tempax += 5;
3146
3147 if (modeflag & Charx8Dot)
3148 tempax *= 8;
3149 else
3150 tempax *= 9;
3151
3152 pVBInfo->VGAHT = tempax;
3153 pVBInfo->HT = tempax;
3154 tempbx++;
3155 pVBInfo->VGAVT = tempbx;
3156 pVBInfo->VT = tempbx;
3157}
3158
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003159static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303160 unsigned short RefreshRateTableIndex,
3161 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003162{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303163 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003164
Peter Huewefc39dcb2012-01-15 19:22:12 +01003165 struct SiS_LCDData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003166
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003167 /* si+Ext_ResInfo */
3168 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3169 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303170 pVBInfo->NewFlickerMode = 0;
3171 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3174 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3175 pVBInfo);
3176 return;
3177 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003178
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303179 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003180
Peter Huewea3d675c2012-02-09 21:11:47 +01003181 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewefc39dcb2012-01-15 19:22:12 +01003182 LCDPtr = (struct SiS_LCDData *) XGI_GetLcdPtr(tempbx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303183 ModeNo, ModeIdIndex, RefreshRateTableIndex,
3184 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303186 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3187 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3188 pVBInfo->VGAHT = LCDPtr->VGAHT;
3189 pVBInfo->VGAVT = LCDPtr->VGAVT;
3190 pVBInfo->HT = LCDPtr->LCDHT;
3191 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003192
Peter Huewe255aabd2012-02-09 21:11:44 +01003193 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303194 tempax = 1024;
3195 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003196
Peter Huewea3d675c2012-02-09 21:11:47 +01003197 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303198 if (pVBInfo->VGAVDE == 357)
3199 tempbx = 527;
3200 else if (pVBInfo->VGAVDE == 420)
3201 tempbx = 620;
3202 else if (pVBInfo->VGAVDE == 525)
3203 tempbx = 775;
3204 else if (pVBInfo->VGAVDE == 600)
3205 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303206 else
3207 tempbx = 768;
3208 } else
3209 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003210 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303211 tempax = 1024;
3212 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003213 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303214 tempax = 1280;
3215 if (pVBInfo->VGAVDE == 360)
3216 tempbx = 768;
3217 else if (pVBInfo->VGAVDE == 375)
3218 tempbx = 800;
3219 else if (pVBInfo->VGAVDE == 405)
3220 tempbx = 864;
3221 else
3222 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003223 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303224 tempax = 1280;
3225 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003226 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303227 tempax = 1280;
3228 if (pVBInfo->VGAVDE == 350)
3229 tempbx = 700;
3230 else if (pVBInfo->VGAVDE == 400)
3231 tempbx = 800;
3232 else if (pVBInfo->VGAVDE == 1024)
3233 tempbx = 960;
3234 else
3235 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003236 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303237 tempax = 1400;
3238 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303240 if (pVBInfo->VGAVDE == 1024) {
3241 tempax = 1280;
3242 tempbx = 1024;
3243 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003244 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 tempax = 1600;
3246 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003247 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303248 if (pVBInfo->VGAVDE == 350)
3249 tempbx = 875;
3250 else if (pVBInfo->VGAVDE == 400)
3251 tempbx = 1000;
3252 }
3253 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003254
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303255 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3256 tempax = pVBInfo->VGAHDE;
3257 tempbx = pVBInfo->VGAVDE;
3258 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003259
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303260 pVBInfo->HDE = tempax;
3261 pVBInfo->VDE = tempbx;
3262 return;
3263 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303265 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03003266 struct SiS_TVData const *TVPtr;
3267
3268 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3269 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303271 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3272 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3273 pVBInfo->VGAHT = TVPtr->VGAHT;
3274 pVBInfo->VGAVT = TVPtr->VGAVT;
3275 pVBInfo->HDE = TVPtr->TVHDE;
3276 pVBInfo->VDE = TVPtr->TVVDE;
3277 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3278 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003279
Peter Huewe599801f2012-02-09 21:11:45 +01003280 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303281 if (resinfo == 0x08)
3282 pVBInfo->NewFlickerMode = 0x40;
3283 else if (resinfo == 0x09)
3284 pVBInfo->NewFlickerMode = 0x40;
3285 else if (resinfo == 0x12)
3286 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003287
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303288 if (pVBInfo->VGAVDE == 350)
3289 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 tempax = ExtHiTVHT;
3292 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303294 if (pVBInfo->VBInfo & SetInSlaveMode) {
3295 if (pVBInfo->TVInfo & TVSimuMode) {
3296 tempax = StHiTVHT;
3297 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003298
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303299 if (!(modeflag & Charx8Dot)) {
3300 tempax = StHiTextTVHT;
3301 tempbx = StHiTextTVVT;
3302 }
3303 }
3304 }
Peter Huewe599801f2012-02-09 21:11:45 +01003305 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3306 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303307 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3308 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3309 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003310
Peter Huewe599801f2012-02-09 21:11:45 +01003311 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303312 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3313 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003314 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3316 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3317 if (pVBInfo->TVInfo & NTSC1024x768)
3318 tempax = NTSC1024x768HT;
3319 }
3320 } else {
3321 tempax = PALHT;
3322 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003323 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303324 tempax = NTSCHT;
3325 tempbx = NTSCVT;
3326 if (pVBInfo->TVInfo & NTSC1024x768)
3327 tempax = NTSC1024x768HT;
3328 }
3329 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003330
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 pVBInfo->HT = tempax;
3332 pVBInfo->VT = tempbx;
3333 return;
3334 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003335}
3336
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003337static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 unsigned short RefreshRateTableIndex,
3339 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003340{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003341 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003342
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303343 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3344 pVBInfo);
3345 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3346 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003347
Peter Huewe6896b942012-02-09 21:11:46 +01003348 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303349 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003350 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3351 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3352 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303353 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003354 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3355 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303356 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003357
Aaro Koskinen8104e322011-03-13 12:26:22 +02003358 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303360 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003361 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303362 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003363 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003364}
3365
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003366static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3367 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003368{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003369 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3370 short index;
3371 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303372
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003373 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003374 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303375
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003376 if (index < 0)
3377 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303378
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003379 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303380}
3381
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003382static unsigned short XGI_GetOffset(unsigned short ModeNo,
3383 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303384 unsigned short RefreshRateTableIndex,
3385 struct xgi_hw_device_info *HwDeviceExtension,
3386 struct vb_device_info *pVBInfo)
3387{
3388 unsigned short temp, colordepth, modeinfo, index, infoflag,
3389 ColorDepth[] = { 0x01, 0x02, 0x04 };
3390
3391 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003392 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303393
3394 index = (modeinfo >> 8) & 0xFF;
3395
3396 temp = pVBInfo->ScreenOffset[index];
3397
3398 if (infoflag & InterlaceMode)
3399 temp = temp << 1;
3400
3401 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3402
3403 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3404 temp = ModeNo - 0x7C;
3405 colordepth = ColorDepth[temp];
3406 temp = 0x6B;
3407 if (infoflag & InterlaceMode)
3408 temp = temp << 1;
3409 return temp * colordepth;
3410 } else {
3411 return temp * colordepth;
3412 }
3413}
3414
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003415static void XGI_SetCRT2Offset(unsigned short ModeNo,
3416 unsigned short ModeIdIndex,
3417 unsigned short RefreshRateTableIndex,
3418 struct xgi_hw_device_info *HwDeviceExtension,
3419 struct vb_device_info *pVBInfo)
3420{
3421 unsigned short offset;
3422 unsigned char temp;
3423
3424 if (pVBInfo->VBInfo & SetInSlaveMode)
3425 return;
3426
3427 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3428 HwDeviceExtension, pVBInfo);
3429 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003430 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003431 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003432 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003433 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003434 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003435}
3436
Randy Dunlap89229672010-08-10 08:46:44 -07003437static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003438{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003439 /* threshold high ,disable auto threshold */
3440 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3441 /* threshold low default 04h */
3442 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443}
3444
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003445static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303446 struct xgi_hw_device_info *HwDeviceExtension,
3447 unsigned short RefreshRateTableIndex,
3448 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003449{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303450 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003451
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003452 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3453 CRT1Index &= IndexMask;
3454 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003455
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303456 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3457 HwDeviceExtension, pVBInfo);
3458 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003461 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003462
Aaro Koskinen8104e322011-03-13 12:26:22 +02003463 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3464 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003465}
3466
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003467static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303468 struct xgi_hw_device_info *HwDeviceExtension,
3469 unsigned short RefreshRateTableIndex,
3470 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003471{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303472 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3473 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003474
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003475 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3476 CRT1Index &= IndexMask;
3477 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3478 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003479
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 /* bainy change table name */
3481 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003482 /* BTVGA2HT 0x08,0x09 */
3483 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003484 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303485 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003486 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003487 /* BTVGA2HDEE 0x0A,0x0C */
3488 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003489 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303490 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3491 pushbx = pVBInfo->VGAHDE / 2 + 16;
3492 tempcx = tempcx >> 1;
3493 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3494 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003495
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3497 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003498 tempbx |= ((pVBInfo->
3499 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3500 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303501 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3502 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3503 tempcx &= 0x1F;
3504 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3505 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3506 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3507 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003508
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303509 tempbx += 4;
3510 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303512 if (tempcx > (pVBInfo->VGAHT / 2))
3513 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003516
Aaro Koskinen8104e322011-03-13 12:26:22 +02003517 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303518 } else {
3519 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003520 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303521 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003522 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003523 /* BTVGA2HDEE 0x0A,0x0C */
3524 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003525 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303526 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3527 pushbx = pVBInfo->VGAHDE + 16;
3528 tempcx = tempcx >> 1;
3529 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3530 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003531
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303532 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3533 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003534 tempbx |= ((pVBInfo->
3535 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3536 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303537 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3538 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3539 tempcx &= 0x1F;
3540 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3541 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3542 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3543 tempbx += 16;
3544 tempcx += 16;
3545 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003546
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303547 if (tempcx > pVBInfo->VGAHT)
3548 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003549
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303550 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003551 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303552 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003553
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303554 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3555 tempbx = pushbx;
3556 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3557 tempax |= (tempbx & 0xFF00);
3558 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003559 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303560 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003561 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303562 tempcx = (pVBInfo->VGAVT - 1);
3563 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003564
Aaro Koskinen8104e322011-03-13 12:26:22 +02003565 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303566 tempbx = pVBInfo->VGAVDE - 1;
3567 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003568 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303569 temp = ((tempbx & 0xFF00) << 3) >> 8;
3570 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003571 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003572
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303573 tempax = pVBInfo->VGAVDE;
3574 tempbx = pVBInfo->VGAVDE;
3575 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003576 /* BTVGA2VRS 0x10,0x11 */
3577 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3578 /* BTVGA2VRE 0x11 */
3579 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003580
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303581 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3582 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3583 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303585 if (temp & 0x04)
3586 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003587
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303588 if (temp & 0x080)
3589 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003590
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303591 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303593 if (temp & 0x08)
3594 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303596 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3597 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3598 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303600 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003601 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303602 temp = ((tempbx & 0xFF00) >> 8) << 4;
3603 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003604 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303605 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303607 if (modeflag & DoubleScanMode)
3608 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303610 if (modeflag & HalfDCLK)
3611 tempax |= 0x40;
3612
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003613 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003614}
3615
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003616static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3617{
3618 unsigned long tempax, tempbx;
3619
3620 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3621 & 0xFFFF;
3622 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3623 tempax = (tempax * pVBInfo->HT) / tempbx;
3624
3625 return (unsigned short) tempax;
3626}
3627
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003628static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303629 struct xgi_hw_device_info *HwDeviceExtension,
3630 unsigned short RefreshRateTableIndex,
3631 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003632{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303633 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3634 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003635
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003636 /* si+Ext_ResInfo */
3637 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3638 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3639 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3640 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303642 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3643 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003644
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303645 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003646 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303647 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003648
Peter Huewe6896b942012-02-09 21:11:46 +01003649 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303650 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303652 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 if (modeflag & HalfDCLK)
3655 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303657 tempax = (tempax / tempcx) - 1;
3658 tempbx |= ((tempax & 0x00FF) << 8);
3659 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003660 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003661
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303662 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303664 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003665 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3666 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303667 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003668
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003669 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3670 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303671 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303672 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003673
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003674 /* 0x05 Horizontal Display Start */
3675 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3676 /* 0x06 Horizontal Blank end */
3677 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003678
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303679 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3680 if (pVBInfo->VBInfo & SetCRT2ToTV)
3681 tempax = pVBInfo->VGAHT;
3682 else
3683 tempax = XGI_GetVGAHT2(pVBInfo);
3684 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003685
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303686 if (tempax >= pVBInfo->VGAHT)
3687 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003688
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303689 if (modeflag & HalfDCLK)
3690 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303692 tempax = (tempax / tempcx) - 5;
3693 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003694 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303695 temp = (tempbx & 0x00FF) - 1;
3696 if (!(modeflag & HalfDCLK)) {
3697 temp -= 6;
3698 if (pVBInfo->TVInfo & TVSimuMode) {
3699 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003700 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 }
3702 }
3703 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 tempbx = (tempbx & 0xFF00) >> 8;
3705 tempcx = (tempcx + tempbx) >> 1;
3706 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303708 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3709 temp -= 1;
3710 if (!(modeflag & HalfDCLK)) {
3711 if ((modeflag & Charx8Dot)) {
3712 temp += 4;
3713 if (pVBInfo->VGAHDE >= 800)
3714 temp -= 6;
3715 }
3716 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003717 } else if (!(modeflag & HalfDCLK)) {
3718 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003719 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003720 pVBInfo->VGAHDE >= 800) {
3721 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003722 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003723 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003724 (pVBInfo->LCDInfo & LCDNonExpanding))
3725 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303726 }
3727 }
3728 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003729
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003730 /* 0x07 Horizontal Retrace Start */
3731 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3732 /* 0x08 Horizontal Retrace End */
3733 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303735 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3736 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003737 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303738 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003739 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303740 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003741 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303742 0x08, 0x03);
3743 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003744 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303745 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003746 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303747 0x08, 0x02);
3748 }
3749 }
3750 }
3751 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003752
Aaro Koskinen8104e322011-03-13 12:26:22 +02003753 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003754 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003755 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303757 tempbx = pVBInfo->VGAVT;
3758 push1 = tempbx;
3759 tempcx = 0x121;
3760 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303762 if (tempbx == 357)
3763 tempbx = 350;
3764 if (tempbx == 360)
3765 tempbx = 350;
3766 if (tempbx == 375)
3767 tempbx = 350;
3768 if (tempbx == 405)
3769 tempbx = 400;
3770 if (tempbx == 525)
3771 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003772
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303773 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003774
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303775 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003776 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003777 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303778 if (tempbx == 350)
3779 tempbx += 5;
3780 if (tempbx == 480)
3781 tempbx += 5;
3782 }
3783 }
3784 }
3785 tempbx--;
3786 temp = tempbx & 0x00FF;
3787 tempbx--;
3788 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003789 /* 0x10 vertical Blank Start */
3790 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303791 tempbx = push2;
3792 tempbx--;
3793 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003794 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003795
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303796 if (tempbx & 0x0100)
3797 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303799 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303801 if (modeflag & DoubleScanMode)
3802 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303804 if (tempbx & 0x0200)
3805 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303807 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003808 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303810 if (tempbx & 0x0400)
3811 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003812
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003813 /* 0x11 Vertival Blank End */
3814 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303815
3816 tempax = push1;
3817 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3818 tempax = tempax >> 2;
3819 push1 = tempax; /* push ax */
3820
3821 if (resinfo != 0x09) {
3822 tempax = tempax << 1;
3823 tempbx += tempax;
3824 }
3825
Peter Huewe599801f2012-02-09 21:11:45 +01003826 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003827 if ((pVBInfo->VBType & VB_SIS301LV) &&
3828 !(pVBInfo->TVInfo & TVSetHiVision)) {
3829 if ((pVBInfo->TVInfo & TVSimuMode) &&
3830 (pVBInfo->TVInfo & TVSetPAL)) {
3831 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3832 !(pVBInfo->TVInfo &
3833 (TVSetYPbPr525p |
3834 TVSetYPbPr750p |
3835 TVSetHiVision)))
3836 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303837 }
3838 } else {
3839 tempbx -= 10;
3840 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003841 } else if (pVBInfo->TVInfo & TVSimuMode) {
3842 if (pVBInfo->TVInfo & TVSetPAL) {
3843 if (pVBInfo->VBType & VB_SIS301LV) {
3844 if (!(pVBInfo->TVInfo &
3845 (TVSetYPbPr525p |
3846 TVSetYPbPr750p |
3847 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303848 tempbx += 40;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003849 } else {
3850 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303851 }
3852 }
3853 }
3854 tempax = push1;
3855 tempax = tempax >> 2;
3856 tempax++;
3857 tempax += tempbx;
3858 push1 = tempax; /* push ax */
3859
Peter Huewe599801f2012-02-09 21:11:45 +01003860 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303861 if (tempbx <= 513) {
3862 if (tempax >= 513)
3863 tempbx = 513;
3864 }
3865 }
3866
3867 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003868 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303869 tempbx--;
3870 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003871 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303872
3873 if (tempbx & 0x0100)
3874 tempcx |= 0x0008;
3875
3876 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003877 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303878
3879 tempbx++;
3880
3881 if (tempbx & 0x0100)
3882 tempcx |= 0x0004;
3883
3884 if (tempbx & 0x0200)
3885 tempcx |= 0x0080;
3886
3887 if (tempbx & 0x0400)
3888 tempcx |= 0x0C00;
3889
3890 tempbx = push1; /* pop ax */
3891 temp = tempbx & 0x00FF;
3892 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003893 /* 0x0D vertical Retrace End */
3894 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303895
3896 if (tempbx & 0x0010)
3897 tempcx |= 0x2000;
3898
3899 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003900 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303901 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003902 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303903 tempax = modeflag;
3904 temp = (tempax & 0xFF00) >> 8;
3905
3906 temp = (temp >> 1) & 0x09;
3907
Peter Huewe6896b942012-02-09 21:11:46 +01003908 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303909 temp |= 0x01;
3910
Aaro Koskinen8104e322011-03-13 12:26:22 +02003911 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3912 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3913 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303914
3915 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3916 temp = 0x80;
3917 else
3918 temp = 0x00;
3919
Aaro Koskinen8104e322011-03-13 12:26:22 +02003920 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303921
3922 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003923}
3924
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003925static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303926 unsigned short RefreshRateTableIndex,
3927 struct xgi_hw_device_info *HwDeviceExtension,
3928 struct vb_device_info *pVBInfo)
3929{
3930 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
3931 modeflag, resinfo, crt2crtc;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003932 unsigned char const *TimingPoint;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303933
3934 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3935
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003936 /* si+Ext_ResInfo */
3937 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3938 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3939 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303940
3941 tempax = 0;
3942
3943 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3944 tempax |= 0x0800;
3945
3946 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3947 tempax |= 0x0400;
3948
3949 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3950 tempax |= 0x0200;
3951
Peter Huewe599801f2012-02-09 21:11:45 +01003952 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303953 tempax |= 0x1000;
3954
Peter Huewe599801f2012-02-09 21:11:45 +01003955 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303956 tempax |= 0x0100;
3957
Peter Huewe599801f2012-02-09 21:11:45 +01003958 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303959 tempax &= 0xfe00;
3960
3961 tempax = (tempax & 0xff00) >> 8;
3962
Aaro Koskinen8104e322011-03-13 12:26:22 +02003963 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003964 TimingPoint = XGI330_NTSCTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303965
Peter Huewe599801f2012-02-09 21:11:45 +01003966 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003967 TimingPoint = XGI330_PALTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303968
Peter Huewe599801f2012-02-09 21:11:45 +01003969 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003970 TimingPoint = XGI330_HiTVExtTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971
3972 if (pVBInfo->VBInfo & SetInSlaveMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003973 TimingPoint = XGI330_HiTVSt2Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303974
3975 if (pVBInfo->SetFlag & TVSimuMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003976 TimingPoint = XGI330_HiTVSt1Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977
3978 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003979 TimingPoint = XGI330_HiTVTextTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303980 }
3981
Peter Huewe599801f2012-02-09 21:11:45 +01003982 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3983 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003984 TimingPoint = XGI330_YPbPr525iTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303985
Peter Huewe599801f2012-02-09 21:11:45 +01003986 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003987 TimingPoint = XGI330_YPbPr525pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303988
Peter Huewe599801f2012-02-09 21:11:45 +01003989 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003990 TimingPoint = XGI330_YPbPr750pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303991 }
3992
3993 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003994 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995
3996 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003997 /* di->temp2[j] */
3998 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303999
4000 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004001 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304002
4003 temp = pVBInfo->NewFlickerMode;
4004 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004005 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304006
Peter Huewe599801f2012-02-09 21:11:45 +01004007 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304008 tempax = 950;
4009
Peter Huewe599801f2012-02-09 21:11:45 +01004010 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304011 tempax = 520;
4012 else
4013 tempax = 440;
4014
4015 if (pVBInfo->VDE <= tempax) {
4016 tempax -= pVBInfo->VDE;
4017 tempax = tempax >> 2;
4018 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
4019 push1 = tempax;
4020 temp = (tempax & 0xFF00) >> 8;
4021 temp += (unsigned short) TimingPoint[0];
4022
Peter Huewe6896b942012-02-09 21:11:46 +01004023 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4024 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304025 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4026 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004027 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304028 tempcx = pVBInfo->VGAHDE;
4029 if (tempcx >= 1024) {
4030 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004031 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304032 temp = 0x19; /* PAL */
4033 }
4034 }
4035 }
4036
Aaro Koskinen8104e322011-03-13 12:26:22 +02004037 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304038 tempax = push1;
4039 temp = (tempax & 0xFF00) >> 8;
4040 temp += TimingPoint[1];
4041
Peter Huewe6896b942012-02-09 21:11:46 +01004042 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4043 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304044 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4045 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004046 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304047 tempcx = pVBInfo->VGAHDE;
4048 if (tempcx >= 1024) {
4049 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004050 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304051 temp = 0x52; /* PAL */
4052 }
4053 }
4054 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004055 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304056 }
4057
4058 /* 301b */
4059 tempcx = pVBInfo->HT;
4060
4061 if (XGI_IsLCDDualLink(pVBInfo))
4062 tempcx = tempcx >> 1;
4063
4064 tempcx -= 2;
4065 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004066 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304067
4068 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004069 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304070
4071 tempcx = pVBInfo->HT >> 1;
4072 push1 = tempcx; /* push cx */
4073 tempcx += 7;
4074
Peter Huewe599801f2012-02-09 21:11:45 +01004075 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304076 tempcx -= 4;
4077
4078 temp = tempcx & 0x00FF;
4079 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004080 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304081
4082 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4083 tempbx += tempcx;
4084 push2 = tempbx;
4085 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004086 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304087 temp = (tempbx & 0xFF00) >> 8;
4088 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004089 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090
4091 tempbx = push2;
4092 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004093 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304094 tempbx = tempbx - 4;
4095 tempcx = tempbx;
4096 }
4097
4098 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004099 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304100
4101 j += 2;
4102 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4103 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004104 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304105 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004106 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304107
4108 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004109 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304110 tempcx -= 4;
4111
4112 temp = tempcx & 0xFF;
4113 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004114 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304115
4116 tempcx = push1; /* pop cx */
4117 j += 2;
4118 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4119 tempcx -= temp;
4120 temp = tempcx & 0x00FF;
4121 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004122 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304123
4124 tempcx -= 11;
4125
4126 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4127 tempax = XGI_GetVGAHT2(pVBInfo);
4128 tempcx = tempax - 1;
4129 }
4130 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004131 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304132
4133 tempbx = pVBInfo->VDE;
4134
4135 if (pVBInfo->VGAVDE == 360)
4136 tempbx = 746;
4137 if (pVBInfo->VGAVDE == 375)
4138 tempbx = 746;
4139 if (pVBInfo->VGAVDE == 405)
4140 tempbx = 853;
4141
4142 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004143 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004144 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004145 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004146 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304147 tempbx = tempbx >> 1;
4148 } else
4149 tempbx = tempbx >> 1;
4150 }
4151
4152 tempbx -= 2;
4153 temp = tempbx & 0x00FF;
4154
Peter Huewe599801f2012-02-09 21:11:45 +01004155 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004156 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004157 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304158 if (pVBInfo->VBInfo & SetInSlaveMode) {
4159 if (ModeNo == 0x2f)
4160 temp += 1;
4161 }
4162 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004163 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
4164 if (ModeNo == 0x2f)
4165 temp += 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304166 }
4167 }
4168
Aaro Koskinen8104e322011-03-13 12:26:22 +02004169 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304170
4171 temp = (tempcx & 0xFF00) >> 8;
4172 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4173
Peter Huewe599801f2012-02-09 21:11:45 +01004174 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004175 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004176 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304177 temp |= 0x10;
4178
4179 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4180 temp |= 0x20;
4181 }
4182 } else {
4183 temp |= 0x10;
4184 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4185 temp |= 0x20;
4186 }
4187 }
4188
Aaro Koskinen8104e322011-03-13 12:26:22 +02004189 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304190
Peter Huewe6896b942012-02-09 21:11:46 +01004191 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4192 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304193 tempbx = pVBInfo->VDE;
4194 tempcx = tempbx - 2;
4195
4196 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004197 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4198 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304199 tempbx = tempbx >> 1;
4200 }
4201
Peter Huewe6896b942012-02-09 21:11:46 +01004202 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304203 temp = 0;
4204 if (tempcx & 0x0400)
4205 temp |= 0x20;
4206
4207 if (tempbx & 0x0400)
4208 temp |= 0x40;
4209
Aaro Koskinen8104e322011-03-13 12:26:22 +02004210 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304211 }
4212
4213 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004214 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304215 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004216 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304217 }
4218
4219 tempbx = tempbx & 0x00FF;
4220
4221 if (!(modeflag & HalfDCLK)) {
4222 tempcx = pVBInfo->VGAHDE;
4223 if (tempcx >= pVBInfo->HDE) {
4224 tempbx |= 0x2000;
4225 tempax &= 0x00FF;
4226 }
4227 }
4228
4229 tempcx = 0x0101;
4230
4231 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4232 if (pVBInfo->VGAHDE >= 1024) {
4233 tempcx = 0x1920;
4234 if (pVBInfo->VGAHDE >= 1280) {
4235 tempcx = 0x1420;
4236 tempbx = tempbx & 0xDFFF;
4237 }
4238 }
4239 }
4240
4241 if (!(tempbx & 0x2000)) {
4242 if (modeflag & HalfDCLK)
4243 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4244
4245 push1 = tempbx;
4246 tempeax = pVBInfo->VGAHDE;
4247 tempebx = (tempcx & 0xFF00) >> 8;
4248 longtemp = tempeax * tempebx;
4249 tempecx = tempcx & 0x00FF;
4250 longtemp = longtemp / tempecx;
4251
4252 /* 301b */
4253 tempecx = 8 * 1024;
4254
Peter Huewe6896b942012-02-09 21:11:46 +01004255 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4256 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304257 tempecx = tempecx * 8;
4258 }
4259
4260 longtemp = longtemp * tempecx;
4261 tempecx = pVBInfo->HDE;
4262 temp2 = longtemp % tempecx;
4263 tempeax = longtemp / tempecx;
4264 if (temp2 != 0)
4265 tempeax += 1;
4266
4267 tempax = (unsigned short) tempeax;
4268
4269 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004270 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4271 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304272 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4273 }
4274 /* end 301b */
4275
4276 tempbx = push1;
4277 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4278 | (tempbx & 0x00FF));
4279 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4280 | (tempax & 0x00FF));
4281 temp = (tempax & 0xFF00) >> 8;
4282 } else {
4283 temp = (tempax & 0x00FF) >> 8;
4284 }
4285
Aaro Koskinen8104e322011-03-13 12:26:22 +02004286 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304287 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004288 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304289 temp = tempcx & 0x00FF;
4290
4291 if (tempbx & 0x2000)
4292 temp = 0;
4293
4294 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4295 temp |= 0x18;
4296
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004297 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004298 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304299 tempbx = 0x0382;
4300 tempcx = 0x007e;
4301 } else {
4302 tempbx = 0x0369;
4303 tempcx = 0x0061;
4304 }
4305
4306 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004307 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004309 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304310
4311 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4312 temp = temp << 2;
4313 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4314
Peter Huewe599801f2012-02-09 21:11:45 +01004315 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304316 temp |= 0x10;
4317
Peter Huewe599801f2012-02-09 21:11:45 +01004318 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304319 temp |= 0x20;
4320
Peter Huewe599801f2012-02-09 21:11:45 +01004321 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304322 temp |= 0x60;
4323 }
4324
Aaro Koskinen8104e322011-03-13 12:26:22 +02004325 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004326 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004327 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304328
Peter Huewe599801f2012-02-09 21:11:45 +01004329 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304330 if (pVBInfo->TVInfo & NTSC1024x768) {
4331 TimingPoint = XGI_NTSC1024AdjTime;
4332 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004333 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 TimingPoint[j]);
4335 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004336 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304337 }
4338 }
4339
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004340 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304341 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004342 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004343 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304344 0x08); /* PALM Mode */
4345 }
4346
Peter Huewe599801f2012-02-09 21:11:45 +01004347 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004348 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349 0x01);
4350 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004351 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304352
Aaro Koskinendc505562011-03-13 12:26:26 +02004353 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304354 }
4355
Peter Huewe599801f2012-02-09 21:11:45 +01004356 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304357 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004358 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304359 }
4360
4361 if (pVBInfo->VBInfo & SetCRT2ToTV)
4362 return;
4363}
4364
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004365static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304366 struct xgi_hw_device_info *HwDeviceExtension,
4367 unsigned short RefreshRateTableIndex,
4368 struct vb_device_info *pVBInfo)
4369{
4370 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4371 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4372
4373 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4374
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004375 /* si+Ext_ResInfo */
4376 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4377 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4378 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4379 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304380
4381 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4382 return;
4383
4384 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4385
4386 if (XGI_IsLCDDualLink(pVBInfo))
4387 tempbx = tempbx >> 1;
4388
4389 tempbx -= 1;
4390 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004391 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 temp = (tempbx & 0xFF00) >> 8;
4393 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004394 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304395 temp = 0x01;
4396
Aaro Koskinen8104e322011-03-13 12:26:22 +02004397 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304398 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4399 push1 = tempbx;
4400 tempbx--;
4401 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004402 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304403 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004404 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304405
4406 tempcx = pVBInfo->VT - 1;
4407 push2 = tempcx + 1;
4408 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004409 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304410 temp = (tempcx & 0xFF00) >> 8;
4411 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004412 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004413 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4414 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4415 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4416 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304417
4418 /* Customized LCDB Des no add */
4419 tempbx = 5;
4420 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
4421 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4422 tempah = pVBInfo->LCDResInfo;
4423 tempah &= PanelResInfo;
4424
Peter Huewe255aabd2012-02-09 21:11:44 +01004425 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304426 tempbx = 1024;
4427 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004428 } else if ((tempah == Panel_1280x1024) ||
4429 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304430 tempbx = 1280;
4431 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004432 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304433 tempbx = 1400;
4434 tempcx = 1050;
4435 } else {
4436 tempbx = 1600;
4437 tempcx = 1200;
4438 }
4439
4440 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4441 tempbx = pVBInfo->HDE;
4442 tempcx = pVBInfo->VDE;
4443 }
4444
4445 pushbx = tempbx;
4446 tempax = pVBInfo->VT;
4447 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4448 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4449 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4450 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4451 tempbx = pVBInfo->LCDVDES;
4452 tempcx += tempbx;
4453
4454 if (tempcx >= tempax)
4455 tempcx -= tempax; /* lcdvdes */
4456
4457 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004458 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304459 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004460 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304461 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4462 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4463 tempah = tempch;
4464 tempah = tempah << 3;
4465 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004466 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467
4468 /* getlcdsync() */
4469 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4470 tempcx = tempbx;
4471 tempax = pVBInfo->VT;
4472 tempbx = pVBInfo->LCDVRS;
4473
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304474 tempcx += tempbx;
4475 if (tempcx >= tempax)
4476 tempcx -= tempax;
4477
4478 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004479 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304480 temp = (tempbx & 0xFF00) >> 8;
4481 temp = temp << 4;
4482 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004483 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304484 tempcx = pushbx;
4485 tempax = pVBInfo->HT;
4486 tempbx = pVBInfo->LCDHDES;
4487 tempbx &= 0x0FFF;
4488
4489 if (XGI_IsLCDDualLink(pVBInfo)) {
4490 tempax = tempax >> 1;
4491 tempbx = tempbx >> 1;
4492 tempcx = tempcx >> 1;
4493 }
4494
Peter Huewe6896b942012-02-09 21:11:46 +01004495 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304496 tempbx += 1;
4497
4498 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4499 tempbx += 1;
4500
4501 tempcx += tempbx;
4502
4503 if (tempcx >= tempax)
4504 tempcx -= tempax;
4505
4506 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004507 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004509 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004511 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304512 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004513 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304514
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304515 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4516 tempcx = tempax;
4517 tempax = pVBInfo->HT;
4518 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304519 if (XGI_IsLCDDualLink(pVBInfo)) {
4520 tempax = tempax >> 1;
4521 tempbx = tempbx >> 1;
4522 tempcx = tempcx >> 1;
4523 }
4524
Peter Huewe6896b942012-02-09 21:11:46 +01004525 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304526 tempbx += 1;
4527
4528 tempcx += tempbx;
4529
4530 if (tempcx >= tempax)
4531 tempcx -= tempax;
4532
4533 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004534 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304535
4536 temp = (tempbx & 0xFF00) >> 8;
4537 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004538 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304539 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004540 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304541
Peter Huewea3d675c2012-02-09 21:11:47 +01004542 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304543 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004544 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4545 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304546 | VB_XGI301C)) {
4547 temp = 0xC6;
4548 } else
4549 temp = 0xC4;
4550
Aaro Koskinen8104e322011-03-13 12:26:22 +02004551 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4552 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 }
4554
4555 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004556 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4557 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304558 | VB_XGI301C)) {
4559 temp = 0x4F;
4560 } else
4561 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004562 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304563 }
4564 }
4565}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004566
4567/* --------------------------------------------------------------------- */
4568/* Function : XGI_GetTap4Ptr */
4569/* Input : */
4570/* Output : di -> Tap4 Reg. Setting Pointer */
4571/* Description : */
4572/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004573static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304574 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004575{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304576 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004577
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304578 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004579
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304580 if (tempcx == 0) {
4581 tempax = pVBInfo->VGAHDE;
4582 tempbx = pVBInfo->HDE;
4583 } else {
4584 tempax = pVBInfo->VGAVDE;
4585 tempbx = pVBInfo->VDE;
4586 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004587
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004588 if (tempax <= tempbx)
4589 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304590 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004591 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004592
Peter Huewe599801f2012-02-09 21:11:45 +01004593 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304594 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004595
Peter Huewe599801f2012-02-09 21:11:45 +01004596 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4597 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4598 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004599 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004600 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304601 Tap4TimingPtr = YPbPr750pTap4Timing;
4602 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004603
Peter Huewe599801f2012-02-09 21:11:45 +01004604 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004605 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304607 i = 0;
4608 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4609 if (Tap4TimingPtr[i].DE == tempax)
4610 break;
4611 i++;
4612 }
4613 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004614}
4615
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004616static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004617{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304618 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004619
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304620 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304622 if (!(pVBInfo->VBType & VB_XGI301C))
4623 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004624
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304625 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4626 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004627 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004628
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004629 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004630 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004631 /* Set Vertical Scaling */
4632 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304633 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004634 xgifb_reg_set(pVBInfo->Part2Port,
4635 i,
4636 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304637 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004638
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004639 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004640 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004641 /* Enable V.Scaling */
4642 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304643 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004644 /* Enable H.Scaling */
4645 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004646}
4647
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004648static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304649 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004650{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304651 unsigned short i;
Aaro Koskinend21222d2012-09-11 00:15:29 +03004652 unsigned char const *tempdi;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304653 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004654
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004655 /* si+Ext_ResInfo */
4656 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004657
Aaro Koskinen8104e322011-03-13 12:26:22 +02004658 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004659 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004660 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4661 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304662 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004663 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4664 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304665 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304667 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4668 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004669
Peter Huewe599801f2012-02-09 21:11:45 +01004670 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004671 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4672 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4673 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304674 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004675
Peter Huewe599801f2012-02-09 21:11:45 +01004676 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4677 & SetCRT2ToYPbPr525750)) {
4678 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304679 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004680
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004681 tempdi = XGI330_HiTVGroup3Data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304682 if (pVBInfo->SetFlag & TVSimuMode) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004683 tempdi = XGI330_HiTVGroup3Simu;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304684 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004685 tempdi = XGI330_HiTVGroup3Text;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304686 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004687
Peter Huewe599801f2012-02-09 21:11:45 +01004688 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004689 tempdi = XGI330_Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004690
Peter Huewe599801f2012-02-09 21:11:45 +01004691 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004692 tempdi = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304694 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004695 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004696
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304697 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004698 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004699 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304700 }
4701 }
4702 return;
4703} /* {end of XGI_SetGroup3} */
4704
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004705static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304706 unsigned short RefreshRateTableIndex,
4707 struct xgi_hw_device_info *HwDeviceExtension,
4708 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004709{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004711
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304712 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004713
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004714 /* si+Ext_ResInfo */
4715 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004717 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004718
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304719 tempbx = pVBInfo->RVBHCMAX;
4720 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004721 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304722 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4723 tempcx = pVBInfo->VGAHT - 1;
4724 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004725 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004726
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304727 temp = ((tempcx & 0xFF00) >> 8) << 3;
4728 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004729
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304730 tempcx = pVBInfo->VGAVT - 1;
4731 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4732 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004733
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304734 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004735 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304736 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004737 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004738 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304739 tempcx = pVBInfo->VBInfo;
4740 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004741
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304742 if (modeflag & HalfDCLK)
4743 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304745 if (XGI_IsLCDDualLink(pVBInfo))
4746 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004747
Peter Huewe599801f2012-02-09 21:11:45 +01004748 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304749 temp = 0;
4750 if (tempbx <= 1024)
4751 temp = 0xA0;
4752 if (tempbx == 1280)
4753 temp = 0xC0;
4754 } else if (tempcx & SetCRT2ToTV) {
4755 temp = 0xA0;
4756 if (tempbx <= 800)
4757 temp = 0x80;
4758 } else {
4759 temp = 0x80;
4760 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4761 temp = 0;
4762 if (tempbx > 800)
4763 temp = 0x60;
4764 }
4765 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004766
Peter Huewe599801f2012-02-09 21:11:45 +01004767 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304768 temp = 0x00;
4769 if (pVBInfo->VGAHDE == 1280)
4770 temp = 0x40;
4771 if (pVBInfo->VGAHDE == 1024)
4772 temp = 0x20;
4773 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004774 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004777
Peter Huewe599801f2012-02-09 21:11:45 +01004778 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304779 if (!(temp & 0xE000))
4780 tempbx = tempbx >> 1;
4781 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304783 tempcx = pVBInfo->RVBHRS;
4784 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004785 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304787 tempeax = pVBInfo->VGAVDE;
4788 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304790 if (tempeax <= tempebx) {
4791 tempcx = (tempcx & (~0x4000));
4792 tempeax = pVBInfo->VGAVDE;
4793 } else {
4794 tempeax -= tempebx;
4795 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 templong = (tempeax * 256 * 1024) % tempebx;
4798 tempeax = (tempeax * 256 * 1024) / tempebx;
4799 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304801 if (templong != 0)
4802 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304804 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004805 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304807 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004808 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304809 tempbx = (unsigned short) (tempebx >> 16);
4810 temp = tempbx & 0x00FF;
4811 temp = temp << 4;
4812 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004813 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004814
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304815 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004816 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4817 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304818 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004819 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 tempax = pVBInfo->VGAHDE;
4821 if (modeflag & HalfDCLK)
4822 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 if (XGI_IsLCDDualLink(pVBInfo))
4825 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004826
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4828 if (tempax > 800)
4829 tempax -= 800;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004830 } else if (pVBInfo->VGAHDE > 800) {
4831 if (pVBInfo->VGAHDE == 1024)
4832 tempax = (tempax * 25 / 32) - 1;
4833 else
4834 tempax = (tempax * 20 / 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304835 }
4836 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304838 temp = (tempax & 0xFF00) >> 8;
4839 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004840 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004842 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004843
Peter Huewe599801f2012-02-09 21:11:45 +01004844 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304845 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004846 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004847
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304848 }
4849 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4852 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004853 | TVSetYPbPr525p | TVSetYPbPr750p
4854 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304855 temp |= 0x0001;
4856 if ((pVBInfo->VBInfo & SetInSlaveMode)
4857 && (!(pVBInfo->TVInfo
4858 & TVSimuMode)))
4859 temp &= (~0x0001);
4860 }
4861 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004862
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004863 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304864 tempbx = pVBInfo->HT;
4865 if (XGI_IsLCDDualLink(pVBInfo))
4866 tempbx = tempbx >> 1;
4867 tempbx = (tempbx >> 1) - 2;
4868 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004869 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304870 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004871 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304872 }
4873 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004874
Aaro Koskinen8951dad2012-09-11 00:15:30 +03004875 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004876}
4877
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004878static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4879{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004880 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004881}
4882
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004883static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304884 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004885{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304886 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004887
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304888 Pindex = pVBInfo->Part5Port;
4889 Pdata = pVBInfo->Part5Port + 1;
4890 if (pVBInfo->ModeType == ModeVGA) {
4891 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01004892 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304893 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304894 }
4895 }
4896 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004897}
4898
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004899static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304900 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004901{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004902 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004903}
4904
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004905static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304906 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004907{
4908
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004909 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004910}
4911
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004912static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
4913 unsigned short ModeNo, unsigned short ModeIdIndex,
4914 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004915{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004916 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004917
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004918 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004919 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4920 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4921 /* si+St_ModeFlag */
4922 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304924 if (!(modeflag & Charx8Dot)) {
4925 xres /= 9;
4926 xres *= 8;
4927 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004928
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004929 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4930 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004931
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004932 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4933 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004934
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004935 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304936 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04004937
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004938 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304939 return 0;
4940
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004941 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4942 yres != xgifb_info->lvds_data.LVDSVDE) {
4943 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4944 if (colordepth > 2)
4945 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304946 }
4947 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004948}
4949
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004950static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4951 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004952 unsigned short ModeNo,
4953 unsigned short ModeIdIndex,
4954 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004955{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304956 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004957 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4959 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4960 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004961
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004962 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004963 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304964 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004965 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004966
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004967 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004968
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004969 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004970 /* SR35[7] FP VSync polarity */
4971 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4972 /* SR30[5] FP HSync polarity */
4973 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004974
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004975 if (chip_id == XG27)
4976 XGI_SetXG27FPBits(pVBInfo);
4977 else
4978 XGI_SetXG21FPBits(pVBInfo);
4979
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004980 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004981 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4982 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4983 /* si+St_ModeFlag */
4984 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304986 if (!(modeflag & Charx8Dot))
4987 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004988
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004989 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004990
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004991 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304993 if (LVDSHBS > LVDSHT)
4994 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004995
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004996 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304997 if (LVDSHRS > LVDSHT)
4998 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004999
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005000 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305001 if (LVDSHRE > LVDSHT)
5002 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005003
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005004 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005005
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005006 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005007
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005008 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005009 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305010 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305012 if (LVDSVBS > LVDSVT)
5013 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005014
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005015 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 if (LVDSVRS > LVDSVT)
5017 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005018
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005019 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305020 if (LVDSVRE > LVDSVT)
5021 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005022
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005023 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005024
Aaro Koskinen58839b02011-03-13 12:26:23 +02005025 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005026 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005027
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305028 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005029 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305031 /* HT SR0B[1:0] CR00 */
5032 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005033 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005034 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305036 /* HBS SR0B[5:4] CR02 */
5037 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005038 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005039 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305041 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5042 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005043 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5044 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5045 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305047 /* HRS SR0B[7:6] CR04 */
5048 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005049 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005050 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005051
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305052 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5053 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005054 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005055 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005056
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305057 /* HRE SR0C[2] CR05[4:0] */
5058 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005059 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5060 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005061
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305062 /* Panel HRE SR2F[7:2] */
5063 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005064 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005065
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305066 /* VT SR0A[0] CR07[5][0] CR06 */
5067 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005068 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5069 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5070 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005071 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005072
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305073 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5074 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005075 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5076 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5077 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005078 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305080 /* VBE SR0A[4] CR16 */
5081 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005082 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005083 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305085 /* VRS SR0A[3] CR7[7][2] CR10 */
5086 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005087 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5088 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5089 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005090 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005091
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005092 if (chip_id == XG27) {
5093 /* Panel VRS SR35[2:0] SR34[7:0] */
5094 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5095 (value & 0x700) >> 8);
5096 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5097 } else {
5098 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5099 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5100 (value & 0x600) >> 9);
5101 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5102 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5103 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005104
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305105 /* VRE SR0A[5] CR11[3:0] */
5106 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005107 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5108 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305110 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005111 if (chip_id == XG27)
5112 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5113 (value << 2) & 0xFC);
5114 else
5115 /* SR3F[7] has to be 0, h/w bug */
5116 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5117 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305119 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005120
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005121 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005122 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005123 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005124 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005125 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305126 value += 0x10;
5127 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005130 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005131 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005132 /* set data, panning = 0, shift left 1 dot*/
5133 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005134
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005135 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005136 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305137
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005138 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305139 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005140
5141}
5142
5143/* --------------------------------------------------------------------- */
5144/* Function : XGI_IsLCDON */
5145/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005146/* Output : 0 : Skip PSC Control */
5147/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005148/* Description : */
5149/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005150static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005151{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305152 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005153
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305154 tempax = pVBInfo->VBInfo;
5155 if (tempax & SetCRT2ToDualEdge)
5156 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005157 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305158 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005159
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305160 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005161}
5162
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005163/* --------------------------------------------------------------------- */
5164/* Function : XGI_DisableChISLCD */
5165/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005166/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005167/* Description : */
5168/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005169static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005170{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305171 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005172
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305173 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005174 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005175
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305176 if (tempbx & (EnableChA | DisableChA)) {
5177 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5178 return 0;
5179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005180
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305181 if (!(tempbx & (EnableChB | DisableChB)))
5182 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005183
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305184 if (tempah & 0x01) /* Chk LCDB Mode */
5185 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005186
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305187 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005188}
5189
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005190/* --------------------------------------------------------------------- */
5191/* Function : XGI_EnableChISLCD */
5192/* Input : */
5193/* Output : 0 -> Not LCD mode */
5194/* Description : */
5195/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005196static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005197{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305198 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005199
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305200 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005201 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005202
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305203 if (tempbx & (EnableChA | DisableChA)) {
5204 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5205 return 0;
5206 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305208 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005209 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305211 if (tempah & 0x01) /* Chk LCDB Mode */
5212 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005213
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305214 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005215}
5216
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005217static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5218 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305219 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005220{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005221 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005222
Peter Huewe6896b942012-02-09 21:11:46 +01005223 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5224 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305225 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005226 if (!(pVBInfo->VBInfo &
5227 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005228 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305229 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5230 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005231 if (!(pVBInfo->VBInfo &
5232 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005233 /* Disable Channel B */
5234 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305236 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005237 /* force to disable Cahnnel */
5238 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305240 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005241 /* Force to disable Channel B */
5242 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305243 }
5244 }
5245 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005246
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005247 /* disable part4_1f */
5248 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005249
Peter Huewe6896b942012-02-09 21:11:46 +01005250 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005251 if (((pVBInfo->VBInfo &
5252 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5253 || (XGI_DisableChISLCD(pVBInfo))
5254 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005255 /* LVDS Driver power down */
5256 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305257 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005258
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305259 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005260 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305261 | SetSimuScanMode))) {
5262 if (pVBInfo->SetFlag & GatingCRT)
5263 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005264 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305265 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005266
Peter Huewea3d675c2012-02-09 21:11:47 +01005267 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305268 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005269 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005270 /* Power down */
5271 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305272 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005273
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005274 /* disable TV as primary VGA swap */
5275 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305277 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005278 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005279
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005280 if ((pVBInfo->SetFlag & DisableChB) ||
5281 (pVBInfo->VBInfo &
5282 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005283 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005284 (pVBInfo->VBInfo &
5285 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005286 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005287
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005288 if ((pVBInfo->SetFlag & DisableChB) ||
5289 (pVBInfo->VBInfo &
5290 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005291 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005292 (pVBInfo->VBInfo &
5293 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5294 /* save Part1 index 0 */
5295 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5296 /* BTDAC = 1, avoid VB reset */
5297 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5298 /* disable CRT2 */
5299 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5300 /* restore Part1 index 0 */
5301 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305302 }
5303 } else { /* {301} */
5304 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005305 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5306 /* Disable CRT2 */
5307 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5308 /* Disable TV asPrimary VGA swap */
5309 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305310 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005311
Peter Huewea3d675c2012-02-09 21:11:47 +01005312 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305313 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005314 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005316}
5317
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005318/* --------------------------------------------------------------------- */
5319/* Function : XGI_GetTVPtrIndex */
5320/* Input : */
5321/* Output : */
5322/* Description : bx 0 : ExtNTSC */
5323/* 1 : StNTSC */
5324/* 2 : ExtPAL */
5325/* 3 : StPAL */
5326/* 4 : ExtHiTV */
5327/* 5 : StHiTV */
5328/* 6 : Ext525i */
5329/* 7 : St525i */
5330/* 8 : Ext525p */
5331/* 9 : St525p */
5332/* A : Ext750p */
5333/* B : St750p */
5334/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005335static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005336{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305337 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005338
Peter Huewe599801f2012-02-09 21:11:45 +01005339 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305340 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005341 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305342 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005343 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305344 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005345 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305346 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005347 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305348 tempbx = 10;
5349 if (pVBInfo->TVInfo & TVSimuMode)
5350 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305352 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005353}
5354
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005355/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005356/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005357/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005358/* Output : bx 0 : NTSC */
5359/* 1 : PAL */
5360/* 2 : PALM */
5361/* 3 : PALN */
5362/* 4 : NTSC1024x768 */
5363/* 5 : PAL-M 1024x768 */
5364/* 6-7: reserved */
5365/* cl 0 : YFilter1 */
5366/* 1 : YFilter2 */
5367/* ch 0 : 301A */
5368/* 1 : 301B/302B/301LV/302LV */
5369/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005370/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005371static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5372 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005373{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005374 *tempbx = 0;
5375 *tempcl = 0;
5376 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005377
Peter Huewe599801f2012-02-09 21:11:45 +01005378 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005379 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005380
Peter Huewe599801f2012-02-09 21:11:45 +01005381 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005382 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005383
Peter Huewe599801f2012-02-09 21:11:45 +01005384 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005385 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005386
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005387 if (pVBInfo->TVInfo & NTSC1024x768) {
5388 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005389 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005390 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305391 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005392
Peter Huewe6896b942012-02-09 21:11:46 +01005393 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5394 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005395 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5396 & TVSimuMode)) {
5397 *tempbx += 8;
5398 *tempcl += 1;
5399 }
5400 }
5401
Peter Huewe6896b942012-02-09 21:11:46 +01005402 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5403 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005404 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005405}
5406
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005407static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005408{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305409 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005410
Peter Huewe6896b942012-02-09 21:11:46 +01005411 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5412 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005413 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305414 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305415 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005416 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305418 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5419 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005420 if (pVBInfo->VBInfo &
5421 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005422 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005423
Peter Huewea3d675c2012-02-09 21:11:47 +01005424 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305425 tempbl = tempbh;
5426 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005427
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305428 tempbl &= 0x0F;
5429 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005430 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305432 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5433 | SetCRT2ToTV)) { /* Channel B */
5434 tempah &= 0xF0;
5435 tempah |= tempbl;
5436 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005437
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005438 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5439 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305440 tempah &= 0x0F;
5441 tempah |= tempbh;
5442 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005443 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305444 }
5445 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5446 tempbl = 0;
5447 tempbh = 0;
5448 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005449 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305450 tempah &= 0x0f;
5451 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005452 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305453 tempah);
5454 }
5455 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005456}
5457
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005458static void XGI_SetLCDCap_A(unsigned short tempcx,
5459 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005460{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005462
Aaro Koskinen58839b02011-03-13 12:26:23 +02005463 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005464
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305465 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005466 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005467 /* Enable Dither */
5468 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005469 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305470 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005471 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305472 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005473 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305474 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005475}
5476
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005477/* --------------------------------------------------------------------- */
5478/* Function : XGI_SetLCDCap_B */
5479/* Input : cx -> LCD Capability */
5480/* Output : */
5481/* Description : */
5482/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005483static void XGI_SetLCDCap_B(unsigned short tempcx,
5484 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005485{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305486 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005487 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305488 (unsigned short) (((tempcx & 0x00ff) >> 6)
5489 | 0x0c));
5490 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005491 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305492 (unsigned short) (((tempcx & 0x00ff) >> 6)
5493 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005494}
5495
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005496static void XGI_LongWait(struct vb_device_info *pVBInfo)
5497{
5498 unsigned short i;
5499
5500 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5501
5502 if (!(i & 0xC0)) {
5503 for (i = 0; i < 0xFFFF; i++) {
5504 if (!(inb(pVBInfo->P3da) & 0x08))
5505 break;
5506 }
5507
5508 for (i = 0; i < 0xFFFF; i++) {
5509 if ((inb(pVBInfo->P3da) & 0x08))
5510 break;
5511 }
5512 }
5513}
5514
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005515static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005516{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305517 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005518
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305519 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005520
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005521 /* disable down spectrum D[4] */
5522 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305523 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005524 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305525 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005526
Aaro Koskinen8104e322011-03-13 12:26:22 +02005527 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305528 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005529 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305530 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005531 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305532 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005533 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305534 pVBInfo->LCDCapList[index].Spectrum_34);
5535 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005536 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005537}
5538
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005539static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5540{
5541 unsigned short tempcx;
5542
5543 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5544
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005545 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005546 (VB_SIS301B |
5547 VB_SIS302B |
5548 VB_SIS301LV |
5549 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005550 VB_XGI301C)) { /* 301LV/302LV only */
5551 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005552 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005553 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005554 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005555 (unsigned char) (tempcx & 0x1F));
5556 }
5557 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005558 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005559 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5560 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5561 | EnablePLLSPLOW)) >> 8));
5562 }
5563
Peter Huewe6896b942012-02-09 21:11:46 +01005564 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5565 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005566 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5567 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005568 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005569 XGI_SetLCDCap_A(tempcx, pVBInfo);
5570
Peter Huewe6896b942012-02-09 21:11:46 +01005571 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005572 if (tempcx & EnableSpectrum)
5573 SetSpectrum(pVBInfo);
5574 }
5575 } else {
5576 /* LVDS,CH7017 */
5577 XGI_SetLCDCap_A(tempcx, pVBInfo);
5578 }
5579}
5580
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005581/* --------------------------------------------------------------------- */
5582/* Function : XGI_SetAntiFlicker */
5583/* Input : */
5584/* Output : */
5585/* Description : Set TV Customized Param. */
5586/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005587static void XGI_SetAntiFlicker(unsigned short ModeNo,
5588 unsigned short ModeIdIndex,
5589 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005590{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005591 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005592
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305593 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005594
Peter Huewe599801f2012-02-09 21:11:45 +01005595 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305596 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005597
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305598 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5599 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305600 tempah = TVAntiFlickList[tempbx];
5601 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005602
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005603 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005604}
5605
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005606static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5607 unsigned short ModeIdIndex,
5608 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005609{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005610 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005611
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305612 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005613
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305614 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5615 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305616 tempah = TVEdgeList[tempbx];
5617 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005618
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005619 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005620}
5621
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005622static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005623{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305624 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005625
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305626 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005627
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305628 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305630 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5631 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005632
Aaro Koskinen8104e322011-03-13 12:26:22 +02005633 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305634 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005635 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305636 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005637 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305638 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005639 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305640 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005641}
5642
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005643static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305644 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005645{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305646 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005647
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005649
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305650 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305652 switch (tempbx) {
5653 case 0x00:
5654 case 0x04:
5655 filterPtr = NTSCYFilter1;
5656 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005657
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305658 case 0x01:
5659 filterPtr = PALYFilter1;
5660 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005661
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305662 case 0x02:
5663 case 0x05:
5664 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305665 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005666 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305667 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305669 case 0x08:
5670 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305671 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305672 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305673 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005674 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305675 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005676
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305677 default:
5678 return;
5679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005680
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005681 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305682 if (tempcl == 0)
5683 index = tempal * 4;
5684 else
5685 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305687 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005688 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5689 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5690 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5691 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305692 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005693 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5694 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5695 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5696 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305697 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005698
Peter Huewe6896b942012-02-09 21:11:46 +01005699 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5700 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005701 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5702 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5703 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305704 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005705}
5706
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005707/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005708/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005709/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005710/* Output : */
5711/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005712/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005713static void XGI_OEM310Setting(unsigned short ModeNo,
5714 unsigned short ModeIdIndex,
5715 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005716{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005717 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005718
Peter Huewea3d675c2012-02-09 21:11:47 +01005719 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005720 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005721
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005722 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005723 XGI_SetPhaseIncr(pVBInfo);
5724 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5725 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005726
Peter Huewe6896b942012-02-09 21:11:46 +01005727 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005728 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305729 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005730}
5731
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005732/* --------------------------------------------------------------------- */
5733/* Function : XGI_SetCRT2ModeRegs */
5734/* Input : */
5735/* Output : */
5736/* Description : Origin code for crt2group */
5737/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005738static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 struct xgi_hw_device_info *HwDeviceExtension,
5740 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005741{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305742 unsigned short tempbl;
5743 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305745 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005746
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305747 tempah = 0;
5748 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005749 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305750 tempah &= ~0x10; /* BTRAMDAC */
5751 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305753 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5754 | SetCRT2ToLCD)) {
5755 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005756 tempcl = pVBInfo->ModeType;
5757 tempcl -= ModeVGA;
5758 if (tempcl >= 0) {
5759 /* BT Color */
5760 tempah = (0x008 >> tempcl);
5761 if (tempah == 0)
5762 tempah = 1;
5763 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305764 }
5765 if (pVBInfo->VBInfo & SetInSlaveMode)
5766 tempah ^= 0x50; /* BTDAC */
5767 }
5768 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005769
Aaro Koskinen8104e322011-03-13 12:26:22 +02005770 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305771 tempah = 0x08;
5772 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005773
Miguel Gómeze123e462012-07-06 12:40:52 +02005774 if (pVBInfo->VBInfo & DisableCRT2Display)
5775 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005776
Miguel Gómeze123e462012-07-06 12:40:52 +02005777 tempah = 0x00;
5778 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005779
Miguel Gómeze123e462012-07-06 12:40:52 +02005780 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5781 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5782 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005783
Miguel Gómeze123e462012-07-06 12:40:52 +02005784 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5785 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5786 tempbl &= 0xf7;
5787 tempah |= 0x01;
5788 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305789 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005790
Miguel Gómeze123e462012-07-06 12:40:52 +02005791 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5792 tempbl &= 0xf7;
5793 tempah |= 0x01;
5794 }
5795
5796 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5797 goto reg_and_or;
5798
5799 tempbl &= 0xf8;
5800 tempah = 0x01;
5801
5802 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5803 tempah |= 0x02;
5804
5805 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5806 tempah = tempah ^ 0x05;
5807 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5808 tempah = tempah ^ 0x01;
5809 }
5810
5811 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5812 tempah |= 0x08;
5813
5814reg_and_or:
5815 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305817 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005818 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305819 tempah &= (~0x08);
5820 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5821 & SetInSlaveMode))) {
5822 tempah |= 0x010;
5823 }
5824 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305826 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305827 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005828 if (pVBInfo->VBInfo & DriverMode)
5829 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305830 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005831
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005832 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305833 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005834
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305835 if (pVBInfo->LCDInfo & SetLCDDualLink)
5836 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005837
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305838 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305839 if (pVBInfo->TVInfo & RPLLDIV2XO)
5840 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305841 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005842
Peter Huewe255aabd2012-02-09 21:11:44 +01005843 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5844 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305845 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005846
Peter Huewe255aabd2012-02-09 21:11:44 +01005847 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005849
Aaro Koskinen8104e322011-03-13 12:26:22 +02005850 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305851 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005852
Peter Huewe6896b942012-02-09 21:11:46 +01005853 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5854 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305855 tempah = 0;
5856 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305858 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5859 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005860 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305861 tempah |= 0x04; /* shampoo 0129 */
5862 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005863
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005864 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305865 tempah = 0x00;
5866 tempbl = 0xcf;
5867 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5868 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5869 tempah |= 0x30;
5870 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005871
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005872 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305873 tempah = 0;
5874 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305876 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5877 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5878 tempah |= 0xc0;
5879 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005880 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305881 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305883 tempah = 0;
5884 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005885 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305886 tempbl = 0xff;
5887 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5888 tempah |= 0x80;
5889 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005890
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005891 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005892
Peter Huewe6896b942012-02-09 21:11:46 +01005893 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305894 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005895 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5896 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305897 }
5898 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005899}
5900
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305902void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5903 struct vb_device_info *pVBInfo)
5904{
5905
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005906 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005907
5908}
5909
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305910void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5911 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005912{
5913
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005914 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005915
5916}
5917
Bill Pemberton80adad82010-06-17 13:10:51 -04005918unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005919{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305920 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005921
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305922 if (pVBInfo->IF_DEF_LVDS == 1) {
5923 return 1;
5924 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005925 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305926 if ((flag == 1) || (flag == 2))
5927 return 1; /* 301b */
5928 else
5929 return 0;
5930 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005931}
5932
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005933unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5934 unsigned short ModeNo, unsigned short ModeIdIndex,
5935 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005936{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005937 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
5938 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
5939 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005940
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005941 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005942
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005943 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005944
Aaro Koskinen58839b02011-03-13 12:26:23 +02005945 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005946 index = index >> pVBInfo->SelectCRT2Rate;
5947 index &= 0x0F;
5948
5949 if (pVBInfo->LCDInfo & LCDNonExpanding)
5950 index = 0;
5951
5952 if (index > 0)
5953 index--;
5954
5955 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005956 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005957 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01005958 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5959 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005960 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005961 /* 301b */
5962 temp = LCDARefreshIndex[
5963 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005964 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005965 temp = LCDRefreshIndex[
5966 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005967
5968 if (index > temp)
5969 index = temp;
5970 } else {
5971 index = 0;
5972 }
5973 }
5974 }
5975
5976 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
5977 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
5978 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005979 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
5980 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005981 index++;
5982 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005983 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005984 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5985 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005986 index++;
5987 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005988 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5989 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005990 index++;
5991 }
5992 }
5993
5994 i = 0;
5995 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005996 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
5997 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005998 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005999 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
6000 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01006001 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006002 if (temp < pVBInfo->ModeType)
6003 break;
6004 i++;
6005 index--;
6006
6007 } while (index != 0xFFFF);
6008 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
6009 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006010 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
6011 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006012 if (temp & InterlaceMode)
6013 i++;
6014 }
6015 }
6016 i--;
6017 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
6018 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
6019 RefreshRateTableIndex, &i, pVBInfo);
6020 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02006021 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006022}
6023
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006024static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306025 struct xgi_hw_device_info *HwDeviceExtension,
6026 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006027{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006028 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006029
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006030 pVBInfo->SetFlag |= ProgrammingCRT2;
6031 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6032 ModeIdIndex, pVBInfo);
6033 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6034 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6035 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6036 HwDeviceExtension, pVBInfo);
6037 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6038 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006039}
6040
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006041static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006042 struct xgi_hw_device_info *HwDeviceExtension,
6043 struct vb_device_info *pVBInfo)
6044{
6045 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6046
6047 tempbx = pVBInfo->VBInfo;
6048 pVBInfo->SetFlag |= ProgrammingCRT2;
6049 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6050 pVBInfo->SelectCRT2Rate = 4;
6051 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6052 ModeIdIndex, pVBInfo);
6053 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6054 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6055 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6056 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6057 RefreshRateTableIndex, pVBInfo);
6058 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6059 RefreshRateTableIndex, pVBInfo);
6060 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6061 RefreshRateTableIndex, pVBInfo);
6062 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6063 HwDeviceExtension, pVBInfo);
6064 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6065 RefreshRateTableIndex, pVBInfo);
6066 XGI_SetTap4Regs(pVBInfo);
6067 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6068 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6069 HwDeviceExtension, pVBInfo);
6070 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6071 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6072 XGI_AutoThreshold(pVBInfo);
6073 return 1;
6074}
6075
6076void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6077{
6078 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6079 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6080 0x05, 0x00 };
6081
6082 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6083
6084 unsigned char CR17, CR63, SR31;
6085 unsigned short temp;
6086 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6087
6088 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006089 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006090
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006091 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006092 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006093 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006094 pVBInfo->P3d4, 0x53) | 0x02));
6095
Aaro Koskinen58839b02011-03-13 12:26:23 +02006096 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6097 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6098 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006099
Aaro Koskinen8104e322011-03-13 12:26:22 +02006100 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6101 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006102
Aaro Koskinen58839b02011-03-13 12:26:23 +02006103 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006104 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006105
Aaro Koskinen58839b02011-03-13 12:26:23 +02006106 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006107 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006108
Aaro Koskinen58839b02011-03-13 12:26:23 +02006109 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006110 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006111 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006112 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006113
Aaro Koskinen8104e322011-03-13 12:26:22 +02006114 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006115
6116 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006117 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006118
6119 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006120 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006121 CRTCData[i]);
6122
6123 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006124 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006125 CRTCData[i]);
6126
6127 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006128 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006129 CRTCData[i]);
6130
Aaro Koskinen8104e322011-03-13 12:26:22 +02006131 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006132 & 0xE0));
6133
Aaro Koskinen8104e322011-03-13 12:26:22 +02006134 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6135 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6136 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006137
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006138 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006139
6140 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006141 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6142 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6143 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006144 }
6145
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006146 mdelay(1);
6147
6148 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006149 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006150
6151 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006152 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006153 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006154 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006155
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006156 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006157 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006158
6159 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006160 outb(0, (pVBInfo->P3c8 + 1));
6161 outb(0, (pVBInfo->P3c8 + 1));
6162 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006163 }
6164
Aaro Koskinen8104e322011-03-13 12:26:22 +02006165 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6166 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6167 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006168
Aaro Koskinen58839b02011-03-13 12:26:23 +02006169 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006170 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006171 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006172}
6173
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006174static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6175 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006176 struct vb_device_info *pVBInfo)
6177{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006178 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006179
Peter Huewe6896b942012-02-09 21:11:46 +01006180 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6181 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006182 if (!(pVBInfo->SetFlag & DisableChA)) {
6183 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006184 /* Power on */
6185 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006186 } else if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6187 /* Power on */
6188 xgifb_reg_set(pVBInfo->Part1Port,
6189 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006190 }
6191 }
6192
6193 if (!(pVBInfo->SetFlag & DisableChB)) {
6194 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6195 & (SetCRT2ToLCD | SetCRT2ToTV
6196 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006197 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006198 pVBInfo->P3c4, 0x32);
6199 tempah &= 0xDF;
6200 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006201 if (!(pVBInfo->VBInfo &
6202 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006203 tempah |= 0x20;
6204 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006205 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006206 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006207
Aaro Koskinen58839b02011-03-13 12:26:23 +02006208 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006209 pVBInfo->Part1Port, 0x2E);
6210
6211 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006212 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006213 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006214 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006215 }
6216 }
6217
6218 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6219 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006220 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006221 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006222 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006223 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006224 if (XGI_EnableChISLCD(pVBInfo) ||
6225 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006226 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006227 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006228 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006229 pVBInfo->Part4Port,
6230 0x2A,
6231 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006232 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006233 /* LVDS Driver power on */
6234 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006235 }
6236 }
6237
6238 tempah = 0x00;
6239
6240 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6241 tempah = 0xc0;
6242
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006243 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6244 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6245 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6246 tempah = tempah & 0x40;
6247 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6248 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006249
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006250 if (pVBInfo->SetFlag & DisableChB)
6251 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006252
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006253 if (pVBInfo->SetFlag & DisableChA)
6254 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006255
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006256 if (pVBInfo->SetFlag & EnableChB)
6257 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006258
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006259 if (pVBInfo->SetFlag & EnableChA)
6260 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006261 }
6262 }
6263
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006264 /* EnablePart4_1F */
6265 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006266
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006267 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006268 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006269 XGI_DisableGatingCRT(HwDeviceExtension,
6270 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006271 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6272 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006273 }
6274 }
6275 } /* 301 */
6276 else { /* LVDS */
6277 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006278 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006279 /* enable CRT2 */
6280 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006281
Aaro Koskinen58839b02011-03-13 12:26:23 +02006282 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006283 0x2E);
6284 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006285 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006286
Aaro Koskinendc505562011-03-13 12:26:26 +02006287 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006288 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006289 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006290}
6291
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006292static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6293 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006294 unsigned short ModeNo, unsigned short ModeIdIndex,
6295 struct vb_device_info *pVBInfo)
6296{
Aaro Koskinena1579612012-04-07 01:14:05 +03006297 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006298
Aaro Koskinena1579612012-04-07 01:14:05 +03006299 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006300 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006301 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6302 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6303 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006304 XGI_ClearExt1Regs(pVBInfo);
6305
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006306 if (HwDeviceExtension->jChipType == XG27) {
6307 if (pVBInfo->IF_DEF_LVDS == 0)
6308 XGI_SetDefaultVCLK(pVBInfo);
6309 }
6310
6311 temp = ~ProgrammingCRT2;
6312 pVBInfo->SetFlag &= temp;
6313 pVBInfo->SelectCRT2Rate = 0;
6314
Peter Huewe6896b942012-02-09 21:11:46 +01006315 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6316 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006317 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006318 | SetInSlaveMode)) {
6319 pVBInfo->SetFlag |= ProgrammingCRT2;
6320 }
6321 }
6322
6323 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6324 ModeIdIndex, pVBInfo);
6325 if (RefreshRateTableIndex != 0xFFFF) {
6326 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6327 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6328 pVBInfo, HwDeviceExtension);
6329 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6330 RefreshRateTableIndex, pVBInfo);
6331 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6332 HwDeviceExtension, pVBInfo);
6333 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6334 RefreshRateTableIndex, pVBInfo);
6335 }
6336
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006337 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006338 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006339 if (temp & 0xA0) {
6340
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006341 if (HwDeviceExtension->jChipType == XG27)
6342 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6343 RefreshRateTableIndex, pVBInfo);
6344 else
6345 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6346 RefreshRateTableIndex, pVBInfo);
6347
6348 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6349 RefreshRateTableIndex);
6350
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006351 xgifb_set_lcd(HwDeviceExtension->jChipType,
6352 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006353
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006354 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006355 xgifb_set_lvds(xgifb_info,
6356 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006357 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006358 }
6359 }
6360
6361 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6362 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6363 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6364 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006365 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006366}
6367
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006368unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6369 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006370 unsigned short ModeNo)
6371{
6372 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006373 struct vb_device_info VBINF;
6374 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006375 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006376 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006377
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006378 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006379 pVBInfo->IF_DEF_YPbPr = 0;
6380 pVBInfo->IF_DEF_HiVision = 0;
6381 pVBInfo->IF_DEF_CRT2Monitor = 0;
6382 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006383 } else {
6384 pVBInfo->IF_DEF_YPbPr = 1;
6385 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006386 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006387 }
6388
6389 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6390 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6391 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6392 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6393 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6394 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6395 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6396 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6397 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6398 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6399 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6400 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6401 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006402 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6403 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6404 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6405 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6406 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006407
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006408 /* for x86 Linux, XG21 LVDS */
6409 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006410 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006411 pVBInfo->IF_DEF_LVDS = 1;
6412 }
6413 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006414 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6415 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006416 pVBInfo->IF_DEF_LVDS = 1;
6417 }
6418 }
6419
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006420 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006421 XGI_GetVBType(pVBInfo);
6422
6423 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006424 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006425 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006426 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006427
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006428 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006429 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6430
6431 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6432
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006433 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006434 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6435 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6436 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006437 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006438
Peter Huewea3d675c2012-02-09 21:11:47 +01006439 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006440 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006441 ModeIdIndex, pVBInfo);
6442
Peter Huewea3d675c2012-02-09 21:11:47 +01006443 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006444 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6445 HwDeviceExtension, pVBInfo);
6446 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006447 } else if (!(pVBInfo->VBInfo & SwitchCRT2)) {
6448 XGI_SetCRT1Group(xgifb_info,
6449 HwDeviceExtension, ModeNo,
6450 ModeIdIndex, pVBInfo);
6451 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6452 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6453 HwDeviceExtension,
6454 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006455 }
6456 }
6457
Peter Huewe6896b942012-02-09 21:11:46 +01006458 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006459 switch (HwDeviceExtension->ujVBChipID) {
6460 case VB_CHIP_301:
6461 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6462 pVBInfo); /*add for CRT2 */
6463 break;
6464
6465 case VB_CHIP_302:
6466 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6467 pVBInfo); /*add for CRT2 */
6468 break;
6469
6470 default:
6471 break;
6472 }
6473 }
6474
6475 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6476 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006477 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006478 } /* !XG20 */
6479 else {
6480 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006481 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006482 ModeIdIndex,
6483 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006484 return 0;
6485
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006486 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006487 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006488
6489 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006490 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006491
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006492 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006493
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006494 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6495 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006496
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006497 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006498 }
6499
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006500 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6501
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006502 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006503 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006504
6505 return 1;
6506}