blob: 50c8ea4f5ab79c547507c2d29833ff72b817b33d [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"
Aaro Koskinen56810a92013-01-21 02:57:47 +02005#include "vb_init.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006#include "vb_util.h"
7#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02008#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02009
10#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020011#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020012
Aaro Koskinen624554d2011-10-11 21:47:35 +030013static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040014 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
15 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
16 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
17 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
18 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
19 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
20 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
21 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
22 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
23 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020024
Bill Pemberton80adad82010-06-17 13:10:51 -040025void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020026{
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030027 pVBInfo->MCLKData = XGI340New_MCLKData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053029 pVBInfo->LCDResInfo = 0;
30 pVBInfo->LCDTypeInfo = 0;
31 pVBInfo->LCDInfo = 0;
32 pVBInfo->VBInfo = 0;
33 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020034
Aaro Koskinen597d96b2013-03-27 23:53:15 +020035 pVBInfo->SR18 = XGI340_SR18;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053036 pVBInfo->CR40 = XGI340_cr41;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020037
Aaro Koskinence76de52013-05-29 23:59:02 +030038 if (ChipType < XG20)
39 XGI_GetVBType(pVBInfo);
40
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053041 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010042 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053043 pVBInfo->LCDCapList = XGI_LCDDLCapList;
44 else
45 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020048 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020049
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053050 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040051 unsigned char temp;
Vitor Braga694683f2014-03-30 00:44:59 -030052
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030053 pVBInfo->MCLKData = XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053054 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020055 pVBInfo->XGINew_CR97 = 0xc1;
Aaro Koskinen597d96b2013-03-27 23:53:15 +020056 pVBInfo->SR18 = XG27_SR18;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020057
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040058 /*Z11m DDR*/
59 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
60 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
61 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020062 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053063 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020064}
65
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +030066static void XGI_SetSeqRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020067{
Peter Huewe76a58992013-02-03 22:54:34 +010068 unsigned char SRdata, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020069
Aaro Koskinen8104e322011-03-13 12:26:22 +020070 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020071
Peter Huewe76a58992013-02-03 22:54:34 +010072 for (i = 0; i < 4; i++) {
73 /* Get SR1,2,3,4 from file */
74 /* SR1 is with screen off 0x20 */
75 SRdata = XGI330_StandTable.SR[i];
76 xgifb_reg_set(pVBInfo->P3c4, i+1, SRdata); /* Set SR 1 2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053077 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020078}
79
Aaro Koskinenb053af12013-07-16 23:13:28 +030080static void XGI_SetCRTCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020081{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053082 unsigned char CRTCdata;
83 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020084
Peter Huewe9388ad92013-02-15 20:37:10 +010085 CRTCdata = xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053086 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +020087 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053089 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +080090 /* Get CRTC from file */
Aaro Koskinen3625c9a2012-11-04 21:14:51 +020091 CRTCdata = XGI330_StandTable.CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +020092 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053093 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094}
95
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +030096static void XGI_SetATTRegs(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +080097 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020098{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053099 unsigned char ARdata;
100 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
Aaro Koskinenb3979922012-11-04 21:14:52 +0200102 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530104 for (i = 0; i <= 0x13; i++) {
Aaro Koskinen3625c9a2012-11-04 21:14:51 +0200105 ARdata = XGI330_StandTable.ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200106
107 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
108 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
109 ARdata = 0;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300110 } else if ((pVBInfo->VBInfo &
Clifton Barnesc3f06922016-03-27 15:13:01 -0400111 (SetCRT2ToTV | SetCRT2ToLCD)) &&
112 (pVBInfo->VBInfo & SetInSlaveMode)) {
113 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530114 }
115 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200116
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200117 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200118 outb(i, pVBInfo->P3c0); /* set index */
119 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530120 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200121
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200122 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200123 outb(0x14, pVBInfo->P3c0); /* set index */
124 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200125 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200126 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200127}
128
Aaro Koskinena1579612012-04-07 01:14:05 +0300129static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200130{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530131 unsigned char GRdata;
132 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530134 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800135 /* Get GR from file */
Aaro Koskinen3625c9a2012-11-04 21:14:51 +0200136 GRdata = XGI330_StandTable.GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200137 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530140 if (pVBInfo->ModeType > ModeVGA) {
Peter Huewe9388ad92013-02-15 20:37:10 +0100141 GRdata = xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530142 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200143 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530144 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200145}
146
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200147static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200148{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530149 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530151 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200152 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200153}
154
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200155static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200156{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200157 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200158 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[0].SR2B);
159 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200160
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200161 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200162 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[1].SR2B);
163 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200164
Aaro Koskinendc505562011-03-13 12:26:26 +0200165 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530166 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200167}
168
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300169static unsigned char XGI_AjustCRT2Rate(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530170 unsigned short RefreshRateTableIndex, unsigned short *i,
171 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200172{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530173 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200174
Aaro Koskinenb3979922012-11-04 21:14:52 +0200175 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
176 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinena39325d2012-11-04 21:14:53 +0200177 tempbx = XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530178 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200179
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300180 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
181 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200182
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300183 if (pVBInfo->VBType & VB_XGI301C)
184 tempax |= SupportCRT2in301C;
185 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300187 /* 301b */
188 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300189 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200190
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300191 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
192 pVBInfo->LCDResInfo != Panel_1280x960 &&
193 (pVBInfo->LCDInfo & LCDNonExpanding) &&
194 resinfo >= 9)
195 return 0;
196 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200197
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300198 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
199 tempax |= SupportHiVision;
200 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
201 ((resinfo == 4) ||
202 (resinfo == 3 && (pVBInfo->SetFlag & TVSimuMode)) ||
203 (resinfo > 7)))
204 return 0;
205 } else if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO |
206 SetCRT2ToSCART | SetCRT2ToYPbPr525750 |
207 SetCRT2ToHiVision)) {
208 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200209
Aaro Koskinen0903b0d2013-05-29 23:59:03 +0300210 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV |
211 VB_SIS302LV | VB_XGI301C))
212 tempax |= SupportTV1024;
213
214 if (!(pVBInfo->VBInfo & TVSetPAL) &&
215 (modeflag & NoSupportSimuTV) &&
216 (pVBInfo->VBInfo & SetInSlaveMode) &&
217 (!(pVBInfo->VBInfo & SetNotSimuMode)))
218 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530219 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Aaro Koskinena39325d2012-11-04 21:14:53 +0200221 for (; XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800222 tempbx; (*i)--) {
Aaro Koskinena39325d2012-11-04 21:14:53 +0200223 infoflag = XGI330_RefIndex[RefreshRateTableIndex + (*i)].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800224 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530225 if (infoflag & tempax)
226 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530228 if ((*i) == 0)
229 break;
230 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530232 for ((*i) = 0;; (*i)++) {
Aaro Koskinena39325d2012-11-04 21:14:53 +0200233 infoflag = XGI330_RefIndex[RefreshRateTableIndex + (*i)].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800234 Ext_InfoFlag;
Aaro Koskinena39325d2012-11-04 21:14:53 +0200235 if (XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530236 != tempbx) {
237 return 0;
238 }
239
240 if (infoflag & tempax)
241 return 1;
242 }
243 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244}
245
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200246static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530247 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200248{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530249 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200250
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800251 /* di+0x00 */
Aaro Koskinena39325d2012-11-04 21:14:53 +0200252 sync = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530253 sync &= 0xC0;
254 temp = 0x2F;
255 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200256 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200257}
258
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200259static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530260 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200261{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530262 unsigned char data, data1, pushax;
263 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200264
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800265 /* unlock cr0-7 */
Peter Huewe9388ad92013-02-15 20:37:10 +0100266 data = xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530267 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200268 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200269
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200270 data = pVBInfo->TimingH.data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200271 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200272
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530273 for (i = 0x01; i <= 0x04; i++) {
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200274 data = pVBInfo->TimingH.data[i];
Bhumika Goyal89322a02016-02-09 19:57:40 +0530275 xgifb_reg_set(pVBInfo->P3d4, (unsigned short)(i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530276 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530278 for (i = 0x05; i <= 0x06; i++) {
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200279 data = pVBInfo->TimingH.data[i];
Bhumika Goyal89322a02016-02-09 19:57:40 +0530280 xgifb_reg_set(pVBInfo->P3c4, (unsigned short)(i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530281 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200282
Peter Huewe9388ad92013-02-15 20:37:10 +0100283 j = xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530284 j &= 0x1F;
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200285 data = pVBInfo->TimingH.data[7];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530286 data &= 0xE0;
287 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200288 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200289
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530290 if (HwDeviceExtension->jChipType >= XG20) {
Peter Huewe9388ad92013-02-15 20:37:10 +0100291 data = xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530292 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200293 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Peter Huewe9388ad92013-02-15 20:37:10 +0100294 data = xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530295 data1 = data;
296 data1 &= 0xE0;
297 data &= 0x1F;
298 if (data == 0) {
299 pushax = data;
Peter Huewe9388ad92013-02-15 20:37:10 +0100300 data = xgifb_reg_get(pVBInfo->P3c4, 0x0c);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530301 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200302 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530303 data = pushax;
304 }
305 data = data - 1;
306 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200307 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Peter Huewe9388ad92013-02-15 20:37:10 +0100308 data = xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Aya Mahfouz46283372015-02-26 11:27:44 +0200309 data >>= 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530310 data = data + 3;
311 if (data > 7)
312 data = data - 7;
Aya Mahfouz46283372015-02-26 11:27:44 +0200313 data <<= 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200314 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200316}
317
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800318static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800319 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200320{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 unsigned char data;
322 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530324 for (i = 0x00; i <= 0x01; i++) {
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200325 data = pVBInfo->TimingV.data[i];
Bhumika Goyal89322a02016-02-09 19:57:40 +0530326 xgifb_reg_set(pVBInfo->P3d4, (unsigned short)(i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530327 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530329 for (i = 0x02; i <= 0x03; i++) {
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200330 data = pVBInfo->TimingV.data[i];
Bhumika Goyal89322a02016-02-09 19:57:40 +0530331 xgifb_reg_set(pVBInfo->P3d4, (unsigned short)(i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530332 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 for (i = 0x04; i <= 0x05; i++) {
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200335 data = pVBInfo->TimingV.data[i];
Bhumika Goyal89322a02016-02-09 19:57:40 +0530336 xgifb_reg_set(pVBInfo->P3d4, (unsigned short)(i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200338
Peter Huewe9388ad92013-02-15 20:37:10 +0100339 j = xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530340 j &= 0xC0;
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200341 data = pVBInfo->TimingV.data[6];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 data &= 0x3F;
343 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200344 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200345
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200346 data = pVBInfo->TimingV.data[6];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530347 data &= 0x80;
Aya Mahfouz46283372015-02-26 11:27:44 +0200348 data >>= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200349
Aaro Koskinenb3979922012-11-04 21:14:52 +0200350 i = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530351 i &= DoubleScanMode;
352 if (i)
353 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200354
Peter Huewe9388ad92013-02-15 20:37:10 +0100355 j = xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 j &= 0x5F;
357 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200358 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200359}
360
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300361static void XGI_SetCRT1CRTC(unsigned short ModeIdIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200362 unsigned short RefreshRateTableIndex,
363 struct vb_device_info *pVBInfo,
364 struct xgi_hw_device_info *HwDeviceExtension)
365{
366 unsigned char index, data;
367 unsigned short i;
368
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800369 /* Get index */
Aaro Koskinena39325d2012-11-04 21:14:53 +0200370 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200371 index = index & IndexMask;
372
Peter Huewe9388ad92013-02-15 20:37:10 +0100373 data = xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200374 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200375 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200376
377 for (i = 0; i < 8; i++)
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200378 pVBInfo->TimingH.data[i]
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200379 = XGI_CRT1Table[index].CR[i];
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200380
381 for (i = 0; i < 7; i++)
Aaro Koskinen6154e7f2012-11-04 21:14:50 +0200382 pVBInfo->TimingV.data[i]
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200383 = XGI_CRT1Table[index].CR[i + 8];
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200384
385 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
386
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300387 XGI_SetCRT1Timing_V(ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200388
389 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200390 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200391}
392
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200393/* --------------------------------------------------------------------- */
394/* Function : XGI_SetXG21CRTC */
395/* Input : Stand or enhance CRTC table */
396/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
397/* Description : Set LCD timing */
398/* --------------------------------------------------------------------- */
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +0300399static void XGI_SetXG21CRTC(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200401{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300402 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530403 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200404
Aaro Koskinena39325d2012-11-04 21:14:53 +0200405 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300406 /* Tempax: CR4 HRS */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200407 Tempax = XGI_CRT1Table[index].CR[3];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300408 Tempcx = Tempax; /* Tempcx: HRS */
409 /* SR2E[7:0]->HRS */
410 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200412 Tempdx = XGI_CRT1Table[index].CR[5]; /* SRB */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300413 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
414 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
415 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
416 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800417
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200418 Tempax = XGI_CRT1Table[index].CR[4]; /* CR5 HRE */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300419 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200420
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200421 Tempbx = XGI_CRT1Table[index].CR[6]; /* SRC */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300422 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
423 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
424 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200425
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300426 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
427 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200428
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300429 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
430 if (Tempax < Tempcx) /* HRE < HRS */
431 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200432
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300433 Temp2 &= 0xFF;
Bhumika Goyal89322a02016-02-09 19:57:40 +0530434 Tempax = (unsigned char)Temp2; /* Tempax: HRE[7:0] */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300435 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
436 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
437 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
438 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
439 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
440 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200441
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300442 /* CR10 VRS */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200443 Tempax = XGI_CRT1Table[index].CR[10];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300444 Tempbx = Tempax; /* Tempbx: VRS */
445 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
446 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
447 /* CR7[2][7] VRE */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200448 Tempax = XGI_CRT1Table[index].CR[9];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300449 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
450 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
451 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
452 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
453 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200454
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300455 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
456 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
457 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
458 Tempax &= 0x80;
459 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
460 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
461 /* Tempax: SRA */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200462 Tempax = XGI_CRT1Table[index].CR[14];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300463 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
464 Temp2 = Tempax;
465 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
466 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200467
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300468 /* Tempax: CR11 VRE */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200469 Tempax = XGI_CRT1Table[index].CR[11];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300470 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
471 /* Tempbx: SRA */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200472 Tempbx = XGI_CRT1Table[index].CR[14];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300473 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
474 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
475 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
476 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
477 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200478
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300479 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
480 if (Tempax < Temp3) /* VRE < VRS */
481 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200482
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300483 Temp2 &= 0xFF;
Bhumika Goyal89322a02016-02-09 19:57:40 +0530484 Tempax = (unsigned char)Temp2; /* Tempax: VRE[7:0] */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300485 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
486 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
487 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
Bhumika Goyal89322a02016-02-09 19:57:40 +0530488 Tempbx = (unsigned char)Temp1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300489 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
490 Tempax &= 0x7F;
491 /* SR3F D[7:2]->VRE D[1:0]->VRS */
492 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200493}
494
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +0300495static void XGI_SetXG27CRTC(unsigned short RefreshRateTableIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800496 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200497{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300498 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200499
Aaro Koskinena39325d2012-11-04 21:14:53 +0200500 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300501 /* Tempax: CR4 HRS */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200502 Tempax = XGI_CRT1Table[index].CR[3];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300503 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
504 /* SR2E[7:0]->HRS */
505 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200506
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300507 /* SR0B */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200508 Tempax = XGI_CRT1Table[index].CR[5];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300509 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
510 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200511
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200512 Tempax = XGI_CRT1Table[index].CR[4]; /* CR5 HRE */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300513 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
514 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200515
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200516 Tempax = XGI_CRT1Table[index].CR[6]; /* SRC */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300517 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
518 Tempax <<= 3; /* Tempax[5]: HRE[5] */
519 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200520
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300521 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
522 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200523
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300524 /* Tempax: CR4 HRS */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200525 Tempax = XGI_CRT1Table[index].CR[3];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300526 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
527 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
528 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200529
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200530 Tempax = XGI_CRT1Table[index].CR[5]; /* SR0B */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300531 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
532 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
533 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
534 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
535 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
536 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200537
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300538 /* CR10 VRS */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200539 Tempax = XGI_CRT1Table[index].CR[10];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300540 /* SR34[7:0]->VRS[7:0] */
541 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200542
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300543 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
544 /* CR7[7][2] VRS[9][8] */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200545 Tempax = XGI_CRT1Table[index].CR[9];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300546 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
547 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
548 Tempax >>= 2; /* Tempax[0]: VRS[8] */
549 /* SR35[0]: VRS[8] */
550 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
551 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
552 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
553 /* Tempax: SR0A */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200554 Tempax = XGI_CRT1Table[index].CR[14];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300555 Tempax &= 0x08; /* SR0A[3] VRS[10] */
556 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200557
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300558 /* Tempax: CR11 VRE */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200559 Tempax = XGI_CRT1Table[index].CR[11];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300560 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
561 /* Tempbx: SR0A */
Aaro Koskinen7853bce2012-11-04 21:14:54 +0200562 Tempbx = XGI_CRT1Table[index].CR[14];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300563 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
564 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
565 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
566 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
567 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
568 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200569
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300570 if (Tempbx <= Tempcx) /* VRE <= VRS */
571 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200572
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300573 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
574 Tempax = (Tempbx << 2) & 0xFF;
575 /* SR3F[7:2]:VRE[5:0] */
576 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
577 Tempax = Tempcx >> 8;
578 /* SR35[2:0]:VRS[10:8] */
579 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200580}
581
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200582static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
583{
584 unsigned char temp;
585
586 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
587 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
588 temp = (temp & 3) << 6;
589 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
590 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
591 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
592 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200593}
594
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300595static void xgifb_set_lcd(int chip_id,
596 struct vb_device_info *pVBInfo,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300597 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200598{
Peter Huewee2e544c2013-02-03 04:08:46 +0100599 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200600
Aaro Koskinen8104e322011-03-13 12:26:22 +0200601 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
602 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
603 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
604 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300605
606 if (chip_id == XG27) {
Peter Huewee2e544c2013-02-03 04:08:46 +0100607 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
608 if ((temp & 0x03) == 0) { /* dual 12 */
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300609 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
610 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
611 }
612 }
613
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300614 if (chip_id == XG27) {
615 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530616 } else {
Peter Huewee2e544c2013-02-03 04:08:46 +0100617 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
618 if (temp & 0x01) {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300619 /* 18 bits FP */
620 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
621 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
622 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530623 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200624
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200625 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200626
Aaro Koskinendc505562011-03-13 12:26:26 +0200627 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
628 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200629
Peter Huewee2e544c2013-02-03 04:08:46 +0100630 temp = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
631 if (temp & 0x4000)
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300632 /* Hsync polarity */
633 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
Peter Huewee2e544c2013-02-03 04:08:46 +0100634 if (temp & 0x8000)
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300635 /* Vsync polarity */
636 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200637}
638
639/* --------------------------------------------------------------------- */
640/* Function : XGI_UpdateXG21CRTC */
641/* Input : */
642/* Output : CRT1 CRTC */
643/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
644/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800645static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
646 struct vb_device_info *pVBInfo,
647 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200648{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300649 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200650
Aaro Koskinendc505562011-03-13 12:26:26 +0200651 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300652 if (ModeNo == 0x2E &&
Aaro Koskinena39325d2012-11-04 21:14:53 +0200653 (XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300654 RES640x480x60))
655 index = 12;
Aaro Koskinena39325d2012-11-04 21:14:53 +0200656 else if (ModeNo == 0x2E && (XGI330_RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800657 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300658 index = 13;
659 else if (ModeNo == 0x2F)
660 index = 14;
661 else if (ModeNo == 0x50)
662 index = 15;
663 else if (ModeNo == 0x59)
664 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200665
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530666 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200667 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Aaro Koskinen7c5c07a2012-11-04 21:14:55 +0200668 XGI_UpdateCRT1Table[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200669 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Aaro Koskinen7c5c07a2012-11-04 21:14:55 +0200670 XGI_UpdateCRT1Table[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200671 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Aaro Koskinen7c5c07a2012-11-04 21:14:55 +0200672 XGI_UpdateCRT1Table[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200673 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Aaro Koskinen7c5c07a2012-11-04 21:14:55 +0200674 XGI_UpdateCRT1Table[index].CR16);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530675 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200676}
677
Aaro Koskinenb053af12013-07-16 23:13:28 +0300678static void XGI_SetCRT1DE(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530679 unsigned short RefreshRateTableIndex,
680 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200681{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400682 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530684 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200685
Aaro Koskinenb3979922012-11-04 21:14:52 +0200686 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200687
Aaro Koskinenb3979922012-11-04 21:14:52 +0200688 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinene8e6c752012-11-04 21:15:00 +0200689 tempax = XGI330_ModeResInfo[resindex].HTotal;
690 tempbx = XGI330_ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200691
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530692 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +0200693 tempax >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200694
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300695 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +0200696 tempax <<= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200697
Aaro Koskinena39325d2012-11-04 21:14:53 +0200698 temp = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200699
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300700 if (temp & InterlaceMode)
Aya Mahfouz46283372015-02-26 11:27:44 +0200701 tempbx >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200702
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300703 if (modeflag & DoubleScanMode)
Aya Mahfouz46283372015-02-26 11:27:44 +0200704 tempbx <<= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200705
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530706 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200707
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530708 tempax /= tempcx;
709 tempax -= 1;
710 tempbx -= 1;
711 tempcx = tempax;
Peter Huewe9388ad92013-02-15 20:37:10 +0100712 temp = xgifb_reg_get(pVBInfo->P3d4, 0x11);
713 data = xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530714 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200715 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Bhumika Goyal89322a02016-02-09 19:57:40 +0530716 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short)(tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200717 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Bhumika Goyal89322a02016-02-09 19:57:40 +0530718 (unsigned short)((tempcx & 0x0ff00) >> 10));
719 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short)(tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530720 tempax = 0;
Aya Mahfouz46283372015-02-26 11:27:44 +0200721 tempbx >>= 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530723 if (tempbx & 0x01)
724 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200725
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530726 if (tempbx & 0x02)
727 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200728
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200729 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Peter Huewe9388ad92013-02-15 20:37:10 +0100730 data = xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530731 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200732
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530733 if (tempbx & 0x04)
734 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200735
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200736 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200737 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200738}
739
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800740static void XGI_SetCRT1Offset(unsigned short ModeNo,
741 unsigned short ModeIdIndex,
742 unsigned short RefreshRateTableIndex,
743 struct xgi_hw_device_info *HwDeviceExtension,
744 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200745{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530746 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200747
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530748 /* GetOffset */
Aaro Koskinenb3979922012-11-04 21:14:52 +0200749 temp = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aya Mahfouz46283372015-02-26 11:27:44 +0200750 temp >>= 8;
Aaro Koskinen224114c2012-11-04 21:14:59 +0200751 temp = XGI330_ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200752
Aaro Koskinena39325d2012-11-04 21:14:53 +0200753 temp2 = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530754 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530756 if (temp2)
Aya Mahfouz46283372015-02-26 11:27:44 +0200757 temp <<= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200758
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530759 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200760
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530761 switch (temp2) {
762 case 0:
763 temp2 = 1;
764 break;
765 case 1:
766 temp2 = 2;
767 break;
768 case 2:
769 temp2 = 4;
770 break;
771 case 3:
772 temp2 = 4;
773 break;
774 case 4:
775 temp2 = 6;
776 break;
777 case 5:
778 temp2 = 8;
779 break;
780 default:
781 break;
782 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200783
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530784 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
785 temp = temp * temp2 + temp2 / 2;
786 else
787 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530789 /* SetOffset */
790 DisplayUnit = temp;
791 temp2 = temp;
Aya Mahfouz46283372015-02-26 11:27:44 +0200792 temp >>= 8; /* ah */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530793 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200794 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530795 i &= 0xF0;
796 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200797 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530799 temp = (unsigned char) temp2;
800 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200801 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200802
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530803 /* SetDisplayUnit */
Aaro Koskinena39325d2012-11-04 21:14:53 +0200804 temp2 = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530805 temp2 &= InterlaceMode;
806 if (temp2)
807 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200808
Aya Mahfouz46283372015-02-26 11:27:44 +0200809 DisplayUnit <<= 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530810 ah = (DisplayUnit & 0xff00) >> 8;
811 al = DisplayUnit & 0x00ff;
812 if (al == 0)
813 ah += 1;
814 else
815 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530817 if (HwDeviceExtension->jChipType >= XG20)
818 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
819 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200820
Aaro Koskinen8104e322011-03-13 12:26:22 +0200821 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822}
823
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300824static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeIdIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200825 unsigned short RefreshRateTableIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200826 struct vb_device_info *pVBInfo)
827{
Peter Hueweef9a6b92013-02-03 04:08:43 +0100828 unsigned short VCLKIndex, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200829
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300830 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +0200831 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200832
Aaro Koskinen7ac54d02013-02-09 00:03:43 +0200833 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
834 if (pVBInfo->LCDResInfo != Panel_1024x768)
835 /* LCDXlat2VCLK */
836 VCLKIndex = VCLK108_2_315 + 5;
837 else
838 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
839 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
840 if (pVBInfo->SetFlag & RPLLDIV2XO)
841 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
842 else
843 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200844
Aaro Koskinen7ac54d02013-02-09 00:03:43 +0200845 if (pVBInfo->SetFlag & TVSimuMode) {
Ebru Akagunduz4759e822013-10-29 22:50:54 +0200846 if (modeflag & Charx8Dot)
Aaro Koskinen7ac54d02013-02-09 00:03:43 +0200847 VCLKIndex = TVCLKBASE_315_25 + HiTVSimuVCLK;
Ebru Akagunduz4759e822013-10-29 22:50:54 +0200848 else
Aaro Koskinen7ac54d02013-02-09 00:03:43 +0200849 VCLKIndex = TVCLKBASE_315_25 + HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200850 }
Aaro Koskinen7ac54d02013-02-09 00:03:43 +0200851
852 /* 301lv */
853 if (pVBInfo->VBType & VB_SIS301LV) {
854 if (pVBInfo->SetFlag & RPLLDIV2XO)
855 VCLKIndex = YPbPr525iVCLK_2;
856 else
857 VCLKIndex = YPbPr525iVCLK;
858 }
859 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
860 if (pVBInfo->SetFlag & RPLLDIV2XO)
861 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
862 else
863 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
864 } else { /* for CRT2 */
865 /* di+Ext_CRTVCLK */
866 VCLKIndex = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
867 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200868 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200869
870 return VCLKIndex;
871}
872
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300873static void XGI_SetCRT1VCLK(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800874 struct xgi_hw_device_info *HwDeviceExtension,
875 unsigned short RefreshRateTableIndex,
876 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200877{
Bill Pemberton108afbf2010-06-17 13:10:47 -0400878 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530879 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200880
Aaro Koskinenb750f512013-05-29 23:59:05 +0300881 if ((pVBInfo->IF_DEF_LVDS == 0) &&
882 (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV |
883 VB_SIS302LV | VB_XGI301C)) &&
884 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300885 vclkindex = XGI_GetVCLK2Ptr(ModeIdIndex, RefreshRateTableIndex,
Aaro Koskinenb053af12013-07-16 23:13:28 +0300886 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200887 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200888 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200889 data = XGI_VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200890 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200891 data = XGI_VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200892 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
893 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530894 } else {
Aaro Koskinena39325d2012-11-04 21:14:53 +0200895 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200896 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200897 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200898 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[index].SR2B);
899 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200900 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530901 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200902
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530903 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinenb3979922012-11-04 21:14:52 +0200904 if (XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag &
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800905 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200906 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200907 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200908 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530909 index = data;
910 index &= 0xE0;
911 data &= 0x1F;
Aya Mahfouz46283372015-02-26 11:27:44 +0200912 data <<= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530913 data += 1;
914 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200915 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530916 }
917 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200918}
919
Aaro Koskinene85f2032011-11-27 23:03:07 +0200920static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
921{
922 unsigned char temp;
923
924 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
925 temp = (temp & 1) << 6;
926 /* SR06[6] 18bit Dither */
927 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
928 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
929 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
Aaro Koskinene85f2032011-11-27 23:03:07 +0200930}
931
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300932static void XGI_SetCRT1FIFO(struct xgi_hw_device_info *HwDeviceExtension,
933 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200934{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530935 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200936
Aaro Koskinen58839b02011-03-13 12:26:23 +0200937 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530938 data &= 0xfe;
Colin Cronin3786a0f2015-05-13 22:35:03 -0700939 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* disable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200940
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300941 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
942 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
943 data &= 0xC0;
944 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
945 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
946 data |= 0x01;
947 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200948
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530949 if (HwDeviceExtension->jChipType == XG21)
950 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200951}
952
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200953static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300954 unsigned short RefreshRateTableIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200955 struct vb_device_info *pVBInfo)
956{
957 unsigned short data, data2 = 0;
958 short VCLK;
959
960 unsigned char index;
961
Aaro Koskinena39325d2012-11-04 21:14:53 +0200962 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300963 index &= IndexMask;
Aaro Koskinenacfe0932012-11-04 21:14:58 +0200964 VCLK = XGI_VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200965
Aaro Koskinen58839b02011-03-13 12:26:23 +0200966 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200967 data &= 0xf3;
968 if (VCLK >= 200)
969 data |= 0x0c; /* VCLK > 200 */
970
971 if (HwDeviceExtension->jChipType >= XG20)
972 data &= ~0x04; /* 2 pixel mode */
973
Aaro Koskinen8104e322011-03-13 12:26:22 +0200974 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200975
976 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200977 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200978 data &= 0xE7;
979 if (VCLK < 200)
980 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200981 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200982 }
983
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200984 data2 = 0x00;
985
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200986 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200987 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200988 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200989}
990
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200991static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +0300992 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530993 unsigned short RefreshRateTableIndex,
994 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200995{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530996 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
997 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200998
Aaro Koskinenb3979922012-11-04 21:14:52 +0200999 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinena39325d2012-11-04 21:14:53 +02001000 infoflag = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001001
Aaro Koskinen58839b02011-03-13 12:26:23 +02001002 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001003 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001004
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001005 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301006 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001007 data2 |= 0x02;
1008 data3 = pVBInfo->ModeType - ModeVGA;
Aya Mahfouz46283372015-02-26 11:27:44 +02001009 data3 <<= 2;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001010 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301011 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001012
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301013 if (data)
1014 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001015
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001016 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinenb3979922012-11-04 21:14:52 +02001017 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinene8e6c752012-11-04 21:15:00 +02001018 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301020 data = 0x0000;
1021 if (infoflag & InterlaceMode) {
1022 if (xres == 1024)
1023 data = 0x0035;
1024 else if (xres == 1280)
1025 data = 0x0048;
1026 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001027
Peter Huewe5d1c2a92013-02-03 22:54:37 +01001028 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data);
1029 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001030
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301031 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001032 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001033
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301034 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001035
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301036 if (modeflag & LineCompareOff)
1037 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001038
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001039 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301040 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001041 data = data ^ 0x60;
1042 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001043 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001044
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001045 XGI_SetVCLKState(HwDeviceExtension, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001046
Aaro Koskinen58839b02011-03-13 12:26:23 +02001047 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001048
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301049 if (HwDeviceExtension->jChipType == XG27) {
1050 if (data & 0x40)
1051 data = 0x2c;
1052 else
1053 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001054 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001055 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301056 } else if (HwDeviceExtension->jChipType >= XG20) {
1057 if (data & 0x40)
1058 data = 0x33;
1059 else
1060 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001061 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1062 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301063 } else {
1064 if (data & 0x40)
1065 data = 0x2c;
1066 else
1067 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001068 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301069 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001070}
1071
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001072static void XGI_WriteDAC(unsigned short dl,
1073 unsigned short ah,
1074 unsigned short al,
1075 unsigned short dh,
1076 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001077{
Fabian Frederick64746c02015-05-18 19:34:15 +02001078 unsigned short bh, bl;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001079
1080 bh = ah;
1081 bl = al;
1082
1083 if (dl != 0) {
Fabian Frederick64746c02015-05-18 19:34:15 +02001084 swap(bh, dh);
1085 if (dl == 1)
1086 swap(bl, dh);
1087 else
1088 swap(bl, bh);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001089 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001090 outb((unsigned short) dh, pVBInfo->P3c9);
1091 outb((unsigned short) bh, pVBInfo->P3c9);
1092 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001093}
1094
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03001095static void XGI_LoadDAC(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001096{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001097 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1098 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001099
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001100 outb(0xFF, pVBInfo->P3c6);
1101 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001102
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001103 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301104 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301106 for (k = 0; k < 3; k++) {
1107 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301109 if (data & 0x01)
1110 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301112 if (data & 0x02)
1113 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001114
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001115 outb(data2, pVBInfo->P3c9);
Aya Mahfouz46283372015-02-26 11:27:44 +02001116 data >>= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301117 }
1118 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001119
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001120 for (i = 16; i < 32; i++) {
1121 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001122
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001123 for (k = 0; k < 3; k++)
1124 outb(data, pVBInfo->P3c9);
1125 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001126
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001127 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001129 for (m = 0; m < 9; m++) {
1130 di = si;
1131 bx = si + 0x04;
1132 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001133
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001134 for (n = 0; n < 3; n++) {
1135 for (o = 0; o < 5; o++) {
1136 dh = table[si];
1137 ah = table[di];
1138 al = table[bx];
1139 si++;
1140 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301141 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001142
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001143 si -= 2;
1144
1145 for (o = 0; o < 3; o++) {
1146 dh = table[bx];
1147 ah = table[di];
1148 al = table[si];
1149 si--;
1150 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1151 }
1152
1153 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301154 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001155
1156 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001158}
1159
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001160static void XGI_GetLVDSResInfo(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001161 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001162{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301163 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001164
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001165 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02001166 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001167
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001168 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02001169 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001170
Aaro Koskinene8e6c752012-11-04 21:15:00 +02001171 xres = XGI330_ModeResInfo[resindex].HTotal;
1172 yres = XGI330_ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001173
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001174 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02001175 xres <<= 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001176
1177 if (modeflag & DoubleScanMode)
Aya Mahfouz46283372015-02-26 11:27:44 +02001178 yres <<= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001179
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301180 if (xres == 720)
1181 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301183 pVBInfo->VGAHDE = xres;
1184 pVBInfo->HDE = xres;
1185 pVBInfo->VGAVDE = yres;
1186 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001187}
1188
Aaro Koskinenbdc9eb12012-11-04 21:14:47 +02001189static void const *XGI_GetLcdPtr(struct XGI330_LCDDataTablStruct const *table,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001190 unsigned short ModeIdIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001191 struct vb_device_info *pVBInfo)
1192{
Aaro Koskinen6c27b372012-11-04 21:14:45 +02001193 unsigned short i, tempdx, tempbx, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001194
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001195 tempbx = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001196
Aaro Koskinenb3979922012-11-04 21:14:52 +02001197 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001198
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001199 i = 0;
1200
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001201 while (table[i].PANELID != 0xff) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001202 tempdx = pVBInfo->LCDResInfo;
1203 if (tempbx & 0x0080) { /* OEMUtil */
1204 tempbx &= (~0x0080);
1205 tempdx = pVBInfo->LCDTypeInfo;
1206 }
1207
1208 if (pVBInfo->LCDInfo & EnableScalingLCD)
1209 tempdx &= (~PanelResInfo);
1210
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001211 if (table[i].PANELID == tempdx) {
1212 tempbx = table[i].MASK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001213 tempdx = pVBInfo->LCDInfo;
1214
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001215 if (modeflag & HalfDCLK)
1216 tempdx |= SetLCDLowResolution;
1217
1218 tempbx &= tempdx;
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001219 if (tempbx == table[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001220 break;
1221 }
1222 i++;
1223 }
1224
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001225 return table[i].DATAPTR;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001226}
1227
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001228static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeIdIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001229 unsigned short RefreshRateTableIndex,
1230 struct vb_device_info *pVBInfo)
1231{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001232 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001233
Aaro Koskinenb3979922012-11-04 21:14:52 +02001234 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinena39325d2012-11-04 21:14:53 +02001235 tempal = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001236 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001237 tempdx = pVBInfo->TVInfo;
1238
1239 if (pVBInfo->VBInfo & SetInSlaveMode)
1240 tempdx = tempdx | SetTVLockMode;
1241
1242 if (modeflag & HalfDCLK)
1243 tempdx = tempdx | SetTVLowResolution;
1244
1245 i = 0;
1246
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001247 while (XGI_TVDataTable[i].MASK != 0xffff) {
1248 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1249 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001250 break;
1251 i++;
1252 }
1253
Aaro Koskinen18ba8662012-09-11 00:15:22 +03001254 return &XGI_TVDataTable[i].DATAPTR[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001255}
1256
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001257static void XGI_GetLVDSData(unsigned short ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001258 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259{
Aaro Koskinen6008f872012-11-04 21:14:49 +02001260 struct SiS_LVDSData const *LCDPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001261
Aaro Koskinen6008f872012-11-04 21:14:49 +02001262 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
1263 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001264
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001265 LCDPtr = XGI_GetLcdPtr(XGI_EPLLCDDataPtr, ModeIdIndex, pVBInfo);
Aaro Koskinen6008f872012-11-04 21:14:49 +02001266 pVBInfo->VGAHT = LCDPtr->VGAHT;
1267 pVBInfo->VGAVT = LCDPtr->VGAVT;
1268 pVBInfo->HT = LCDPtr->LCDHT;
1269 pVBInfo->VT = LCDPtr->LCDVT;
1270
1271 if (pVBInfo->LCDInfo & (SetLCDtoNonExpanding | EnableScalingLCD))
1272 return;
1273
1274 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1275 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
1276 pVBInfo->HDE = 1024;
1277 pVBInfo->VDE = 768;
1278 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1279 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
1280 pVBInfo->HDE = 1280;
1281 pVBInfo->VDE = 1024;
1282 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
1283 pVBInfo->HDE = 1400;
1284 pVBInfo->VDE = 1050;
1285 } else {
1286 pVBInfo->HDE = 1600;
1287 pVBInfo->VDE = 1200;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301288 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001289}
1290
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001291static void XGI_ModCRT1Regs(unsigned short ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001292 struct xgi_hw_device_info *HwDeviceExtension,
1293 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001294{
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001295 unsigned short i;
Aaro Koskinenbdc9eb12012-11-04 21:14:47 +02001296 struct XGI_LVDSCRT1HDataStruct const *LCDPtr = NULL;
1297 struct XGI_LVDSCRT1VDataStruct const *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001298
Peter Huewea3d675c2012-02-09 21:11:47 +01001299 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001300 LCDPtr = XGI_GetLcdPtr(xgifb_epllcd_crt1_h, ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001301 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001302
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001303 for (i = 0; i < 8; i++)
Aaro Koskinen6154e7f2012-11-04 21:14:50 +02001304 pVBInfo->TimingH.data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301305 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001306
1307 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1308
Peter Huewea3d675c2012-02-09 21:11:47 +01001309 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001310 LCDPtr1 = XGI_GetLcdPtr(xgifb_epllcd_crt1_v, ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001311 pVBInfo);
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001312 for (i = 0; i < 7; i++)
Aaro Koskinen6154e7f2012-11-04 21:14:50 +02001313 pVBInfo->TimingV.data[i] = LCDPtr1[0].Reg[i];
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001314 }
1315
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001316 XGI_SetCRT1Timing_V(ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001317}
1318
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001319static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1320{
1321 unsigned char tempal, tempah, tempbl, i;
1322
Aaro Koskinen58839b02011-03-13 12:26:23 +02001323 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001324 tempal = tempah & 0x0F;
1325 tempah = tempah & 0xF0;
1326 i = 0;
1327 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1328
1329 while (tempbl != 0xFF) {
1330 if (tempbl & 0x80) { /* OEMUtil */
1331 tempal = tempah;
1332 tempbl = tempbl & ~(0x80);
1333 }
1334
1335 if (tempal == tempbl)
1336 break;
1337
1338 i++;
1339
1340 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1341 }
1342
1343 return i;
1344}
1345
1346static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1347{
1348 unsigned short tempah, tempal, tempbl, i;
1349
1350 tempal = pVBInfo->LCDResInfo;
1351 tempah = pVBInfo->LCDTypeInfo;
1352
1353 i = 0;
1354 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1355
1356 while (tempbl != 0xFF) {
1357 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1358 tempal = tempah;
1359 tempbl &= ~0x80;
1360 }
1361
1362 if (tempal == tempbl)
1363 break;
1364
1365 i++;
1366 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1367 }
1368
1369 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001370 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001371 pVBInfo->LCDTypeInfo = 0;
1372 i = 0;
1373 }
1374
1375 return i;
1376}
1377
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001378static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1379 unsigned short *VSyncWidth,
1380 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001381{
1382 unsigned short Index;
1383
1384 Index = XGI_GetLCDCapPtr(pVBInfo);
1385 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1386 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001387}
1388
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001389static void XGI_SetLVDSRegs(unsigned short ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001390 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001391{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301392 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1393 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinenbdc9eb12012-11-04 21:14:47 +02001394 struct XGI330_LCDDataDesStruct2 const *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001395
Aaro Koskinenb3979922012-11-04 21:14:52 +02001396 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03001397 LCDPtr1 = XGI_GetLcdPtr(XGI_EPLLCDDesDataPtr, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001398
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001399 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1400 push1 = tempbx;
1401 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001402
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001403 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01001404 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1405 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001406 tempax = 1024;
1407 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001408 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1409 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001410 tempax = 1280;
1411 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001412 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001413 tempax = 1400;
1414 tempbx = 1050;
1415 } else {
1416 tempax = 1600;
1417 tempbx = 1200;
1418 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001419
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001420 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1421 pVBInfo->HDE = tempax;
1422 pVBInfo->VDE = tempbx;
1423 pVBInfo->VGAHDE = tempax;
1424 pVBInfo->VGAVDE = tempbx;
1425 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001426
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001427 tempax = pVBInfo->HT;
1428
Peter Huewe826215d2013-02-05 00:29:46 +01001429 tempbx = LCDPtr1->LCDHDES;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001430
1431 tempcx = pVBInfo->HDE;
1432 tempbx = tempbx & 0x0fff;
1433 tempcx += tempbx;
1434
1435 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001436 tempcx -= tempax;
1437
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001438 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001439
Aya Mahfouz46283372015-02-26 11:27:44 +02001440 tempcx >>= 3;
1441 tempbx >>= 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001442
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001443 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1444 (unsigned short) (tempbx & 0xff));
1445 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1446 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001447
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001448 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001449
Peter Huewe826215d2013-02-05 00:29:46 +01001450 tempbx = LCDPtr1->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001451
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001452 tempcx = push2;
1453
1454 if (pVBInfo->LCDInfo & EnableScalingLCD)
1455 tempcx = LCDPtr1->LCDHSync;
1456
1457 tempcx += tempbx;
1458
1459 if (tempcx >= tempax)
1460 tempcx -= tempax;
1461
1462 tempax = tempbx & 0x07;
Aya Mahfouz46283372015-02-26 11:27:44 +02001463 tempax >>= 5;
1464 tempcx >>= 3;
1465 tempbx >>= 3;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001466
1467 tempcx &= 0x1f;
1468 tempax |= tempcx;
1469
1470 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
1471 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
1472 (unsigned short) (tempbx & 0xff));
1473
1474 tempax = pVBInfo->VT;
Peter Huewe826215d2013-02-05 00:29:46 +01001475 tempbx = LCDPtr1->LCDVDES;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001476 tempcx = pVBInfo->VDE;
1477
1478 tempbx = tempbx & 0x0fff;
1479 tempcx += tempbx;
1480 if (tempcx >= tempax)
1481 tempcx -= tempax;
1482
1483 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
1484 (unsigned short) (tempbx & 0xff));
1485 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
1486 (unsigned short) (tempcx & 0xff));
1487
1488 tempbx = (tempbx >> 8) & 0x07;
1489 tempcx = (tempcx >> 8) & 0x07;
1490
1491 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
1492 (unsigned short) ((tempcx << 3)
1493 | tempbx));
1494
1495 tempax = pVBInfo->VT;
Peter Huewe826215d2013-02-05 00:29:46 +01001496 tempbx = LCDPtr1->LCDVRS;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001497
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001498 tempcx = push1;
1499
1500 if (pVBInfo->LCDInfo & EnableScalingLCD)
1501 tempcx = LCDPtr1->LCDVSync;
1502
1503 tempcx += tempbx;
1504 if (tempcx >= tempax)
1505 tempcx -= tempax;
1506
1507 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
1508 (unsigned short) (tempbx & 0xff));
1509 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
1510 (unsigned short) (tempcx & 0x0f));
1511
1512 tempax = ((tempbx >> 8) & 0x07) << 3;
1513
1514 tempbx = pVBInfo->VGAVDE;
1515 if (tempbx != pVBInfo->VDE)
1516 tempax |= 0x40;
1517
Peter Huewea3d675c2012-02-09 21:11:47 +01001518 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001519 tempax |= 0x40;
1520
1521 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
1522 tempax);
1523
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001524 tempbx = pVBInfo->VDE;
1525 tempax = pVBInfo->VGAVDE;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001526
1527 temp = tempax; /* 0430 ylshieh */
1528 temp1 = (temp << 18) / tempbx;
1529
1530 tempdx = (unsigned short) ((temp << 18) % tempbx);
1531
1532 if (tempdx != 0)
1533 temp1 += 1;
1534
1535 temp2 = temp1;
1536 push3 = temp2;
1537
1538 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
1539 (unsigned short) (temp2 & 0xff));
1540 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
1541 (unsigned short) ((temp2 >> 8) & 0xff));
1542
1543 tempbx = (unsigned short) (temp2 >> 16);
1544 tempax = tempbx & 0x03;
1545
1546 tempbx = pVBInfo->VGAVDE;
1547 if (tempbx == pVBInfo->VDE)
1548 tempax |= 0x04;
1549
1550 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
1551
1552 if (pVBInfo->VBType & VB_XGI301C) {
1553 temp2 = push3;
1554 xgifb_reg_set(pVBInfo->Part4Port,
1555 0x3c,
1556 (unsigned short) (temp2 & 0xff));
1557 xgifb_reg_set(pVBInfo->Part4Port,
1558 0x3b,
1559 (unsigned short) ((temp2 >> 8) &
1560 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001561 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001562 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
1563 ~0xc0,
1564 (unsigned short) ((tempbx &
1565 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001566
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001567 tempcx = pVBInfo->VGAVDE;
1568 if (tempcx == pVBInfo->VDE)
1569 xgifb_reg_and_or(pVBInfo->Part4Port,
1570 0x30, ~0x0c, 0x00);
1571 else
1572 xgifb_reg_and_or(pVBInfo->Part4Port,
1573 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301574 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001575
1576 tempcx = pVBInfo->VGAHDE;
1577 tempbx = pVBInfo->HDE;
1578
1579 temp1 = tempcx << 16;
1580
1581 tempax = (unsigned short) (temp1 / tempbx);
1582
1583 if ((tempbx & 0xffff) == (tempcx & 0xffff))
1584 tempax = 65535;
1585
1586 temp3 = tempax;
1587 temp1 = pVBInfo->VGAHDE << 16;
1588
1589 temp1 /= temp3;
Aya Mahfouz46283372015-02-26 11:27:44 +02001590 temp3 <<= 16;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001591 temp1 -= 1;
1592
1593 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
1594
1595 tempax = (unsigned short) (temp3 & 0xff);
1596 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
1597
1598 temp1 = pVBInfo->VGAVDE << 18;
1599 temp1 = temp1 / push3;
1600 tempbx = (unsigned short) (temp1 & 0xffff);
1601
Peter Huewe255aabd2012-02-09 21:11:44 +01001602 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001603 tempbx -= 1;
1604
1605 tempax = ((tempbx >> 8) & 0xff) << 3;
1606 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
1607 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
1608 (unsigned short) (tempax & 0xff));
1609 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
1610 (unsigned short) (tempbx & 0xff));
1611
Aya Mahfouz46283372015-02-26 11:27:44 +02001612 temp3 >>= 16;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001613
1614 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02001615 temp3 >>= 1;
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001616
1617 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
1618 (unsigned short) ((temp3 >> 8) & 0xff));
1619 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
1620 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001621}
1622
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001623/* --------------------------------------------------------------------- */
1624/* Function : XGI_GETLCDVCLKPtr */
1625/* Input : */
1626/* Output : al -> VCLK Index */
1627/* Description : */
1628/* --------------------------------------------------------------------- */
1629static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
1630 struct vb_device_info *pVBInfo)
1631{
1632 unsigned short index;
1633
Peter Huewea3d675c2012-02-09 21:11:47 +01001634 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001635 index = XGI_GetLCDCapPtr1(pVBInfo);
1636
1637 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
1638 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
1639 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
1640 } else { /* LCDA */
1641 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
1642 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
1643 }
1644 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001645}
1646
1647static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001648 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001649{
1650
1651 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001652 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001653
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001654 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02001655 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001656
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001657 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
1658 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001659 index = XGI_GetLCDCapPtr(pVBInfo);
1660 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
1661
Peter Huewea3d675c2012-02-09 21:11:47 +01001662 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001663 return tempal;
1664
1665 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001666 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01001667 (VB_SIS301B |
1668 VB_SIS302B |
1669 VB_SIS301LV |
1670 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001671 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01001672 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001673 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001674 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001675 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001676 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001677 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001678 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001679 tempal = TVCLKBASE_315 +
1680 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001681
1682 }
1683 return tempal;
1684 }
1685
Peter Huewe599801f2012-02-09 21:11:45 +01001686 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01001687 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001688 return tempal;
1689 }
1690
Peter Huewe599801f2012-02-09 21:11:45 +01001691 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001692 tempal = YPbPr525pVCLK;
1693 return tempal;
1694 }
1695
1696 tempal = NTSC1024VCLK;
1697
1698 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001699 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001700 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001701 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001702 }
1703
1704 if (pVBInfo->VBInfo & SetCRT2ToTV)
1705 return tempal;
1706 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001707 } /* {End of VB} */
1708
Peter Huewe516354e2013-02-15 20:37:11 +01001709 inb((pVBInfo->P3ca + 0x02));
Aaro Koskinena39325d2012-11-04 21:14:53 +02001710 tempal = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001711 return tempal;
1712}
1713
1714static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
1715 unsigned char *di_1, struct vb_device_info *pVBInfo)
1716{
Peter Huewe6896b942012-02-09 21:11:46 +01001717 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
1718 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001719 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
1720 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinene8cb03d2012-09-11 00:15:31 +03001721 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001722 *di_1 = XGI_VBVCLKData[tempal].Part4_B;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001723 }
1724 } else {
1725 *di_0 = XGI_VCLKData[tempal].SR2B;
1726 *di_1 = XGI_VCLKData[tempal].SR2C;
1727 }
1728}
1729
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001730static void XGI_SetCRT2ECLK(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301731 unsigned short RefreshRateTableIndex,
1732 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001733{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301734 unsigned char di_0, di_1, tempal;
1735 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001736
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001737 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301738 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
1739 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301741 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001742 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301743 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01001744 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301745 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001746 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
1747 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301748 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001749 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
1750 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301751 }
1752 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001753}
1754
Aaro Koskinenb053af12013-07-16 23:13:28 +03001755static void XGI_UpdateModeInfo(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001756{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301757 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001758
Peter Huewe6896b942012-02-09 21:11:46 +01001759 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1760 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301761 tempcl = 0;
1762 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001763 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301765 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001766 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301767 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001768 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301769 if (!(temp & 0x40))
1770 tempcl |= ActiveCRT1;
1771 }
1772 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001773
Aaro Koskinen58839b02011-03-13 12:26:23 +02001774 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301775 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001776
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301777 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001778 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001779 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301780 if (tempax & 0x04)
1781 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301783 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001784
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301785 if (!(tempcl & ActiveLCD))
1786 if (temp == 0x01)
1787 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001788
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301789 if (temp == 0x04)
1790 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301792 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001793 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301795 if (!(temp & 0x08))
1796 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301798 if (!(temp & 0x04))
1799 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301801 if (temp & 0x02)
1802 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001803
Peter Huewe599801f2012-02-09 21:11:45 +01001804 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301805 if (temp & 0x01)
1806 tempch |= ActiveHiTV;
1807 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001808
Peter Huewe599801f2012-02-09 21:11:45 +01001809 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001810 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301811 pVBInfo->Part2Port,
1812 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001813
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301814 if (temp & 0x10)
1815 tempch |= ActiveYPbPr;
1816 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301818 if (tempch != 0)
1819 tempcl |= ActiveTV;
1820 }
1821 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001822
Aaro Koskinen58839b02011-03-13 12:26:23 +02001823 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301824 if (tempcl & ActiveLCD) {
1825 if ((pVBInfo->SetFlag & ReserveTVOption)) {
1826 if (temp & ActiveTV)
1827 tempcl |= ActiveTV;
1828 }
1829 }
1830 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01001831 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001832 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301834 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02001835 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301836 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001837}
1838
Bill Pemberton80adad82010-06-17 13:10:51 -04001839void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001840{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301841 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001842
Miguel Gómez7eec23a2012-07-06 12:40:47 +02001843 tempbx = VB_SIS302B;
1844 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
1845 if (flag == 0x02)
1846 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001847
Miguel Gómez7eec23a2012-07-06 12:40:47 +02001848 tempbx = VB_SIS301;
1849 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
1850 if (flag < 0xB0)
1851 goto finish;
1852
1853 tempbx = VB_SIS301B;
1854 if (flag < 0xC0)
1855 goto bigger_than_0xB0;
1856
1857 tempbx = VB_XGI301C;
1858 if (flag < 0xD0)
1859 goto bigger_than_0xB0;
1860
1861 tempbx = VB_SIS301LV;
1862 if (flag < 0xE0)
1863 goto bigger_than_0xB0;
1864
1865 tempbx = VB_SIS302LV;
1866 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
1867 if (tempah != 0xFF)
1868 tempbx = VB_XGI301C;
1869
1870bigger_than_0xB0:
1871 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
1872 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
1873 if (!(flag & 0x02))
1874 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301875 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02001876
1877finish:
1878 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001879}
1880
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03001881static void XGI_GetVBInfo(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301882 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001883{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301884 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001885
Aaro Koskinenb3979922012-11-04 21:14:52 +02001886 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301887 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01001888 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301889 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001890
Miguel Gómezf9317352012-07-06 12:40:48 +02001891 if (!(pVBInfo->VBType & 0xFFFF))
1892 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001893
Miguel Gómezf9317352012-07-06 12:40:48 +02001894 /* Check Display Device */
1895 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
1896 tempbx = tempbx | temp;
1897 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
1898 push = temp;
Aya Mahfouz46283372015-02-26 11:27:44 +02001899 push <<= 8;
Miguel Gómezf9317352012-07-06 12:40:48 +02001900 tempax = temp << 8;
1901 tempbx = tempbx | tempax;
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05001902 temp = SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
1903 | SetInSlaveMode | DisableCRT2Display;
Miguel Gómezf9317352012-07-06 12:40:48 +02001904 temp = 0xFFFF ^ temp;
1905 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001906
Miguel Gómezf9317352012-07-06 12:40:48 +02001907 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001908
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001909 if (pVBInfo->VBType & (VB_SIS302B | VB_SIS301LV | VB_SIS302LV |
1910 VB_XGI301C)) {
1911 if (temp & EnableDualEdge) {
1912 tempbx |= SetCRT2ToDualEdge;
1913 if (temp & SetToLCDA)
1914 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02001915 }
1916 }
1917
Aaro Koskinena4ce0e72013-05-29 23:59:14 +03001918 if (pVBInfo->VBType & (VB_SIS301LV|VB_SIS302LV|VB_XGI301C)) {
1919 if (temp & SetYPbPr) {
Aaro Koskinenaee0ac92013-05-29 23:59:15 +03001920 /* shampoo add for new scratch */
1921 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
1922 temp &= YPbPrMode;
1923 tempbx |= SetCRT2ToHiVision;
Miguel Gómezf9317352012-07-06 12:40:48 +02001924
Aaro Koskinenaee0ac92013-05-29 23:59:15 +03001925 if (temp != YPbPrMode1080i) {
1926 tempbx &= (~SetCRT2ToHiVision);
1927 tempbx |= SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301928 }
1929 }
Miguel Gómezf9317352012-07-06 12:40:48 +02001930 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001931
Miguel Gómezf9317352012-07-06 12:40:48 +02001932 tempax = push; /* restore CR31 */
1933
Aaro Koskinenaee0ac92013-05-29 23:59:15 +03001934 temp = 0x09FC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001935
Miguel Gómezf9317352012-07-06 12:40:48 +02001936 if (!(tempbx & temp)) {
1937 tempax |= DisableCRT2Display;
1938 tempbx = 0;
1939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001940
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03001941 if (!(pVBInfo->VBType & VB_NoLCD)) {
1942 if (tempbx & XGI_SetCRT2ToLCDA) {
1943 if (tempbx & SetSimuScanMode)
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001944 tempbx &= (~(SetCRT2ToLCD | SetCRT2ToRAMDAC |
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03001945 SwitchCRT2));
1946 else
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001947 tempbx &= (~(SetCRT2ToLCD | SetCRT2ToRAMDAC |
1948 SetCRT2ToTV | SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02001949 }
1950 }
1951
1952 /* shampoo add */
1953 /* for driver abnormal */
1954 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
Aaro Koskinenee768752013-05-29 23:59:16 +03001955 if (tempbx & SetCRT2ToRAMDAC) {
1956 tempbx &= (0xFF00 | SetCRT2ToRAMDAC |
1957 SwitchCRT2 | SetSimuScanMode);
1958 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301959 }
Miguel Gómezf9317352012-07-06 12:40:48 +02001960 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001961
Miguel Gómezf9317352012-07-06 12:40:48 +02001962 if (!(pVBInfo->VBType & VB_NoLCD)) {
1963 if (tempbx & SetCRT2ToLCD) {
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001964 tempbx &= (0xFF00 | SetCRT2ToLCD | SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001965 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01001966 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301967 }
Miguel Gómezf9317352012-07-06 12:40:48 +02001968 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001969
Miguel Gómezf9317352012-07-06 12:40:48 +02001970 if (tempbx & SetCRT2ToSCART) {
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001971 tempbx &= (0xFF00 | SetCRT2ToSCART | SwitchCRT2 |
Miguel Gómezf9317352012-07-06 12:40:48 +02001972 SetSimuScanMode);
1973 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
1974 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001975
Aaro Koskinena4ce0e72013-05-29 23:59:14 +03001976 if (tempbx & SetCRT2ToYPbPr525750)
1977 tempbx &= (0xFF00 | SwitchCRT2 | SetSimuScanMode);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001978
Aaro Koskinenaee0ac92013-05-29 23:59:15 +03001979 if (tempbx & SetCRT2ToHiVision)
1980 tempbx &= (0xFF00 | SetCRT2ToHiVision | SwitchCRT2 |
1981 SetSimuScanMode);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001982
Miguel Gómezf9317352012-07-06 12:40:48 +02001983 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
1984 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
1985 tempbx = DisableCRT2Display;
1986 }
1987
1988 if (!(tempbx & DisableCRT2Display)) {
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001989 if ((!(tempbx & DriverMode)) || (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03001990 if (!(tempbx & XGI_SetCRT2ToLCDA))
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001991 tempbx |= (SetInSlaveMode | SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02001992 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001993
Miguel Gómezf9317352012-07-06 12:40:48 +02001994 /* LCD+TV can't support in slave mode
Clifton Barnes56e18f82016-03-29 18:12:40 -04001995 * (Force LCDA+TV->LCDB)
1996 */
Aaro Koskinen1b149ed2013-02-09 00:03:44 +02001997 if ((tempbx & SetInSlaveMode) && (tempbx & XGI_SetCRT2ToLCDA)) {
1998 tempbx ^= (SetCRT2ToLCD | XGI_SetCRT2ToLCDA |
Miguel Gómezf9317352012-07-06 12:40:48 +02001999 SetCRT2ToDualEdge);
2000 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302001 }
2002 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002003
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302004 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002005}
2006
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002007static void XGI_GetTVInfo(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302008 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002009{
Peter Huewe5fc699f2013-02-03 04:08:45 +01002010 unsigned short tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302012 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinenb3979922012-11-04 21:14:52 +02002013 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2014 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002015
Peter Huewe5fc699f2013-02-03 04:08:45 +01002016 tempbx = xgifb_reg_get(pVBInfo->P3d4, 0x35);
2017 if (tempbx & TVSetPAL) {
2018 tempbx &= (SetCHTVOverScan |
2019 TVSetPALM |
2020 TVSetPALN |
2021 TVSetPAL);
2022 if (tempbx & TVSetPALM)
2023 /* set to NTSC if PAL-M */
2024 tempbx &= ~TVSetPAL;
2025 } else
2026 tempbx &= (SetCHTVOverScan |
2027 TVSetNTSCJ |
2028 TVSetPAL);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002029
Aaro Koskinena8b35292013-02-09 00:03:45 +02002030 if (pVBInfo->VBInfo & SetCRT2ToSCART)
2031 tempbx |= TVSetPAL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002032
Aaro Koskinena4ce0e72013-05-29 23:59:14 +03002033 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2034 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
2035 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002036
Aaro Koskinena4ce0e72013-05-29 23:59:14 +03002037 if (index1 == YPbPrMode525i)
2038 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002039
Aaro Koskinena4ce0e72013-05-29 23:59:14 +03002040 if (index1 == YPbPrMode525p)
2041 tempbx = tempbx | TVSetYPbPr525p;
2042 if (index1 == YPbPrMode750p)
2043 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302044 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002045
Aaro Koskinenaee0ac92013-05-29 23:59:15 +03002046 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2047 tempbx = tempbx | TVSetHiVision | TVSetPAL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002048
Aaro Koskinena8b35292013-02-09 00:03:45 +02002049 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2050 (!(pVBInfo->VBInfo & SetNotSimuMode)))
2051 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002052
Aaro Koskinena8b35292013-02-09 00:03:45 +02002053 if (!(tempbx & TVSetPAL) && (modeflag > 13) && (resinfo == 8))
2054 /* NTSC 1024x768, */
2055 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002056
Aaro Koskinena8b35292013-02-09 00:03:45 +02002057 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002058
Aaro Koskinena8b35292013-02-09 00:03:45 +02002059 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
2060 if (pVBInfo->VBInfo & SetInSlaveMode)
2061 tempbx &= (~RPLLDIV2XO);
2062 } else if (tempbx & (TVSetYPbPr525p | TVSetYPbPr750p)) {
2063 tempbx &= (~RPLLDIV2XO);
2064 } else if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B |
2065 VB_SIS301LV | VB_SIS302LV |
2066 VB_XGI301C))) {
2067 if (tempbx & TVSimuMode)
2068 tempbx &= (~RPLLDIV2XO);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302069 }
2070 }
2071 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002072}
2073
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002074static unsigned char XGI_GetLCDInfo(unsigned short ModeIdIndex,
2075 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002076{
Peter Hueweef9a6b92013-02-03 04:08:43 +01002077 unsigned short temp, tempax, tempbx, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002078
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302079 pVBInfo->LCDResInfo = 0;
2080 pVBInfo->LCDTypeInfo = 0;
2081 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002082
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002083 /* si+Ext_ResInfo // */
Aaro Koskinenb3979922012-11-04 21:14:52 +02002084 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002085 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302086 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002087
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302088 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002089 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002090
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002091 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002092 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302093 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002094 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002095 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302096 tempax &= 0x0F;
2097 else
Aya Mahfouz46283372015-02-26 11:27:44 +02002098 tempax >>= 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002099
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302100 if ((resinfo == 6) || (resinfo == 9)) {
2101 if (tempax >= 3)
2102 tempbx |= PanelRef75Hz;
2103 } else if ((resinfo == 7) || (resinfo == 8)) {
2104 if (tempax >= 4)
2105 tempbx |= PanelRef75Hz;
2106 }
2107 }
2108 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002109
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302110 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302112 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002113
Peter Huewea3d675c2012-02-09 21:11:47 +01002114 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302115 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302117 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002118
Aaro Koskinen58839b02011-03-13 12:26:23 +02002119 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002120
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302121 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302123 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302125 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002126
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302127 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002128
Aaro Koskinen718e7152013-02-09 00:03:46 +02002129 if (((pVBInfo->VBType & VB_SIS302LV) ||
2130 (pVBInfo->VBType & VB_XGI301C)) && (tempax & XGI_LCDDualLink))
2131 tempbx |= SetLCDDualLink;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002132
Aaro Koskinen718e7152013-02-09 00:03:46 +02002133 if ((pVBInfo->LCDResInfo == Panel_1400x1050) &&
2134 (pVBInfo->VBInfo & SetCRT2ToLCD) && (resinfo == 9) &&
2135 (!(tempbx & EnableScalingLCD)))
2136 /*
2137 * set to center in 1280x1024 LCDB
2138 * for Panel_1400x1050
2139 */
2140 tempbx |= SetLCDtoNonExpanding;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302142 if (pVBInfo->VBInfo & SetInSlaveMode) {
2143 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002144 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302145 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002146 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302147 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302149 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302151 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002152}
2153
Bill Pemberton108afbf2010-06-17 13:10:47 -04002154unsigned char XGI_SearchModeID(unsigned short ModeNo,
Aaro Koskinen334ab072013-07-16 23:13:30 +03002155 unsigned short *ModeIdIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002156{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002157 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
Aaro Koskinenb3979922012-11-04 21:14:52 +02002158 if (XGI330_EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002159 break;
Aaro Koskinenb3979922012-11-04 21:14:52 +02002160 if (XGI330_EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002161 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302162 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002163
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302164 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002165}
2166
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002167static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2168{
2169 unsigned char ujRet = 0;
2170 unsigned char i = 0;
2171
2172 for (i = 0; i < 8; i++) {
Aya Mahfouz46283372015-02-26 11:27:44 +02002173 ujRet <<= 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002174 ujRet |= (ujDate >> i) & 1;
2175 }
2176
2177 return ujRet;
2178}
2179
2180/*----------------------------------------------------------------------------*/
2181/* output */
2182/* bl[5] : LVDS signal */
2183/* bl[1] : LVDS backlight */
2184/* bl[0] : LVDS VDD */
2185/*----------------------------------------------------------------------------*/
2186static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2187{
2188 unsigned char CR4A, temp;
2189
Aaro Koskinen58839b02011-03-13 12:26:23 +02002190 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002191 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002192
Aaro Koskinen58839b02011-03-13 12:26:23 +02002193 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002194
2195 temp = XG21GPIODataTransfer(temp);
2196 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002197 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002198 return temp;
2199}
2200
2201/*----------------------------------------------------------------------------*/
2202/* output */
2203/* bl[5] : LVDS signal */
2204/* bl[1] : LVDS backlight */
2205/* bl[0] : LVDS VDD */
2206/*----------------------------------------------------------------------------*/
2207static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2208{
2209 unsigned char CR4A, CRB4, temp;
2210
Aaro Koskinen58839b02011-03-13 12:26:23 +02002211 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002212 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002213
Aaro Koskinen58839b02011-03-13 12:26:23 +02002214 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002215
2216 temp &= 0x0C;
2217 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002218 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002219 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002220 temp |= ((CRB4 & 0x04) << 3);
2221 return temp;
2222}
2223
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002224/*----------------------------------------------------------------------------*/
2225/* input */
2226/* bl[5] : 1;LVDS signal on */
2227/* bl[1] : 1;LVDS backlight on */
2228/* bl[0] : 1:LVDS VDD on */
2229/* bh: 100000b : clear bit 5, to set bit5 */
2230/* 000010b : clear bit 1, to set bit1 */
2231/* 000001b : clear bit 0, to set bit0 */
2232/*----------------------------------------------------------------------------*/
2233static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2234 struct vb_device_info *pVBInfo)
2235{
2236 unsigned char CR4A, temp;
2237
2238 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2239 tempbh &= 0x23;
2240 tempbl &= 0x23;
2241 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2242
2243 if (tempbh & 0x20) {
2244 temp = (tempbl >> 4) & 0x02;
2245
2246 /* CR B4[1] */
2247 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2248
2249 }
2250
2251 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2252
2253 temp = XG21GPIODataTransfer(temp);
2254 temp &= ~tempbh;
2255 temp |= tempbl;
2256 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2257}
2258
Aaro Koskinen776115a2011-11-27 23:03:10 +02002259static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2260 struct vb_device_info *pVBInfo)
2261{
2262 unsigned char CR4A, temp;
2263 unsigned short tempbh0, tempbl0;
2264
2265 tempbh0 = tempbh;
2266 tempbl0 = tempbl;
2267 tempbh0 &= 0x20;
2268 tempbl0 &= 0x20;
2269 tempbh0 >>= 3;
2270 tempbl0 >>= 3;
2271
2272 if (tempbh & 0x20) {
2273 temp = (tempbl >> 4) & 0x02;
2274
2275 /* CR B4[1] */
2276 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2277
2278 }
2279 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2280
2281 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2282 tempbh &= 0x03;
2283 tempbl &= 0x03;
2284 tempbh <<= 2;
2285 tempbl <<= 2; /* GPIOC,GPIOD */
2286 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2287 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2288}
2289
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002290static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2291 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302292 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002293{
2294
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002295 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302296 if (pXGIHWDE->jChipType == XG21) {
2297 if (pVBInfo->IF_DEF_LVDS == 1) {
2298 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002299 /* LVDS VDD on */
2300 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002301 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302302 }
2303 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002304 /* LVDS signal on */
2305 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002306 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002307 /* LVDS backlight on */
2308 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302309 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002310 /* DVO/DVI signal on */
2311 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302312 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002313
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302314 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002315
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302316 if (pXGIHWDE->jChipType == XG27) {
2317 if (pVBInfo->IF_DEF_LVDS == 1) {
2318 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002319 /* LVDS VDD on */
2320 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002321 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302322 }
2323 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002324 /* LVDS signal on */
2325 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002326 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002327 /* LVDS backlight on */
2328 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302329 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002330 /* DVO/DVI signal on */
2331 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302332 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302334 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002335}
2336
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002337void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2338 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302339 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002340{
2341
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302342 if (pXGIHWDE->jChipType == XG21) {
2343 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002344 /* LVDS backlight off */
2345 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002346 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302347 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002348 /* DVO/DVI signal off */
2349 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302350 }
2351 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002352
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302353 if (pXGIHWDE->jChipType == XG27) {
2354 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002355 /* LVDS backlight off */
2356 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002357 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302358 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302360 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002361 /* DVO/DVI signal off */
2362 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302363 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002364
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002365 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002366}
2367
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002368static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002369{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002370 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302371 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002372
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002373 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302374 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002375}
2376
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002377static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002378{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002379 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002380}
2381
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002382static void XGI_SaveCRT2Info(unsigned short ModeNo,
2383 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002384{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302385 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002386
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002387 /* reserve CR34 for CRT1 Mode No */
2388 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302389 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
2390 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002391 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002392}
2393
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002394static void XGI_GetCRT2ResInfo(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002395 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002396{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302397 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002398
Aaro Koskinenb3979922012-11-04 21:14:52 +02002399 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinene8e6c752012-11-04 21:15:00 +02002400 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
2401 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002402 /* si+St_ModeFlag */
Aaro Koskinenb3979922012-11-04 21:14:52 +02002403 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002404
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002405 if (modeflag & HalfDCLK)
2406 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002407
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002408 if (modeflag & DoubleScanMode)
2409 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002410
Miguel Gómez3339db82012-07-06 12:40:49 +02002411 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
2412 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002413
Aaro Koskinen22006832013-02-09 00:03:47 +02002414 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
2415 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2416 if (yres == 1024)
2417 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302418 }
Aaro Koskinen22006832013-02-09 00:03:47 +02002419 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002420
Aaro Koskinen22006832013-02-09 00:03:47 +02002421 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
2422 if (yres == 400)
2423 yres = 405;
2424 else if (yres == 350)
2425 yres = 360;
Miguel Gómez3339db82012-07-06 12:40:49 +02002426
Aaro Koskinen22006832013-02-09 00:03:47 +02002427 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
2428 if (yres == 360)
2429 yres = 375;
Miguel Gómez3339db82012-07-06 12:40:49 +02002430 }
Aaro Koskinen22006832013-02-09 00:03:47 +02002431 }
Miguel Gómez3339db82012-07-06 12:40:49 +02002432
Aaro Koskinen22006832013-02-09 00:03:47 +02002433 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2434 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2435 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
2436 if (yres == 350)
2437 yres = 357;
2438 else if (yres == 400)
2439 yres = 420;
2440 else if (yres == 480)
2441 yres = 525;
Miguel Gómez3339db82012-07-06 12:40:49 +02002442 }
2443 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302444 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002445
Miguel Gómez3339db82012-07-06 12:40:49 +02002446 if (xres == 720)
2447 xres = 640;
2448
2449exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302450 pVBInfo->VGAHDE = xres;
2451 pVBInfo->HDE = xres;
2452 pVBInfo->VGAVDE = yres;
2453 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002454}
2455
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002456static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002457{
2458
Peter Huewea3d675c2012-02-09 21:11:47 +01002459 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03002460 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302461 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002462
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302463 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002464}
2465
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002466static void XGI_GetRAMDAC2DATA(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002467 unsigned short RefreshRateTableIndex,
2468 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002469{
2470 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002471 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002472
2473 pVBInfo->RVBHCMAX = 1;
2474 pVBInfo->RVBHCFACT = 1;
Aaro Koskinenb3979922012-11-04 21:14:52 +02002475 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinena39325d2012-11-04 21:14:53 +02002476 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002477 CRT1Index &= IndexMask;
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002478 temp1 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[0];
2479 temp2 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[5];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002480 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002481 tempbx = (unsigned short) XGI_CRT1Table[CRT1Index].CR[8];
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002482 tempcx = (unsigned short)
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002483 XGI_CRT1Table[CRT1Index].CR[14] << 8;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002484 tempcx &= 0x0100;
Aya Mahfouz46283372015-02-26 11:27:44 +02002485 tempcx <<= 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002486 tempbx |= tempcx;
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002487 temp1 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002488
2489 if (temp1 & 0x01)
2490 tempbx |= 0x0100;
2491
2492 if (temp1 & 0x20)
2493 tempbx |= 0x0200;
2494 tempax += 5;
2495
2496 if (modeflag & Charx8Dot)
2497 tempax *= 8;
2498 else
2499 tempax *= 9;
2500
2501 pVBInfo->VGAHT = tempax;
2502 pVBInfo->HT = tempax;
2503 tempbx++;
2504 pVBInfo->VGAVT = tempbx;
2505 pVBInfo->VT = tempbx;
2506}
2507
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002508static void XGI_GetCRT2Data(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302509 unsigned short RefreshRateTableIndex,
2510 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002511{
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02002512 unsigned short tempax = 0, tempbx = 0, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002513
Aaro Koskinenbdc9eb12012-11-04 21:14:47 +02002514 struct SiS_LCDData const *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002515
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002516 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02002517 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2518 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302519 pVBInfo->NewFlickerMode = 0;
2520 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302522 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002523 XGI_GetRAMDAC2DATA(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302524 return;
2525 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002526
Peter Huewea3d675c2012-02-09 21:11:47 +01002527 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002528 LCDPtr = XGI_GetLcdPtr(XGI_LCDDataTable, ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03002529 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302531 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
2532 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
2533 pVBInfo->VGAHT = LCDPtr->VGAHT;
2534 pVBInfo->VGAVT = LCDPtr->VGAVT;
2535 pVBInfo->HT = LCDPtr->LCDHT;
2536 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002537
Peter Huewe255aabd2012-02-09 21:11:44 +01002538 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302539 tempax = 1024;
2540 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002541
Peter Huewea3d675c2012-02-09 21:11:47 +01002542 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302543 if (pVBInfo->VGAVDE == 357)
2544 tempbx = 527;
2545 else if (pVBInfo->VGAVDE == 420)
2546 tempbx = 620;
2547 else if (pVBInfo->VGAVDE == 525)
2548 tempbx = 775;
2549 else if (pVBInfo->VGAVDE == 600)
2550 tempbx = 775;
Peter Huewe7580d7f2013-05-18 00:19:54 +02002551 }
Peter Huewe255aabd2012-02-09 21:11:44 +01002552 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302553 tempax = 1024;
2554 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002555 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302556 tempax = 1280;
2557 if (pVBInfo->VGAVDE == 360)
2558 tempbx = 768;
2559 else if (pVBInfo->VGAVDE == 375)
2560 tempbx = 800;
2561 else if (pVBInfo->VGAVDE == 405)
2562 tempbx = 864;
2563 else
2564 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002565 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302566 tempax = 1280;
2567 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002568 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302569 tempax = 1280;
2570 if (pVBInfo->VGAVDE == 350)
2571 tempbx = 700;
2572 else if (pVBInfo->VGAVDE == 400)
2573 tempbx = 800;
2574 else if (pVBInfo->VGAVDE == 1024)
2575 tempbx = 960;
2576 else
2577 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01002578 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302579 tempax = 1400;
2580 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002581
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302582 if (pVBInfo->VGAVDE == 1024) {
2583 tempax = 1280;
2584 tempbx = 1024;
2585 }
Peter Huewe255aabd2012-02-09 21:11:44 +01002586 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302587 tempax = 1600;
2588 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01002589 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302590 if (pVBInfo->VGAVDE == 350)
2591 tempbx = 875;
2592 else if (pVBInfo->VGAVDE == 400)
2593 tempbx = 1000;
2594 }
2595 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002596
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302597 if (pVBInfo->LCDInfo & LCDNonExpanding) {
2598 tempax = pVBInfo->VGAHDE;
2599 tempbx = pVBInfo->VGAVDE;
2600 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 pVBInfo->HDE = tempax;
2603 pVBInfo->VDE = tempbx;
2604 return;
2605 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302607 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03002608 struct SiS_TVData const *TVPtr;
2609
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002610 TVPtr = XGI_GetTVPtr(ModeIdIndex, RefreshRateTableIndex,
Aaro Koskinen24572542012-09-11 00:15:21 +03002611 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302613 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
2614 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
2615 pVBInfo->VGAHT = TVPtr->VGAHT;
2616 pVBInfo->VGAVT = TVPtr->VGAVT;
2617 pVBInfo->HDE = TVPtr->TVHDE;
2618 pVBInfo->VDE = TVPtr->TVVDE;
2619 pVBInfo->RVBHRS = TVPtr->RVBHRS;
2620 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002621
Peter Huewe599801f2012-02-09 21:11:45 +01002622 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302623 if (resinfo == 0x08)
2624 pVBInfo->NewFlickerMode = 0x40;
2625 else if (resinfo == 0x09)
2626 pVBInfo->NewFlickerMode = 0x40;
2627 else if (resinfo == 0x12)
2628 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002629
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302630 if (pVBInfo->VGAVDE == 350)
2631 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302633 tempax = ExtHiTVHT;
2634 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302636 if (pVBInfo->VBInfo & SetInSlaveMode) {
2637 if (pVBInfo->TVInfo & TVSimuMode) {
2638 tempax = StHiTVHT;
2639 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302641 if (!(modeflag & Charx8Dot)) {
2642 tempax = StHiTextTVHT;
2643 tempbx = StHiTextTVVT;
2644 }
2645 }
2646 }
Peter Huewe599801f2012-02-09 21:11:45 +01002647 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2648 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302649 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
2650 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
2651 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002652
Peter Huewe599801f2012-02-09 21:11:45 +01002653 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302654 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
2655 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01002656 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302657 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
2658 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
2659 if (pVBInfo->TVInfo & NTSC1024x768)
2660 tempax = NTSC1024x768HT;
2661 }
2662 } else {
2663 tempax = PALHT;
2664 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01002665 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302666 tempax = NTSCHT;
2667 tempbx = NTSCVT;
2668 if (pVBInfo->TVInfo & NTSC1024x768)
2669 tempax = NTSC1024x768HT;
2670 }
2671 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002672
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302673 pVBInfo->HT = tempax;
2674 pVBInfo->VT = tempbx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302675 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002676}
2677
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002678static void XGI_SetCRT2VCLK(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302679 unsigned short RefreshRateTableIndex,
2680 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002681{
Bill Pemberton108afbf2010-06-17 13:10:47 -04002682 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002683
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002684 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302685 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2686 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002687
Peter Huewe6896b942012-02-09 21:11:46 +01002688 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302689 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002690 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
2691 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
2692 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302693 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002694 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
2695 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302696 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002697
Aaro Koskinen8104e322011-03-13 12:26:22 +02002698 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302700 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02002701 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302702 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02002703 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002704}
2705
Aaro Koskinen334ab072013-07-16 23:13:30 +03002706static unsigned short XGI_GetColorDepth(unsigned short ModeIdIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002707{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002708 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
2709 short index;
2710 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302711
Aaro Koskinenb3979922012-11-04 21:14:52 +02002712 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01002713 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302714
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002715 if (index < 0)
2716 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302717
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002718 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302719}
2720
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002721static unsigned short XGI_GetOffset(unsigned short ModeNo,
2722 unsigned short ModeIdIndex,
Aaro Koskinen334ab072013-07-16 23:13:30 +03002723 unsigned short RefreshRateTableIndex)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302724{
2725 unsigned short temp, colordepth, modeinfo, index, infoflag,
2726 ColorDepth[] = { 0x01, 0x02, 0x04 };
2727
Aaro Koskinenb3979922012-11-04 21:14:52 +02002728 modeinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinena39325d2012-11-04 21:14:53 +02002729 infoflag = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302730
2731 index = (modeinfo >> 8) & 0xFF;
2732
Aaro Koskinen224114c2012-11-04 21:14:59 +02002733 temp = XGI330_ScreenOffset[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302734
2735 if (infoflag & InterlaceMode)
Aya Mahfouz46283372015-02-26 11:27:44 +02002736 temp <<= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302737
Aaro Koskinen334ab072013-07-16 23:13:30 +03002738 colordepth = XGI_GetColorDepth(ModeIdIndex);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302739
2740 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
2741 temp = ModeNo - 0x7C;
2742 colordepth = ColorDepth[temp];
2743 temp = 0x6B;
2744 if (infoflag & InterlaceMode)
Aya Mahfouz46283372015-02-26 11:27:44 +02002745 temp <<= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302746 }
Peter Huewe053004b2013-02-15 20:37:12 +01002747 return temp * colordepth;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302748}
2749
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002750static void XGI_SetCRT2Offset(unsigned short ModeNo,
2751 unsigned short ModeIdIndex,
2752 unsigned short RefreshRateTableIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002753 struct vb_device_info *pVBInfo)
2754{
2755 unsigned short offset;
2756 unsigned char temp;
2757
2758 if (pVBInfo->VBInfo & SetInSlaveMode)
2759 return;
2760
Aaro Koskinen334ab072013-07-16 23:13:30 +03002761 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002762 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002763 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002764 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002765 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002766 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002767 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002768}
2769
Randy Dunlap89229672010-08-10 08:46:44 -07002770static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002771{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002772 /* threshold high ,disable auto threshold */
2773 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
2774 /* threshold low default 04h */
2775 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002776}
2777
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002778static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302779 unsigned short RefreshRateTableIndex,
2780 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002781{
Peter Hueweef9a6b92013-02-03 04:08:43 +01002782 u8 tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002783
Aaro Koskinenb053af12013-07-16 23:13:28 +03002784 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302785 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302787 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02002788 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002789
Aaro Koskinen8104e322011-03-13 12:26:22 +02002790 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
2791 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002792}
2793
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03002794static void XGI_SetGroup1(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302795 unsigned short RefreshRateTableIndex,
2796 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302798 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
Peter Hueweef9a6b92013-02-03 04:08:43 +01002799 pushbx = 0, CRT1Index, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002800
Aaro Koskinena39325d2012-11-04 21:14:53 +02002801 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002802 CRT1Index &= IndexMask;
Aaro Koskinenb3979922012-11-04 21:14:52 +02002803 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002804
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302805 /* bainy change table name */
2806 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002807 /* BTVGA2HT 0x08,0x09 */
2808 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002809 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302810 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002811 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002812 /* BTVGA2HDEE 0x0A,0x0C */
2813 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002814 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302815 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
2816 pushbx = pVBInfo->VGAHDE / 2 + 16;
Aya Mahfouz46283372015-02-26 11:27:44 +02002817 tempcx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302818 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
2819 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302821 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002822 tempbx = XGI_CRT1Table[CRT1Index].CR[4];
2823 tempbx |= ((XGI_CRT1Table[CRT1Index].CR[14] &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002824 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302825 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002826 tempcx = XGI_CRT1Table[CRT1Index].CR[5];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302827 tempcx &= 0x1F;
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002828 temp = XGI_CRT1Table[CRT1Index].CR[15];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302829 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
2830 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
2831 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302833 tempbx += 4;
2834 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002835
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302836 if (tempcx > (pVBInfo->VGAHT / 2))
2837 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002838
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302839 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002840
Aaro Koskinen8104e322011-03-13 12:26:22 +02002841 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302842 } else {
2843 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002844 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302845 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002846 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002847 /* BTVGA2HDEE 0x0A,0x0C */
2848 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002849 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302850 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
2851 pushbx = pVBInfo->VGAHDE + 16;
Aya Mahfouz46283372015-02-26 11:27:44 +02002852 tempcx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
2854 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002855
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302856 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002857 tempbx = XGI_CRT1Table[CRT1Index].CR[3];
2858 tempbx |= ((XGI_CRT1Table[CRT1Index].CR[5] &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002859 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302860 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002861 tempcx = XGI_CRT1Table[CRT1Index].CR[4];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302862 tempcx &= 0x1F;
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002863 temp = XGI_CRT1Table[CRT1Index].CR[6];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302864 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
2865 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
2866 tempbx += 16;
2867 tempcx += 16;
2868 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302870 if (tempcx > pVBInfo->VGAHT)
2871 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002872
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302873 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002874 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302875 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302877 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
2878 tempbx = pushbx;
2879 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
2880 tempax |= (tempbx & 0xFF00);
2881 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002882 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302883 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002884 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05002885 tempcx = pVBInfo->VGAVT - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302886 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002887
Aaro Koskinen8104e322011-03-13 12:26:22 +02002888 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302889 tempbx = pVBInfo->VGAVDE - 1;
2890 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002891 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302892 temp = ((tempbx & 0xFF00) << 3) >> 8;
2893 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002894 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002895
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002896 /* BTVGA2VRS 0x10,0x11 */
2897 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
2898 /* BTVGA2VRE 0x11 */
2899 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002900
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302901 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002902 tempbx = XGI_CRT1Table[CRT1Index].CR[10];
2903 temp = XGI_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002904
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302905 if (temp & 0x04)
2906 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302908 if (temp & 0x080)
2909 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002910
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002911 temp = XGI_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002912
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302913 if (temp & 0x08)
2914 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002915
Aaro Koskinen7853bce2012-11-04 21:14:54 +02002916 temp = XGI_CRT1Table[CRT1Index].CR[11];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302917 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
2918 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302920 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002921 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302922 temp = ((tempbx & 0xFF00) >> 8) << 4;
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05002923 temp = (tempcx & 0x000F) | (temp);
Aaro Koskinen8104e322011-03-13 12:26:22 +02002924 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302925 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002926
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302927 if (modeflag & DoubleScanMode)
2928 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002929
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302930 if (modeflag & HalfDCLK)
2931 tempax |= 0x40;
2932
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002933 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002934}
2935
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002936static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
2937{
2938 unsigned long tempax, tempbx;
2939
2940 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
2941 & 0xFFFF;
2942 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
2943 tempax = (tempax * pVBInfo->HT) / tempbx;
2944
2945 return (unsigned short) tempax;
2946}
2947
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002948static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302949 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002950{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302951 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
Peter Hueweef9a6b92013-02-03 04:08:43 +01002952 modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002953
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002954 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02002955 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2956 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002957
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302958 if (!(pVBInfo->VBInfo & SetInSlaveMode))
2959 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302961 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002962 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302963 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002964
Peter Huewe6896b942012-02-09 21:11:46 +01002965 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302966 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302968 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002969
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302970 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02002971 tempax >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002972
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302973 tempax = (tempax / tempcx) - 1;
2974 tempbx |= ((tempax & 0x00FF) << 8);
2975 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002976 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002977
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302978 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002979
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302980 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01002981 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2982 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302983 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002984
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002985 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
2986 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Clifton Barnesc3f06922016-03-27 15:13:01 -04002987 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302988 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002989
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002990 /* 0x05 Horizontal Display Start */
2991 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
2992 /* 0x06 Horizontal Blank end */
2993 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302995 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
2996 if (pVBInfo->VBInfo & SetCRT2ToTV)
2997 tempax = pVBInfo->VGAHT;
2998 else
2999 tempax = XGI_GetVGAHT2(pVBInfo);
3000 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303002 if (tempax >= pVBInfo->VGAHT)
3003 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303005 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02003006 tempax >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003007
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303008 tempax = (tempax / tempcx) - 5;
3009 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003010 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303011 temp = (tempbx & 0x00FF) - 1;
3012 if (!(modeflag & HalfDCLK)) {
3013 temp -= 6;
3014 if (pVBInfo->TVInfo & TVSimuMode) {
3015 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003016 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303017 }
3018 }
3019 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303020 tempbx = (tempbx & 0xFF00) >> 8;
3021 tempcx = (tempcx + tempbx) >> 1;
3022 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003023
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303024 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3025 temp -= 1;
3026 if (!(modeflag & HalfDCLK)) {
3027 if ((modeflag & Charx8Dot)) {
3028 temp += 4;
3029 if (pVBInfo->VGAHDE >= 800)
3030 temp -= 6;
3031 }
3032 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003033 } else if (!(modeflag & HalfDCLK)) {
3034 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003035 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003036 pVBInfo->VGAHDE >= 800) {
3037 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003038 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003039 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003040 (pVBInfo->LCDInfo & LCDNonExpanding))
3041 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303042 }
3043 }
3044 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003045
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003046 /* 0x07 Horizontal Retrace Start */
3047 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3048 /* 0x08 Horizontal Retrace End */
3049 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003050
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303051 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3052 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003053 if (ModeNo == 0x50) {
Peter Huewe85b38472013-05-13 23:41:49 +02003054 if (pVBInfo->TVInfo == SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003055 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303056 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003057 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303058 0x08, 0x03);
3059 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003060 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303061 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003062 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303063 0x08, 0x02);
3064 }
3065 }
3066 }
3067 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003068
Aaro Koskinen8104e322011-03-13 12:26:22 +02003069 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003070 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003071 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003072
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303073 tempbx = pVBInfo->VGAVT;
3074 push1 = tempbx;
3075 tempcx = 0x121;
3076 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303078 if (tempbx == 357)
3079 tempbx = 350;
3080 if (tempbx == 360)
3081 tempbx = 350;
3082 if (tempbx == 375)
3083 tempbx = 350;
3084 if (tempbx == 405)
3085 tempbx = 400;
3086 if (tempbx == 525)
3087 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003090
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303091 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003092 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003093 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303094 if (tempbx == 350)
3095 tempbx += 5;
3096 if (tempbx == 480)
3097 tempbx += 5;
3098 }
3099 }
3100 }
3101 tempbx--;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303102 tempbx--;
3103 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003104 /* 0x10 vertical Blank Start */
3105 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303106 tempbx = push2;
3107 tempbx--;
3108 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003109 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003110
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 if (tempbx & 0x0100)
3112 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303114 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003115
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303116 if (modeflag & DoubleScanMode)
3117 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303119 if (tempbx & 0x0200)
3120 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003121
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303122 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003123 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303125 if (tempbx & 0x0400)
3126 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003127
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003128 /* 0x11 Vertival Blank End */
3129 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303130
3131 tempax = push1;
3132 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
Aya Mahfouz46283372015-02-26 11:27:44 +02003133 tempax >>= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303134 push1 = tempax; /* push ax */
3135
3136 if (resinfo != 0x09) {
Aya Mahfouz46283372015-02-26 11:27:44 +02003137 tempax <<= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303138 tempbx += tempax;
3139 }
3140
Peter Huewe599801f2012-02-09 21:11:45 +01003141 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003142 if ((pVBInfo->VBType & VB_SIS301LV) &&
3143 !(pVBInfo->TVInfo & TVSetHiVision)) {
3144 if ((pVBInfo->TVInfo & TVSimuMode) &&
3145 (pVBInfo->TVInfo & TVSetPAL)) {
3146 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3147 !(pVBInfo->TVInfo &
3148 (TVSetYPbPr525p |
3149 TVSetYPbPr750p |
3150 TVSetHiVision)))
3151 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 }
3153 } else {
3154 tempbx -= 10;
3155 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003156 } else if (pVBInfo->TVInfo & TVSimuMode) {
3157 if (pVBInfo->TVInfo & TVSetPAL) {
3158 if (pVBInfo->VBType & VB_SIS301LV) {
3159 if (!(pVBInfo->TVInfo &
3160 (TVSetYPbPr525p |
3161 TVSetYPbPr750p |
3162 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303163 tempbx += 40;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003164 } else {
3165 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303166 }
3167 }
3168 }
3169 tempax = push1;
Aya Mahfouz46283372015-02-26 11:27:44 +02003170 tempax >>= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303171 tempax++;
3172 tempax += tempbx;
3173 push1 = tempax; /* push ax */
3174
Peter Huewe599801f2012-02-09 21:11:45 +01003175 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303176 if (tempbx <= 513) {
3177 if (tempax >= 513)
3178 tempbx = 513;
3179 }
3180 }
3181
3182 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003183 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303184 tempbx--;
3185 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003186 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303187
3188 if (tempbx & 0x0100)
3189 tempcx |= 0x0008;
3190
3191 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003192 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193
3194 tempbx++;
3195
3196 if (tempbx & 0x0100)
3197 tempcx |= 0x0004;
3198
3199 if (tempbx & 0x0200)
3200 tempcx |= 0x0080;
3201
3202 if (tempbx & 0x0400)
3203 tempcx |= 0x0C00;
3204
3205 tempbx = push1; /* pop ax */
3206 temp = tempbx & 0x00FF;
3207 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003208 /* 0x0D vertical Retrace End */
3209 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303210
3211 if (tempbx & 0x0010)
3212 tempcx |= 0x2000;
3213
3214 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003215 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303216 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003217 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303218 tempax = modeflag;
3219 temp = (tempax & 0xFF00) >> 8;
3220
3221 temp = (temp >> 1) & 0x09;
3222
Peter Huewe6896b942012-02-09 21:11:46 +01003223 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303224 temp |= 0x01;
3225
Aaro Koskinen8104e322011-03-13 12:26:22 +02003226 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3227 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3228 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303229
3230 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3231 temp = 0x80;
3232 else
3233 temp = 0x00;
3234
Aaro Koskinen8104e322011-03-13 12:26:22 +02003235 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003236}
3237
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003238static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303239 struct vb_device_info *pVBInfo)
3240{
3241 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
Peter Hueweef9a6b92013-02-03 04:08:43 +01003242 modeflag;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003243 unsigned char const *TimingPoint;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303244
3245 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3246
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003247 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02003248 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303249
3250 tempax = 0;
3251
3252 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3253 tempax |= 0x0800;
3254
3255 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3256 tempax |= 0x0400;
3257
3258 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3259 tempax |= 0x0200;
3260
Peter Huewe599801f2012-02-09 21:11:45 +01003261 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303262 tempax |= 0x1000;
3263
Peter Huewe599801f2012-02-09 21:11:45 +01003264 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303265 tempax |= 0x0100;
3266
Peter Huewe599801f2012-02-09 21:11:45 +01003267 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303268 tempax &= 0xfe00;
3269
3270 tempax = (tempax & 0xff00) >> 8;
3271
Aaro Koskinen8104e322011-03-13 12:26:22 +02003272 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003273 TimingPoint = XGI330_NTSCTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303274
Peter Huewe599801f2012-02-09 21:11:45 +01003275 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003276 TimingPoint = XGI330_PALTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303277
Peter Huewe599801f2012-02-09 21:11:45 +01003278 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003279 TimingPoint = XGI330_HiTVExtTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303280
3281 if (pVBInfo->VBInfo & SetInSlaveMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003282 TimingPoint = XGI330_HiTVSt2Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303283
3284 if (pVBInfo->SetFlag & TVSimuMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003285 TimingPoint = XGI330_HiTVSt1Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303286
3287 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003288 TimingPoint = XGI330_HiTVTextTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303289 }
3290
Peter Huewe599801f2012-02-09 21:11:45 +01003291 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3292 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003293 TimingPoint = XGI330_YPbPr525iTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303294
Peter Huewe599801f2012-02-09 21:11:45 +01003295 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003296 TimingPoint = XGI330_YPbPr525pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303297
Peter Huewe599801f2012-02-09 21:11:45 +01003298 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003299 TimingPoint = XGI330_YPbPr750pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 }
3301
3302 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003303 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303304
3305 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003306 /* di->temp2[j] */
3307 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303308
3309 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003310 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303311
3312 temp = pVBInfo->NewFlickerMode;
3313 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003314 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315
Peter Huewe599801f2012-02-09 21:11:45 +01003316 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303317 tempax = 520;
3318 else
3319 tempax = 440;
3320
3321 if (pVBInfo->VDE <= tempax) {
3322 tempax -= pVBInfo->VDE;
Aya Mahfouz46283372015-02-26 11:27:44 +02003323 tempax >>= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303324 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
3325 push1 = tempax;
3326 temp = (tempax & 0xFF00) >> 8;
3327 temp += (unsigned short) TimingPoint[0];
3328
Peter Huewe6896b942012-02-09 21:11:46 +01003329 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3330 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3332 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003333 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303334 tempcx = pVBInfo->VGAHDE;
3335 if (tempcx >= 1024) {
3336 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003337 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 temp = 0x19; /* PAL */
3339 }
3340 }
3341 }
3342
Aaro Koskinen8104e322011-03-13 12:26:22 +02003343 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303344 tempax = push1;
3345 temp = (tempax & 0xFF00) >> 8;
3346 temp += TimingPoint[1];
3347
Peter Huewe6896b942012-02-09 21:11:46 +01003348 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3349 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3351 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003352 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303353 tempcx = pVBInfo->VGAHDE;
3354 if (tempcx >= 1024) {
3355 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003356 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303357 temp = 0x52; /* PAL */
3358 }
3359 }
3360 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003361 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303362 }
3363
3364 /* 301b */
3365 tempcx = pVBInfo->HT;
3366
3367 if (XGI_IsLCDDualLink(pVBInfo))
Aya Mahfouz46283372015-02-26 11:27:44 +02003368 tempcx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303369
3370 tempcx -= 2;
3371 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003372 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303373
3374 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003375 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303376
3377 tempcx = pVBInfo->HT >> 1;
3378 push1 = tempcx; /* push cx */
3379 tempcx += 7;
3380
Peter Huewe599801f2012-02-09 21:11:45 +01003381 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303382 tempcx -= 4;
3383
3384 temp = tempcx & 0x00FF;
Aya Mahfouz46283372015-02-26 11:27:44 +02003385 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003386 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303387
3388 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3389 tempbx += tempcx;
3390 push2 = tempbx;
3391 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003392 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303393 temp = (tempbx & 0xFF00) >> 8;
Aya Mahfouz46283372015-02-26 11:27:44 +02003394 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003395 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303396
3397 tempbx = push2;
3398 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003399 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 tempbx = tempbx - 4;
3401 tempcx = tempbx;
3402 }
3403
3404 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003405 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303406
3407 j += 2;
3408 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
3409 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003410 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303411 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003412 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303413
3414 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003415 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303416 tempcx -= 4;
3417
3418 temp = tempcx & 0xFF;
Aya Mahfouz46283372015-02-26 11:27:44 +02003419 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003420 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421
3422 tempcx = push1; /* pop cx */
3423 j += 2;
3424 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3425 tempcx -= temp;
3426 temp = tempcx & 0x00FF;
Aya Mahfouz46283372015-02-26 11:27:44 +02003427 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003428 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303429
3430 tempcx -= 11;
3431
3432 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
3433 tempax = XGI_GetVGAHT2(pVBInfo);
3434 tempcx = tempax - 1;
3435 }
3436 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003437 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303438
3439 tempbx = pVBInfo->VDE;
3440
3441 if (pVBInfo->VGAVDE == 360)
3442 tempbx = 746;
3443 if (pVBInfo->VGAVDE == 375)
3444 tempbx = 746;
3445 if (pVBInfo->VGAVDE == 405)
3446 tempbx = 853;
3447
3448 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003449 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003450 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003451 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01003452 (TVSetYPbPr525p | TVSetYPbPr750p)))
Aya Mahfouz46283372015-02-26 11:27:44 +02003453 tempbx >>= 1;
Nicholas Sim26b69432016-03-23 23:02:24 +00003454 } else {
Aya Mahfouz46283372015-02-26 11:27:44 +02003455 tempbx >>= 1;
Nicholas Sim26b69432016-03-23 23:02:24 +00003456 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303457 }
3458
3459 tempbx -= 2;
3460 temp = tempbx & 0x00FF;
3461
Peter Huewe599801f2012-02-09 21:11:45 +01003462 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01003463 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003464 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303465 if (pVBInfo->VBInfo & SetInSlaveMode) {
3466 if (ModeNo == 0x2f)
3467 temp += 1;
3468 }
3469 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003470 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
3471 if (ModeNo == 0x2f)
3472 temp += 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303473 }
3474 }
3475
Aaro Koskinen8104e322011-03-13 12:26:22 +02003476 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303477
3478 temp = (tempcx & 0xFF00) >> 8;
3479 temp |= ((tempbx & 0xFF00) >> 8) << 6;
3480
Peter Huewe599801f2012-02-09 21:11:45 +01003481 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01003482 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003483 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303484 temp |= 0x10;
3485
3486 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3487 temp |= 0x20;
3488 }
3489 } else {
3490 temp |= 0x10;
3491 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3492 temp |= 0x20;
3493 }
3494 }
3495
Aaro Koskinen8104e322011-03-13 12:26:22 +02003496 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303497
Peter Huewe6896b942012-02-09 21:11:46 +01003498 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3499 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303500 tempbx = pVBInfo->VDE;
3501 tempcx = tempbx - 2;
3502
3503 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003504 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
3505 | TVSetYPbPr750p)))
Aya Mahfouz46283372015-02-26 11:27:44 +02003506 tempbx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 }
3508
Peter Huewe6896b942012-02-09 21:11:46 +01003509 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303510 temp = 0;
3511 if (tempcx & 0x0400)
3512 temp |= 0x20;
3513
3514 if (tempbx & 0x0400)
3515 temp |= 0x40;
3516
Aaro Koskinen8104e322011-03-13 12:26:22 +02003517 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303518 }
3519
3520 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003521 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003523 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303524 }
3525
3526 tempbx = tempbx & 0x00FF;
3527
3528 if (!(modeflag & HalfDCLK)) {
3529 tempcx = pVBInfo->VGAHDE;
3530 if (tempcx >= pVBInfo->HDE) {
3531 tempbx |= 0x2000;
3532 tempax &= 0x00FF;
3533 }
3534 }
3535
3536 tempcx = 0x0101;
3537
3538 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
3539 if (pVBInfo->VGAHDE >= 1024) {
3540 tempcx = 0x1920;
3541 if (pVBInfo->VGAHDE >= 1280) {
3542 tempcx = 0x1420;
3543 tempbx = tempbx & 0xDFFF;
3544 }
3545 }
3546 }
3547
3548 if (!(tempbx & 0x2000)) {
3549 if (modeflag & HalfDCLK)
3550 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
3551
3552 push1 = tempbx;
3553 tempeax = pVBInfo->VGAHDE;
3554 tempebx = (tempcx & 0xFF00) >> 8;
3555 longtemp = tempeax * tempebx;
3556 tempecx = tempcx & 0x00FF;
3557 longtemp = longtemp / tempecx;
3558
3559 /* 301b */
3560 tempecx = 8 * 1024;
3561
Peter Huewe6896b942012-02-09 21:11:46 +01003562 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3563 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564 tempecx = tempecx * 8;
3565 }
3566
3567 longtemp = longtemp * tempecx;
3568 tempecx = pVBInfo->HDE;
3569 temp2 = longtemp % tempecx;
3570 tempeax = longtemp / tempecx;
3571 if (temp2 != 0)
3572 tempeax += 1;
3573
3574 tempax = (unsigned short) tempeax;
3575
3576 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01003577 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3578 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303579 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
3580 }
3581 /* end 301b */
3582
3583 tempbx = push1;
3584 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
3585 | (tempbx & 0x00FF));
3586 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
3587 | (tempax & 0x00FF));
3588 temp = (tempax & 0xFF00) >> 8;
3589 } else {
3590 temp = (tempax & 0x00FF) >> 8;
3591 }
3592
Aaro Koskinen8104e322011-03-13 12:26:22 +02003593 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303594 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003595 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303596 temp = tempcx & 0x00FF;
3597
3598 if (tempbx & 0x2000)
3599 temp = 0;
3600
3601 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3602 temp |= 0x18;
3603
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003604 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01003605 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303606 tempbx = 0x0382;
3607 tempcx = 0x007e;
3608 } else {
3609 tempbx = 0x0369;
3610 tempcx = 0x0061;
3611 }
3612
3613 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003614 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303615 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003616 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303617
3618 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
Aya Mahfouz46283372015-02-26 11:27:44 +02003619 temp <<= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303620 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
3621
Peter Huewe599801f2012-02-09 21:11:45 +01003622 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303623 temp |= 0x10;
3624
Peter Huewe599801f2012-02-09 21:11:45 +01003625 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303626 temp |= 0x20;
3627
Peter Huewe599801f2012-02-09 21:11:45 +01003628 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303629 temp |= 0x60;
3630 }
3631
Aaro Koskinen8104e322011-03-13 12:26:22 +02003632 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003633 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003634 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303635
Peter Huewe599801f2012-02-09 21:11:45 +01003636 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303637 if (pVBInfo->TVInfo & NTSC1024x768) {
3638 TimingPoint = XGI_NTSC1024AdjTime;
3639 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003640 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303641 TimingPoint[j]);
3642 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003643 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303644 }
3645 }
3646
Miguel Gómez949eb0a2012-07-06 12:40:36 +02003647 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303648 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01003649 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003650 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303651 0x08); /* PALM Mode */
3652 }
3653
Peter Huewe599801f2012-02-09 21:11:45 +01003654 if (pVBInfo->TVInfo & TVSetPALM) {
Peter Huewe9388ad92013-02-15 20:37:10 +01003655 tempax = xgifb_reg_get(pVBInfo->Part2Port, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303656 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02003657 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303658
Aaro Koskinendc505562011-03-13 12:26:26 +02003659 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303660 }
3661
Peter Huewe599801f2012-02-09 21:11:45 +01003662 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303663 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003664 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303665 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303666}
3667
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03003668static void XGI_SetLCDRegs(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303669 struct vb_device_info *pVBInfo)
3670{
Peter Hueweef9a6b92013-02-03 04:08:43 +01003671 unsigned short pushbx, tempax, tempbx, tempcx, temp, tempah,
3672 tempbh, tempch;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303673
Aaro Koskinenbdc9eb12012-11-04 21:14:47 +02003674 struct XGI_LCDDesStruct const *LCDBDesPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303675
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003676 /* si+Ext_ResInfo */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303677 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3678 return;
3679
3680 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
3681
3682 if (XGI_IsLCDDualLink(pVBInfo))
Aya Mahfouz46283372015-02-26 11:27:44 +02003683 tempbx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303684
3685 tempbx -= 1;
3686 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003687 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303688 temp = (tempbx & 0xFF00) >> 8;
Aya Mahfouz46283372015-02-26 11:27:44 +02003689 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003690 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303691 temp = 0x01;
3692
Aaro Koskinen8104e322011-03-13 12:26:22 +02003693 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303694 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303695 tempbx--;
3696 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003697 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303698 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003699 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303700
3701 tempcx = pVBInfo->VT - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303702 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003703 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303704 temp = (tempcx & 0xFF00) >> 8;
Aya Mahfouz46283372015-02-26 11:27:44 +02003705 temp <<= 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003706 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003707 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
3708 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
3709 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
3710 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303711
Justin P. Mattock558f7582012-10-02 21:17:11 -07003712 /* Customized LCDB Does not add */
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02003713 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03003714 LCDBDesPtr = XGI_GetLcdPtr(xgifb_lcddldes, ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03003715 pVBInfo);
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02003716 else
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03003717 LCDBDesPtr = XGI_GetLcdPtr(XGI_LCDDesDataTable, ModeIdIndex,
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03003718 pVBInfo);
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02003719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303720 tempah = pVBInfo->LCDResInfo;
3721 tempah &= PanelResInfo;
3722
Peter Huewe255aabd2012-02-09 21:11:44 +01003723 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303724 tempbx = 1024;
3725 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003726 } else if ((tempah == Panel_1280x1024) ||
3727 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303728 tempbx = 1280;
3729 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003730 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303731 tempbx = 1400;
3732 tempcx = 1050;
3733 } else {
3734 tempbx = 1600;
3735 tempcx = 1200;
3736 }
3737
3738 if (pVBInfo->LCDInfo & EnableScalingLCD) {
3739 tempbx = pVBInfo->HDE;
3740 tempcx = pVBInfo->VDE;
3741 }
3742
3743 pushbx = tempbx;
3744 tempax = pVBInfo->VT;
3745 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
3746 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
3747 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
3748 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
3749 tempbx = pVBInfo->LCDVDES;
3750 tempcx += tempbx;
3751
3752 if (tempcx >= tempax)
3753 tempcx -= tempax; /* lcdvdes */
3754
3755 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003756 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303757 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003758 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303759 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
3760 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
3761 tempah = tempch;
Aya Mahfouz46283372015-02-26 11:27:44 +02003762 tempah <<= 3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303763 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003764 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303765
3766 /* getlcdsync() */
3767 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
3768 tempcx = tempbx;
3769 tempax = pVBInfo->VT;
3770 tempbx = pVBInfo->LCDVRS;
3771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303772 tempcx += tempbx;
3773 if (tempcx >= tempax)
3774 tempcx -= tempax;
3775
3776 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003777 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303778 temp = (tempbx & 0xFF00) >> 8;
Aya Mahfouz46283372015-02-26 11:27:44 +02003779 temp <<= 4;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303780 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003781 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303782 tempcx = pushbx;
3783 tempax = pVBInfo->HT;
3784 tempbx = pVBInfo->LCDHDES;
3785 tempbx &= 0x0FFF;
3786
3787 if (XGI_IsLCDDualLink(pVBInfo)) {
Aya Mahfouz46283372015-02-26 11:27:44 +02003788 tempax >>= 1;
3789 tempbx >>= 1;
3790 tempcx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303791 }
3792
Peter Huewe6896b942012-02-09 21:11:46 +01003793 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303794 tempbx += 1;
3795
3796 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
3797 tempbx += 1;
3798
3799 tempcx += tempbx;
3800
3801 if (tempcx >= tempax)
3802 tempcx -= tempax;
3803
3804 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003805 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303806 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003807 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303808 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003809 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303810 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003811 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303813 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
3814 tempcx = tempax;
3815 tempax = pVBInfo->HT;
3816 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303817 if (XGI_IsLCDDualLink(pVBInfo)) {
Aya Mahfouz46283372015-02-26 11:27:44 +02003818 tempax >>= 1;
3819 tempbx >>= 1;
3820 tempcx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303821 }
3822
Peter Huewe6896b942012-02-09 21:11:46 +01003823 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303824 tempbx += 1;
3825
3826 tempcx += tempbx;
3827
3828 if (tempcx >= tempax)
3829 tempcx -= tempax;
3830
3831 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003832 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303833
3834 temp = (tempbx & 0xFF00) >> 8;
Aya Mahfouz46283372015-02-26 11:27:44 +02003835 temp <<= 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003836 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303837 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003838 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303839
Peter Huewea3d675c2012-02-09 21:11:47 +01003840 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303841 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01003842 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
3843 | VB_SIS301LV | VB_SIS302LV
Nicholas Simaaeb5e72016-03-23 23:02:59 +00003844 | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303845 temp = 0xC6;
Nicholas Simaaeb5e72016-03-23 23:02:59 +00003846 else
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303847 temp = 0xC4;
3848
Aaro Koskinen8104e322011-03-13 12:26:22 +02003849 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
3850 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303851 }
3852
3853 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01003854 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
3855 | VB_SIS301LV | VB_SIS302LV
Nicholas Simaaeb5e72016-03-23 23:02:59 +00003856 | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303857 temp = 0x4F;
Nicholas Simaaeb5e72016-03-23 23:02:59 +00003858 else
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303859 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003860 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303861 }
3862 }
3863}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003864
3865/* --------------------------------------------------------------------- */
3866/* Function : XGI_GetTap4Ptr */
3867/* Input : */
3868/* Output : di -> Tap4 Reg. Setting Pointer */
3869/* Description : */
3870/* --------------------------------------------------------------------- */
Aaro Koskinen1cccd9e2012-11-04 21:15:06 +02003871static struct XGI301C_Tap4TimingStruct const
3872*XGI_GetTap4Ptr(unsigned short tempcx, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003873{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303874 unsigned short tempax, tempbx, i;
Aaro Koskinen1cccd9e2012-11-04 21:15:06 +02003875 struct XGI301C_Tap4TimingStruct const *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303877 if (tempcx == 0) {
3878 tempax = pVBInfo->VGAHDE;
3879 tempbx = pVBInfo->HDE;
3880 } else {
3881 tempax = pVBInfo->VGAVDE;
3882 tempbx = pVBInfo->VDE;
3883 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003884
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03003885 if (tempax <= tempbx)
3886 return &xgifb_tap4_timing[0];
Thomas Gummerer9c8c8312014-09-05 17:09:34 +02003887 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003888
Peter Huewe599801f2012-02-09 21:11:45 +01003889 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303890 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003891
Peter Huewe599801f2012-02-09 21:11:45 +01003892 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3893 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
3894 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03003895 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01003896 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303897 Tap4TimingPtr = YPbPr750pTap4Timing;
3898 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003899
Peter Huewe599801f2012-02-09 21:11:45 +01003900 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03003901 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003902
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303903 i = 0;
3904 while (Tap4TimingPtr[i].DE != 0xFFFF) {
3905 if (Tap4TimingPtr[i].DE == tempax)
3906 break;
3907 i++;
3908 }
3909 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003910}
3911
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003912static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003913{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303914 unsigned short i, j;
Aaro Koskinen1cccd9e2012-11-04 21:15:06 +02003915 struct XGI301C_Tap4TimingStruct const *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003916
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303917 if (!(pVBInfo->VBType & VB_XGI301C))
3918 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303920 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
3921 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003922 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003923
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003924 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01003925 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003926 /* Set Vertical Scaling */
3927 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303928 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003929 xgifb_reg_set(pVBInfo->Part2Port,
3930 i,
3931 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303932 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003933
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003934 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01003935 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003936 /* Enable V.Scaling */
3937 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303938 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003939 /* Enable H.Scaling */
3940 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003941}
3942
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03003943static void XGI_SetGroup3(unsigned short ModeIdIndex,
3944 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003945{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303946 unsigned short i;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003947 unsigned char const *tempdi;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303948 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003949
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003950 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02003951 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003952
Aaro Koskinen8104e322011-03-13 12:26:22 +02003953 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01003954 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003955 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
3956 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303957 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003958 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
3959 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303960 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003961
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
3963 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003964
Peter Huewe599801f2012-02-09 21:11:45 +01003965 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003966 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
3967 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
3968 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303969 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003970
Peter Huewe599801f2012-02-09 21:11:45 +01003971 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
3972 & SetCRT2ToYPbPr525750)) {
3973 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303974 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003975
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003976 tempdi = XGI330_HiTVGroup3Data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977 if (pVBInfo->SetFlag & TVSimuMode) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003978 tempdi = XGI330_HiTVGroup3Simu;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303979 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003980 tempdi = XGI330_HiTVGroup3Text;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303981 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003982
Peter Huewe599801f2012-02-09 21:11:45 +01003983 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003984 tempdi = XGI330_Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003985
Peter Huewe599801f2012-02-09 21:11:45 +01003986 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003987 tempdi = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303989 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003990 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003991
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303992 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01003993 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003994 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995 }
3996 }
Aaro Koskinen2351d1f2013-05-29 23:59:13 +03003997}
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303998
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03003999static void XGI_SetGroup4(unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304000 unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304001 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004002{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304003 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304005 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004006
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004007 /* si+Ext_ResInfo */
Aaro Koskinenb3979922012-11-04 21:14:52 +02004008 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004010 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004011
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304012 tempbx = pVBInfo->RVBHCMAX;
4013 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004014 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304015 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4016 tempcx = pVBInfo->VGAHT - 1;
4017 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004018 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004019
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304020 temp = ((tempcx & 0xFF00) >> 8) << 3;
4021 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004022
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304023 tempcx = pVBInfo->VGAVT - 1;
4024 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4025 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004026
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304027 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004028 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304029 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004030 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004031 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304032 tempcx = pVBInfo->VBInfo;
4033 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004034
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304035 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02004036 tempbx >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004037
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304038 if (XGI_IsLCDDualLink(pVBInfo))
Aya Mahfouz46283372015-02-26 11:27:44 +02004039 tempbx >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004040
Peter Huewe599801f2012-02-09 21:11:45 +01004041 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304042 temp = 0;
4043 if (tempbx <= 1024)
4044 temp = 0xA0;
4045 if (tempbx == 1280)
4046 temp = 0xC0;
4047 } else if (tempcx & SetCRT2ToTV) {
4048 temp = 0xA0;
4049 if (tempbx <= 800)
4050 temp = 0x80;
4051 } else {
4052 temp = 0x80;
4053 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4054 temp = 0;
4055 if (tempbx > 800)
4056 temp = 0x60;
4057 }
4058 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004059
Peter Huewe599801f2012-02-09 21:11:45 +01004060 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304061 temp = 0x00;
4062 if (pVBInfo->VGAHDE == 1280)
4063 temp = 0x40;
4064 if (pVBInfo->VGAHDE == 1024)
4065 temp = 0x20;
4066 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004067 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004068
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304069 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004070
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304071 tempcx = pVBInfo->RVBHRS;
4072 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004073 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304075 tempeax = pVBInfo->VGAVDE;
4076 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004077
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304078 if (tempeax <= tempebx) {
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05004079 tempcx = tempcx & (~0x4000);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304080 tempeax = pVBInfo->VGAVDE;
4081 } else {
4082 tempeax -= tempebx;
4083 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304085 templong = (tempeax * 256 * 1024) % tempebx;
4086 tempeax = (tempeax * 256 * 1024) / tempebx;
4087 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304089 if (templong != 0)
4090 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004091
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304092 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004093 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004094
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304095 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004096 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304097 tempbx = (unsigned short) (tempebx >> 16);
4098 temp = tempbx & 0x00FF;
Aya Mahfouz46283372015-02-26 11:27:44 +02004099 temp <<= 4;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304100 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004101 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004102
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304103 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004104 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4105 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304106 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004107 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304108 tempax = pVBInfo->VGAHDE;
4109 if (modeflag & HalfDCLK)
Aya Mahfouz46283372015-02-26 11:27:44 +02004110 tempax >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004111
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304112 if (XGI_IsLCDDualLink(pVBInfo))
Aya Mahfouz46283372015-02-26 11:27:44 +02004113 tempax >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004114
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304115 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4116 if (tempax > 800)
4117 tempax -= 800;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004118 } else if (pVBInfo->VGAHDE > 800) {
4119 if (pVBInfo->VGAHDE == 1024)
4120 tempax = (tempax * 25 / 32) - 1;
4121 else
4122 tempax = (tempax * 20 / 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304123 }
4124 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304126 temp = (tempax & 0xFF00) >> 8;
Jiayi Ye1d06bb42014-10-25 10:58:28 +08004127 temp = (temp & 0x0003) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004128 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05004129 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004130 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004131
Peter Huewe599801f2012-02-09 21:11:45 +01004132 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304133 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004134 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004135
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304136 }
4137 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304139 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4140 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004141 | TVSetYPbPr525p | TVSetYPbPr750p
4142 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304143 temp |= 0x0001;
4144 if ((pVBInfo->VBInfo & SetInSlaveMode)
4145 && (!(pVBInfo->TVInfo
4146 & TVSimuMode)))
4147 temp &= (~0x0001);
4148 }
4149 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004150
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004151 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304152 tempbx = pVBInfo->HT;
4153 if (XGI_IsLCDDualLink(pVBInfo))
Aya Mahfouz46283372015-02-26 11:27:44 +02004154 tempbx >>= 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304155 tempbx = (tempbx >> 1) - 2;
4156 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004157 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304158 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004159 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304160 }
4161 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004162
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03004163 XGI_SetCRT2VCLK(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004164}
4165
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004166static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4167{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004168 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004169}
4170
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03004171static void XGI_SetGroup5(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004172{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304173 if (pVBInfo->ModeType == ModeVGA) {
4174 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01004175 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304176 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304177 }
4178 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004179}
4180
Aaro Koskinenb053af12013-07-16 23:13:28 +03004181static void XGI_DisableGatingCRT(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004182{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004183 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004184}
4185
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004186static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
Aaro Koskinen334ab072013-07-16 23:13:30 +03004187 unsigned short ModeNo, unsigned short ModeIdIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004188{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004189 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004190
Aaro Koskinenb3979922012-11-04 21:14:52 +02004191 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinene8e6c752012-11-04 21:15:00 +02004192 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
4193 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004194 /* si+St_ModeFlag */
Aaro Koskinenb3979922012-11-04 21:14:52 +02004195 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304197 if (!(modeflag & Charx8Dot)) {
4198 xres /= 9;
4199 xres *= 8;
4200 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004201
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004202 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4203 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004204
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004205 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4206 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004207
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004208 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304209 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04004210
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004211 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304212 return 0;
4213
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004214 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4215 yres != xgifb_info->lvds_data.LVDSVDE) {
Aaro Koskinen334ab072013-07-16 23:13:30 +03004216 colordepth = XGI_GetColorDepth(ModeIdIndex);
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004217 if (colordepth > 2)
4218 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304219 }
4220 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004221}
4222
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004223static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4224 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004225 unsigned short ModeIdIndex,
4226 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004227{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304228 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004229 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304230 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4231 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4232 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004233
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004234 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004235 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304236 temp &= LCDPolarity;
Peter Huewe9388ad92013-02-15 20:37:10 +01004237 Miscdata = inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004238
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004239 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004240
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004241 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004242 /* SR35[7] FP VSync polarity */
4243 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4244 /* SR30[5] FP HSync polarity */
4245 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004246
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004247 if (chip_id == XG27)
4248 XGI_SetXG27FPBits(pVBInfo);
4249 else
4250 XGI_SetXG21FPBits(pVBInfo);
4251
Aaro Koskinenb3979922012-11-04 21:14:52 +02004252 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinene8e6c752012-11-04 21:15:00 +02004253 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
4254 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004255 /* si+St_ModeFlag */
Aaro Koskinenb3979922012-11-04 21:14:52 +02004256 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004257
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304258 if (!(modeflag & Charx8Dot))
4259 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004260
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004261 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004262
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004263 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304265 if (LVDSHBS > LVDSHT)
4266 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004267
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004268 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304269 if (LVDSHRS > LVDSHT)
4270 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004271
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004272 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304273 if (LVDSHRE > LVDSHT)
4274 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004275
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004276 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004277
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004278 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004279
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004280 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004281 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304282 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304284 if (LVDSVBS > LVDSVT)
4285 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004286
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004287 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304288 if (LVDSVRS > LVDSVT)
4289 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004290
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004291 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292 if (LVDSVRE > LVDSVT)
4293 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004294
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004295 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004296
Peter Huewe9388ad92013-02-15 20:37:10 +01004297 temp = xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004298 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304300 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004301 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004302
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304303 /* HT SR0B[1:0] CR00 */
4304 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004305 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004306 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004307
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 /* HBS SR0B[5:4] CR02 */
4309 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004310 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004311 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304313 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
4314 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004315 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
4316 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
4317 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004318
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304319 /* HRS SR0B[7:6] CR04 */
4320 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004321 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004322 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004323
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304324 /* Panel HRS SR2F[1:0] SR2E[7:0] */
4325 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004326 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004327 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 /* HRE SR0C[2] CR05[4:0] */
4330 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004331 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
4332 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 /* Panel HRE SR2F[7:2] */
4335 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004336 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304338 /* VT SR0A[0] CR07[5][0] CR06 */
4339 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004340 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
4341 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
4342 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004343 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004344
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304345 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
4346 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004347 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
4348 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
4349 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004350 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304352 /* VBE SR0A[4] CR16 */
4353 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004354 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004355 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304357 /* VRS SR0A[3] CR7[7][2] CR10 */
4358 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004359 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
4360 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
4361 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004362 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004363
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004364 if (chip_id == XG27) {
4365 /* Panel VRS SR35[2:0] SR34[7:0] */
4366 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
4367 (value & 0x700) >> 8);
4368 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
4369 } else {
4370 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
4371 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
4372 (value & 0x600) >> 9);
4373 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
4374 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
4375 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304377 /* VRE SR0A[5] CR11[3:0] */
4378 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004379 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
4380 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004381
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304382 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004383 if (chip_id == XG27)
4384 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4385 (value << 2) & 0xFC);
4386 else
4387 /* SR3F[7] has to be 0, h/w bug */
4388 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4389 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004390
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304391 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004392
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004393 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004394 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004395 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004396 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004397 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304398 value += 0x10;
4399 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304401 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004402 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004403 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004404 /* set data, panning = 0, shift left 1 dot*/
4405 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004406
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004407 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004408 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304409
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004410 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304411 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004412
4413}
4414
4415/* --------------------------------------------------------------------- */
4416/* Function : XGI_IsLCDON */
4417/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04004418/* Output : 0 : Skip PSC Control */
4419/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004420/* Description : */
4421/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004422static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004423{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304424 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304426 tempax = pVBInfo->VBInfo;
4427 if (tempax & SetCRT2ToDualEdge)
4428 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01004429 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304430 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004431
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304432 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004433}
4434
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004435static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
4436 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304437 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004438{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02004439 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004440
Peter Huewe6896b942012-02-09 21:11:46 +01004441 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4442 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304443 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004444 if (!(pVBInfo->VBInfo &
4445 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004446 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen41fc5f02013-05-29 23:59:12 +03004447 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304448 tempah = 0x7F; /* Disable Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304449 }
4450 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004451
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004452 /* disable part4_1f */
4453 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004454
Peter Huewe6896b942012-02-09 21:11:46 +01004455 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004456 if (((pVBInfo->VBInfo &
Peter Huewe06cc47b2013-02-03 22:54:38 +01004457 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))) ||
Peter Huewe06cc47b2013-02-03 22:54:38 +01004458 (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004459 /* LVDS Driver power down */
4460 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004462
Aaro Koskinend1724632013-05-29 23:59:09 +03004463 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA |
4464 SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004465 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004466
Aaro Koskinen41fc5f02013-05-29 23:59:12 +03004467 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
4468 /* Power down */
4469 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004470
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004471 /* disable TV as primary VGA swap */
4472 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004473
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304474 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02004475 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004476
Aaro Koskinenc4f9c312013-05-29 23:59:07 +03004477 if ((pVBInfo->VBInfo &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004478 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004479 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004480 (pVBInfo->VBInfo &
4481 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004482 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004483
Aaro Koskinenc4f9c312013-05-29 23:59:07 +03004484 if ((pVBInfo->VBInfo &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004485 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004486 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004487 (pVBInfo->VBInfo &
4488 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
4489 /* save Part1 index 0 */
4490 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
4491 /* BTDAC = 1, avoid VB reset */
4492 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
4493 /* disable CRT2 */
4494 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4495 /* restore Part1 index 0 */
4496 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304497 }
4498 } else { /* {301} */
4499 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004500 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
4501 /* Disable CRT2 */
4502 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4503 /* Disable TV asPrimary VGA swap */
4504 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304505 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004506
Peter Huewea3d675c2012-02-09 21:11:47 +01004507 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304508 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004509 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004511}
4512
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004513/* --------------------------------------------------------------------- */
4514/* Function : XGI_GetTVPtrIndex */
4515/* Input : */
4516/* Output : */
4517/* Description : bx 0 : ExtNTSC */
4518/* 1 : StNTSC */
4519/* 2 : ExtPAL */
4520/* 3 : StPAL */
4521/* 4 : ExtHiTV */
4522/* 5 : StHiTV */
4523/* 6 : Ext525i */
4524/* 7 : St525i */
4525/* 8 : Ext525p */
4526/* 9 : St525p */
4527/* A : Ext750p */
4528/* B : St750p */
4529/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004530static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004531{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304532 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004533
Peter Huewe599801f2012-02-09 21:11:45 +01004534 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304535 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01004536 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304537 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01004538 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304539 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01004540 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304541 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004542 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304543 tempbx = 10;
4544 if (pVBInfo->TVInfo & TVSimuMode)
4545 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004546
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304547 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004548}
4549
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004550/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004551/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004552/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004553/* Output : bx 0 : NTSC */
4554/* 1 : PAL */
4555/* 2 : PALM */
4556/* 3 : PALN */
4557/* 4 : NTSC1024x768 */
4558/* 5 : PAL-M 1024x768 */
4559/* 6-7: reserved */
4560/* cl 0 : YFilter1 */
4561/* 1 : YFilter2 */
4562/* ch 0 : 301A */
4563/* 1 : 301B/302B/301LV/302LV */
4564/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004565/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004566static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
4567 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004568{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004569 *tempbx = 0;
4570 *tempcl = 0;
4571 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004572
Peter Huewe599801f2012-02-09 21:11:45 +01004573 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004574 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004575
Peter Huewe599801f2012-02-09 21:11:45 +01004576 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004577 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004578
Peter Huewe599801f2012-02-09 21:11:45 +01004579 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004580 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004581
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004582 if (pVBInfo->TVInfo & NTSC1024x768) {
4583 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01004584 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004585 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304586 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004587
Peter Huewe6896b942012-02-09 21:11:46 +01004588 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4589 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004590 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
4591 & TVSimuMode)) {
4592 *tempbx += 8;
4593 *tempcl += 1;
4594 }
4595 }
4596
Peter Huewe6896b942012-02-09 21:11:46 +01004597 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4598 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004599 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004600}
4601
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004602static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004603{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304604 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004605
Peter Huewe6896b942012-02-09 21:11:46 +01004606 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4607 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004608 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304609 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304610 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02004611 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304613 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
Aya Mahfouz46283372015-02-26 11:27:44 +02004614 tempbl >>= 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004615 if (pVBInfo->VBInfo &
4616 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02004617 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004618
Peter Huewea3d675c2012-02-09 21:11:47 +01004619 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304620 tempbl = tempbh;
4621 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304623 tempbl &= 0x0F;
4624 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02004625 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304627 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
4628 | SetCRT2ToTV)) { /* Channel B */
4629 tempah &= 0xF0;
4630 tempah |= tempbl;
4631 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004632
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004633 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
4634 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304635 tempah &= 0x0F;
4636 tempah |= tempbh;
4637 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004638 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304639 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004641}
4642
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004643static void XGI_SetLCDCap_A(unsigned short tempcx,
4644 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004645{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304646 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004647
Aaro Koskinen58839b02011-03-13 12:26:23 +02004648 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004649
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304650 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004651 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004652 /* Enable Dither */
4653 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004654 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304655 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004656 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304657 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004658 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304659 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004660}
4661
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004662/* --------------------------------------------------------------------- */
4663/* Function : XGI_SetLCDCap_B */
4664/* Input : cx -> LCD Capability */
4665/* Output : */
4666/* Description : */
4667/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004668static void XGI_SetLCDCap_B(unsigned short tempcx,
4669 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004670{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304671 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004672 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304673 (unsigned short) (((tempcx & 0x00ff) >> 6)
4674 | 0x0c));
4675 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004676 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304677 (unsigned short) (((tempcx & 0x00ff) >> 6)
4678 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004679}
4680
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02004681static void XGI_LongWait(struct vb_device_info *pVBInfo)
4682{
4683 unsigned short i;
4684
4685 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
4686
4687 if (!(i & 0xC0)) {
4688 for (i = 0; i < 0xFFFF; i++) {
4689 if (!(inb(pVBInfo->P3da) & 0x08))
4690 break;
4691 }
4692
4693 for (i = 0; i < 0xFFFF; i++) {
4694 if ((inb(pVBInfo->P3da) & 0x08))
4695 break;
4696 }
4697 }
4698}
4699
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004700static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004701{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304702 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004703
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304704 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004705
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004706 /* disable down spectrum D[4] */
4707 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304708 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004709 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304710 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004711
Aaro Koskinen8104e322011-03-13 12:26:22 +02004712 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304713 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004714 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304715 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004716 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304717 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004718 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304719 pVBInfo->LCDCapList[index].Spectrum_34);
4720 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004721 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004722}
4723
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004724static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
4725{
4726 unsigned short tempcx;
4727
4728 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
4729
Peter Huewef951dd02013-02-05 00:29:47 +01004730 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV |
4731 VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004732 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004733 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004734 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004735 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004736 (unsigned char) (tempcx & 0x1F));
4737 }
4738 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004739 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004740 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
4741 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
4742 | EnablePLLSPLOW)) >> 8));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004743
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004744 if (pVBInfo->VBInfo & SetCRT2ToLCD)
4745 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01004746 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004747 XGI_SetLCDCap_A(tempcx, pVBInfo);
4748
Peter Huewe6896b942012-02-09 21:11:46 +01004749 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004750 if (tempcx & EnableSpectrum)
4751 SetSpectrum(pVBInfo);
4752 }
4753 } else {
4754 /* LVDS,CH7017 */
4755 XGI_SetLCDCap_A(tempcx, pVBInfo);
4756 }
4757}
4758
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004759/* --------------------------------------------------------------------- */
4760/* Function : XGI_SetAntiFlicker */
4761/* Input : */
4762/* Output : */
4763/* Description : Set TV Customized Param. */
4764/* --------------------------------------------------------------------- */
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03004765static void XGI_SetAntiFlicker(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004766{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03004767 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004768
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304769 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004770
Peter Huewe599801f2012-02-09 21:11:45 +01004771 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304774 tempbx = XGI_GetTVPtrIndex(pVBInfo);
4775 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 tempah = TVAntiFlickList[tempbx];
Aya Mahfouz46283372015-02-26 11:27:44 +02004777 tempah <<= 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004778
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004779 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004780}
4781
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03004782static void XGI_SetEdgeEnhance(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004783{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03004784 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304786 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004787
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304788 tempbx = XGI_GetTVPtrIndex(pVBInfo);
4789 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304790 tempah = TVEdgeList[tempbx];
Aya Mahfouz46283372015-02-26 11:27:44 +02004791 tempah <<= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004792
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004793 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004794}
4795
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004796static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004797{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304798 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004799
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304800 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304802 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004803
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304804 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
4805 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806
Aaro Koskinen8104e322011-03-13 12:26:22 +02004807 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304808 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004809 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304810 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004811 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304812 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02004813 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304814 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004815}
4816
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03004817static void XGI_SetYFilter(unsigned short ModeIdIndex,
4818 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004819{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 unsigned short tempbx, index;
Aaro Koskinena68292f2012-11-04 21:15:07 +02004821 unsigned char const *filterPtr;
4822 unsigned char tempcl, tempch, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304826 switch (tempbx) {
4827 case 0x00:
4828 case 0x04:
4829 filterPtr = NTSCYFilter1;
4830 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304832 case 0x01:
4833 filterPtr = PALYFilter1;
4834 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004835
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304836 case 0x02:
4837 case 0x05:
4838 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304839 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03004840 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304843 case 0x08:
4844 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304845 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304846 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304847 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03004848 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304849 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 default:
4852 return;
4853 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004854
Aaro Koskinenb3979922012-11-04 21:14:52 +02004855 tempal = XGI330_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304856 if (tempcl == 0)
4857 index = tempal * 4;
4858 else
4859 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004860
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304861 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004862 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
4863 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
4864 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
4865 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304866 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004867 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
4868 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
4869 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
4870 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304871 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004872
Peter Huewe6896b942012-02-09 21:11:46 +01004873 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4874 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004875 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
4876 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
4877 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304878 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004879}
4880
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004881/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004882/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004883/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004884/* Output : */
4885/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004886/* --------------------------------------------------------------------- */
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03004887static void XGI_OEM310Setting(unsigned short ModeIdIndex,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004888 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004889{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004890 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004891
Peter Huewea3d675c2012-02-09 21:11:47 +01004892 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004893 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004894
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004895 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004896 XGI_SetPhaseIncr(pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03004897 XGI_SetYFilter(ModeIdIndex, pVBInfo);
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03004898 XGI_SetAntiFlicker(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004899
Peter Huewe6896b942012-02-09 21:11:46 +01004900 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03004901 XGI_SetEdgeEnhance(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004903}
4904
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004905/* --------------------------------------------------------------------- */
4906/* Function : XGI_SetCRT2ModeRegs */
4907/* Input : */
4908/* Output : */
4909/* Description : Origin code for crt2group */
4910/* --------------------------------------------------------------------- */
Aaro Koskinenb053af12013-07-16 23:13:28 +03004911static void XGI_SetCRT2ModeRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004912{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304913 unsigned short tempbl;
4914 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004915
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304916 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004917
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304918 tempah = 0;
4919 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004920 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304921 tempah &= ~0x10; /* BTRAMDAC */
4922 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004923
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304924 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
4925 | SetCRT2ToLCD)) {
4926 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004927 tempcl = pVBInfo->ModeType;
4928 tempcl -= ModeVGA;
4929 if (tempcl >= 0) {
4930 /* BT Color */
Janani Ravichandran7aa546e2016-02-11 17:30:16 -05004931 tempah = 0x008 >> tempcl;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004932 if (tempah == 0)
4933 tempah = 1;
4934 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304935 }
4936 if (pVBInfo->VBInfo & SetInSlaveMode)
4937 tempah ^= 0x50; /* BTDAC */
4938 }
4939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004940
Aaro Koskinen8104e322011-03-13 12:26:22 +02004941 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304942 tempah = 0x08;
4943 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004944
Miguel Gómeze123e462012-07-06 12:40:52 +02004945 if (pVBInfo->VBInfo & DisableCRT2Display)
4946 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004947
Miguel Gómeze123e462012-07-06 12:40:52 +02004948 tempah = 0x00;
4949 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004950
Miguel Gómeze123e462012-07-06 12:40:52 +02004951 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
4952 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
4953 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004954
Miguel Gómeze123e462012-07-06 12:40:52 +02004955 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
4956 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
4957 tempbl &= 0xf7;
4958 tempah |= 0x01;
4959 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304960 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004961
Miguel Gómeze123e462012-07-06 12:40:52 +02004962 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
4963 tempbl &= 0xf7;
4964 tempah |= 0x01;
4965 }
4966
4967 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
4968 goto reg_and_or;
4969
4970 tempbl &= 0xf8;
4971 tempah = 0x01;
4972
4973 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4974 tempah |= 0x02;
4975
4976 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
4977 tempah = tempah ^ 0x05;
4978 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4979 tempah = tempah ^ 0x01;
4980 }
4981
4982 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
4983 tempah |= 0x08;
4984
4985reg_and_or:
4986 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
4987
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304988 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01004989 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304990 tempah &= (~0x08);
4991 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
4992 & SetInSlaveMode))) {
4993 tempah |= 0x010;
4994 }
4995 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304997 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304998 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004999 if (pVBInfo->VBInfo & DriverMode)
5000 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305001 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005002
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005003 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305004 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305006 if (pVBInfo->LCDInfo & SetLCDDualLink)
5007 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005008
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305009 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305010 if (pVBInfo->TVInfo & RPLLDIV2XO)
5011 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305012 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005013
Peter Huewe255aabd2012-02-09 21:11:44 +01005014 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5015 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005017
Peter Huewe255aabd2012-02-09 21:11:44 +01005018 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305019 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005020
Aaro Koskinen8104e322011-03-13 12:26:22 +02005021 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305022 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005023
Peter Huewe6896b942012-02-09 21:11:46 +01005024 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5025 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305026 tempah = 0;
5027 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005028
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305029 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5030 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005031 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305032 tempah |= 0x04; /* shampoo 0129 */
5033 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005034
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005035 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305036 tempah = 0x00;
5037 tempbl = 0xcf;
5038 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5039 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5040 tempah |= 0x30;
5041 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005042
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005043 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305044 tempah = 0;
5045 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005046
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305047 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5048 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5049 tempah |= 0xc0;
5050 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005051 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305052 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305054 tempah = 0;
5055 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005056 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305057 tempbl = 0xff;
5058 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5059 tempah |= 0x80;
5060 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005061
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005062 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005063
Peter Huewe6896b942012-02-09 21:11:46 +01005064 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305065 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005066 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5067 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305068 }
5069 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005070}
5071
Aaro Koskinenb053af12013-07-16 23:13:28 +03005072void XGI_UnLockCRT2(struct vb_device_info *pVBInfo)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305073{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005074 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005075}
5076
Aaro Koskinenb053af12013-07-16 23:13:28 +03005077void XGI_LockCRT2(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005078{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005079 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005080}
5081
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005082unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5083 unsigned short ModeNo, unsigned short ModeIdIndex,
5084 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005085{
Peter Huewef2c22602013-02-03 22:54:30 +01005086 const u8 LCDARefreshIndex[] = {
5087 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005088
Peter Hueweef9a6b92013-02-03 04:08:43 +01005089 unsigned short RefreshRateTableIndex, i, index, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005090
Aaro Koskinen58839b02011-03-13 12:26:23 +02005091 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aya Mahfouz46283372015-02-26 11:27:44 +02005092 index >>= pVBInfo->SelectCRT2Rate;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005093 index &= 0x0F;
5094
5095 if (pVBInfo->LCDInfo & LCDNonExpanding)
5096 index = 0;
5097
5098 if (index > 0)
5099 index--;
5100
5101 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005102 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenb0b4a8a2013-05-29 23:59:04 +03005103 temp = LCDARefreshIndex[pVBInfo->LCDResInfo & 0x07];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005104
Aaro Koskinenb0b4a8a2013-05-29 23:59:04 +03005105 if (index > temp)
5106 index = temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005107 }
5108 }
5109
Aaro Koskinenb3979922012-11-04 21:14:52 +02005110 RefreshRateTableIndex = XGI330_EModeIDTable[ModeIdIndex].REFindex;
Aaro Koskinena39325d2012-11-04 21:14:53 +02005111 ModeNo = XGI330_RefIndex[RefreshRateTableIndex].ModeID;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005112 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Aaro Koskinena39325d2012-11-04 21:14:53 +02005113 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 800) &&
5114 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005115 index++;
5116 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005117 /* do the similar adjustment like XGISearchCRT1Rate() */
Aaro Koskinena39325d2012-11-04 21:14:53 +02005118 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5119 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005120 index++;
5121 }
Aaro Koskinena39325d2012-11-04 21:14:53 +02005122 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5123 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005124 index++;
5125 }
5126 }
5127
5128 i = 0;
5129 do {
Aaro Koskinena39325d2012-11-04 21:14:53 +02005130 if (XGI330_RefIndex[RefreshRateTableIndex + i].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005131 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005132 break;
Aaro Koskinena39325d2012-11-04 21:14:53 +02005133 temp = XGI330_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01005134 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005135 if (temp < pVBInfo->ModeType)
5136 break;
5137 i++;
5138 index--;
5139
5140 } while (index != 0xFFFF);
5141 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5142 if (pVBInfo->VBInfo & SetInSlaveMode) {
Aaro Koskinena39325d2012-11-04 21:14:53 +02005143 temp = XGI330_RefIndex[RefreshRateTableIndex + i - 1].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005144 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005145 if (temp & InterlaceMode)
5146 i++;
5147 }
5148 }
5149 i--;
5150 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005151 temp = XGI_AjustCRT2Rate(ModeIdIndex, RefreshRateTableIndex,
5152 &i, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005153 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02005154 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005155}
5156
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005157static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305158 struct xgi_hw_device_info *HwDeviceExtension,
5159 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005160{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005161 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005162
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005163 pVBInfo->SetFlag |= ProgrammingCRT2;
5164 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5165 ModeIdIndex, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005166 XGI_GetLVDSResInfo(ModeIdIndex, pVBInfo);
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03005167 XGI_GetLVDSData(ModeIdIndex, pVBInfo);
5168 XGI_ModCRT1Regs(ModeIdIndex, HwDeviceExtension, pVBInfo);
5169 XGI_SetLVDSRegs(ModeIdIndex, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005170 XGI_SetCRT2ECLK(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005171}
5172
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005173static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005174 struct xgi_hw_device_info *HwDeviceExtension,
5175 struct vb_device_info *pVBInfo)
5176{
Peter Huewea9e29e62013-02-03 04:08:44 +01005177 unsigned short ModeIdIndex, RefreshRateTableIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005178
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005179 pVBInfo->SetFlag |= ProgrammingCRT2;
Aaro Koskinen334ab072013-07-16 23:13:30 +03005180 XGI_SearchModeID(ModeNo, &ModeIdIndex);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005181 pVBInfo->SelectCRT2Rate = 4;
5182 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5183 ModeIdIndex, pVBInfo);
5184 XGI_SaveCRT2Info(ModeNo, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005185 XGI_GetCRT2ResInfo(ModeIdIndex, pVBInfo);
5186 XGI_GetCRT2Data(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Aaro Koskinenb053af12013-07-16 23:13:28 +03005187 XGI_PreSetGroup1(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5188 XGI_SetGroup1(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Aaro Koskinen88a3dfd2013-07-16 23:13:29 +03005189 XGI_SetLockRegs(ModeNo, ModeIdIndex, pVBInfo);
5190 XGI_SetGroup2(ModeNo, ModeIdIndex, pVBInfo);
5191 XGI_SetLCDRegs(ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005192 XGI_SetTap4Regs(pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005193 XGI_SetGroup3(ModeIdIndex, pVBInfo);
Aaro Koskinenb053af12013-07-16 23:13:28 +03005194 XGI_SetGroup4(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005195 XGI_SetCRT2VCLK(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03005196 XGI_SetGroup5(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005197 XGI_AutoThreshold(pVBInfo);
5198 return 1;
5199}
5200
5201void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
5202{
5203 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
5204 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
5205 0x05, 0x00 };
5206
5207 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
5208
5209 unsigned char CR17, CR63, SR31;
5210 unsigned short temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005211
5212 int i;
Vitor Braga694683f2014-03-30 00:44:59 -03005213
Aaro Koskinen8104e322011-03-13 12:26:22 +02005214 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005215
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005216 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005217 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Peter Huewe9388ad92013-02-15 20:37:10 +01005218 xgifb_reg_set(pVBInfo->P3d4, 0x53, (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005219 pVBInfo->P3d4, 0x53) | 0x02));
5220
Peter Huewe9388ad92013-02-15 20:37:10 +01005221 SR31 = xgifb_reg_get(pVBInfo->P3c4, 0x31);
5222 CR63 = xgifb_reg_get(pVBInfo->P3d4, 0x63);
5223 SR01 = xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005224
Aaro Koskinen8104e322011-03-13 12:26:22 +02005225 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
5226 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005227
Peter Huewe9388ad92013-02-15 20:37:10 +01005228 CR17 = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005229 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005230
Peter Huewe9388ad92013-02-15 20:37:10 +01005231 SR1F = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005232 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005233
Peter Huewe9388ad92013-02-15 20:37:10 +01005234 SR07 = xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005235 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Peter Huewe9388ad92013-02-15 20:37:10 +01005236 SR06 = xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005237 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005238
Aaro Koskinen8104e322011-03-13 12:26:22 +02005239 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005240
5241 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005242 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005243
5244 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005245 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005246 CRTCData[i]);
5247
5248 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005249 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005250 CRTCData[i]);
5251
5252 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005253 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005254 CRTCData[i]);
5255
Aaro Koskinen8104e322011-03-13 12:26:22 +02005256 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005257 & 0xE0));
5258
Aaro Koskinen8104e322011-03-13 12:26:22 +02005259 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
5260 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
5261 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005262
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005263 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005264
Ebru Akagunduzf88d8182013-10-07 22:25:28 +03005265 for (i = 0; i < 256 * 3; i++)
Peter Huewe771f3ee2013-02-15 20:37:13 +01005266 outb(0x0F, (pVBInfo->P3c8 + 1)); /* DAC_TEST_PARMS */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005267
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005268 mdelay(1);
5269
5270 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005271 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005272
5273 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005274 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005275 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005276 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005277
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005278 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005279 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005280
Ebru Akagunduzf88d8182013-10-07 22:25:28 +03005281 for (i = 0; i < 256 * 3; i++)
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005282 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005283
Aaro Koskinen8104e322011-03-13 12:26:22 +02005284 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
5285 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
5286 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005287
Peter Huewe9388ad92013-02-15 20:37:10 +01005288 xgifb_reg_set(pVBInfo->P3d4, 0x53, (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005289 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005290 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005291}
5292
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005293static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
5294 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005295 struct vb_device_info *pVBInfo)
5296{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005297 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005298
Peter Huewe6896b942012-02-09 21:11:46 +01005299 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5300 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinena2526d12013-05-29 23:59:10 +03005301 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
Aaro Koskinend1724632013-05-29 23:59:09 +03005302 /* Power on */
5303 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005304
Aaro Koskinenb8e34b32013-05-29 23:59:08 +03005305 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV |
5306 SetCRT2ToRAMDAC)) {
Aaro Koskinenc4f9c312013-05-29 23:59:07 +03005307 tempah = xgifb_reg_get(pVBInfo->P3c4, 0x32);
5308 tempah &= 0xDF;
5309 if (pVBInfo->VBInfo & SetInSlaveMode) {
5310 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC))
5311 tempah |= 0x20;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005312 }
Aaro Koskinenc4f9c312013-05-29 23:59:07 +03005313 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
5314 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
5315
5316 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2E);
5317
5318 if (!(tempah & 0x80))
5319 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
5320 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005321 }
5322
Aaro Koskinena2526d12013-05-29 23:59:10 +03005323 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005324 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005325 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01005326 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen056b5402013-05-29 23:59:11 +03005327 if (pVBInfo->VBInfo &
5328 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
5329 /* LVDS PLL power on */
5330 xgifb_reg_and(pVBInfo->Part4Port, 0x2A,
5331 0x7F);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005332 /* LVDS Driver power on */
5333 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005334 }
5335 }
5336
5337 tempah = 0x00;
5338
5339 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5340 tempah = 0xc0;
5341
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005342 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
5343 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5344 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
5345 tempah = tempah & 0x40;
5346 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5347 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005348 }
5349 }
5350
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005351 /* EnablePart4_1F */
5352 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005353
Aaro Koskinenb053af12013-07-16 23:13:28 +03005354 XGI_DisableGatingCRT(pVBInfo);
Aaro Koskinend1724632013-05-29 23:59:09 +03005355 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005356 } /* 301 */
5357 else { /* LVDS */
5358 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005359 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005360 /* enable CRT2 */
5361 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005362
Peter Huewe9388ad92013-02-15 20:37:10 +01005363 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2E);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005364 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005365 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005366
Aaro Koskinendc505562011-03-13 12:26:26 +02005367 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005368 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005369 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005370}
5371
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005372static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
5373 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005374 unsigned short ModeNo, unsigned short ModeIdIndex,
5375 struct vb_device_info *pVBInfo)
5376{
Aaro Koskinena1579612012-04-07 01:14:05 +03005377 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005378
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03005379 XGI_SetSeqRegs(pVBInfo);
Aaro Koskinen3625c9a2012-11-04 21:14:51 +02005380 outb(XGI330_StandTable.MISC, pVBInfo->P3c2);
Aaro Koskinenb053af12013-07-16 23:13:28 +03005381 XGI_SetCRTCRegs(pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005382 XGI_SetATTRegs(ModeIdIndex, pVBInfo);
Aaro Koskinena1579612012-04-07 01:14:05 +03005383 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005384 XGI_ClearExt1Regs(pVBInfo);
5385
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005386 if (HwDeviceExtension->jChipType == XG27) {
5387 if (pVBInfo->IF_DEF_LVDS == 0)
5388 XGI_SetDefaultVCLK(pVBInfo);
5389 }
5390
5391 temp = ~ProgrammingCRT2;
5392 pVBInfo->SetFlag &= temp;
5393 pVBInfo->SelectCRT2Rate = 0;
5394
Peter Huewe6896b942012-02-09 21:11:46 +01005395 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5396 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005397 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005398 | SetInSlaveMode)) {
5399 pVBInfo->SetFlag |= ProgrammingCRT2;
5400 }
5401 }
5402
5403 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5404 ModeIdIndex, pVBInfo);
5405 if (RefreshRateTableIndex != 0xFFFF) {
5406 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005407 XGI_SetCRT1CRTC(ModeIdIndex, RefreshRateTableIndex,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005408 pVBInfo, HwDeviceExtension);
Aaro Koskinenb053af12013-07-16 23:13:28 +03005409 XGI_SetCRT1DE(ModeIdIndex, RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005410 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5411 HwDeviceExtension, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005412 XGI_SetCRT1VCLK(ModeIdIndex, HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005413 RefreshRateTableIndex, pVBInfo);
5414 }
5415
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005416 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005417 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005418 if (temp & 0xA0) {
5419
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005420 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03005421 XGI_SetXG27CRTC(RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005422 else
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03005423 XGI_SetXG21CRTC(RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005424
5425 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
5426 RefreshRateTableIndex);
5427
Aaro Koskinen105d8d02011-08-31 21:46:00 +03005428 xgifb_set_lcd(HwDeviceExtension->jChipType,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005429 pVBInfo, RefreshRateTableIndex);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005430
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005431 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005432 xgifb_set_lvds(xgifb_info,
5433 HwDeviceExtension->jChipType,
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005434 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005435 }
5436 }
5437
5438 pVBInfo->SetFlag &= (~ProgrammingCRT2);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005439 XGI_SetCRT1FIFO(HwDeviceExtension, pVBInfo);
5440 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeIdIndex,
5441 RefreshRateTableIndex, pVBInfo);
Aaro Koskinen6b6e6a32013-07-16 23:13:27 +03005442 XGI_LoadDAC(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005443}
5444
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005445unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
5446 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005447 unsigned short ModeNo)
5448{
5449 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005450 struct vb_device_info VBINF;
5451 struct vb_device_info *pVBInfo = &VBINF;
Chaitanya Hazarey0292bd42014-05-23 12:24:37 -07005452
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005453 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005454
Aaro Koskinenee768752013-05-29 23:59:16 +03005455 if (HwDeviceExtension->jChipType >= XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005456 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005457
Aaro Koskinen56810a92013-01-21 02:57:47 +02005458 XGIRegInit(pVBInfo, xgifb_info->vga_base);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005459
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005460 /* for x86 Linux, XG21 LVDS */
5461 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005462 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005463 pVBInfo->IF_DEF_LVDS = 1;
5464 }
5465 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005466 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
5467 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005468 pVBInfo->IF_DEF_LVDS = 1;
5469 }
5470 }
5471
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005472 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02005473 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005474 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005475 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005476
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005477 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinenb053af12013-07-16 23:13:28 +03005478 XGI_UnLockCRT2(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005479
Aaro Koskinen334ab072013-07-16 23:13:30 +03005480 XGI_SearchModeID(ModeNo, &ModeIdIndex);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005481
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005482 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinenb053af12013-07-16 23:13:28 +03005483 XGI_GetVBInfo(ModeIdIndex, pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005484 XGI_GetTVInfo(ModeIdIndex, pVBInfo);
5485 XGI_GetLCDInfo(ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005486 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005487
Peter Huewee44adfd2013-02-03 22:54:39 +01005488 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA) ||
5489 (!(pVBInfo->VBInfo & SwitchCRT2))) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005490 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005491 ModeIdIndex, pVBInfo);
5492
Peter Huewea3d675c2012-02-09 21:11:47 +01005493 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005494 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
5495 HwDeviceExtension, pVBInfo);
5496 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005497 }
5498
Peter Huewe6896b942012-02-09 21:11:46 +01005499 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005500 switch (HwDeviceExtension->ujVBChipID) {
Peter Huewee44adfd2013-02-03 22:54:39 +01005501 case VB_CHIP_301: /* fall through */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005502 case VB_CHIP_302:
5503 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
5504 pVBInfo); /*add for CRT2 */
5505 break;
5506
5507 default:
5508 break;
5509 }
5510 }
5511
Aaro Koskinenb053af12013-07-16 23:13:28 +03005512 XGI_SetCRT2ModeRegs(pVBInfo);
Aaro Koskinen3d05f66f2013-07-16 23:13:26 +03005513 XGI_OEM310Setting(ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005514 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005515 } /* !XG20 */
5516 else {
5517 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005518 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Aaro Koskinen334ab072013-07-16 23:13:30 +03005519 ModeIdIndex))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005520 return 0;
5521
Aaro Koskinenb3979922012-11-04 21:14:52 +02005522 pVBInfo->ModeType = XGI330_EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01005523 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005524
5525 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03005526 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005527
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005528 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005529
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005530 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
5531 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005532
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005533 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005534 }
5535
Aaro Koskinenb053af12013-07-16 23:13:28 +03005536 XGI_UpdateModeInfo(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005537
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005538 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinenb053af12013-07-16 23:13:28 +03005539 XGI_LockCRT2(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005540
5541 return 1;
5542}