blob: c8561a0b386d50eca565b66d5f236b19f23c2d38 [file] [log] [blame]
Aaro Koskinend80aaa02011-02-17 23:29:14 +02001#include <linux/delay.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_util.h"
6#include "vb_table.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02007#include "vb_setmode.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#define IndexMask 0xff
Peter Huewe95072592012-06-14 00:21:48 +020010#define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
Aaro Koskinen624554d2011-10-11 21:47:35 +030012static const unsigned short XGINew_VGA_DAC[] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040013 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020023
Bill Pemberton80adad82010-06-17 13:10:51 -040024void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020025{
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030026 pVBInfo->StandTable = &XGI330_StandTable;
27 pVBInfo->EModeIDTable = XGI330_EModeIDTable;
28 pVBInfo->RefIndex = XGI330_RefIndex;
29 pVBInfo->XGINEWUB_CRT1Table = XGI_CRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020030
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030031 pVBInfo->MCLKData = XGI340New_MCLKData;
32 pVBInfo->ECLKData = XGI340_ECLKData;
33 pVBInfo->VCLKData = XGI_VCLKData;
Aaro Koskinene8cb03d2012-09-11 00:15:31 +030034 pVBInfo->VBVCLKData = XGI_VBVCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053035 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030036 pVBInfo->StResInfo = XGI330_StResInfo;
37 pVBInfo->ModeResInfo = XGI330_ModeResInfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020038
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053039 pVBInfo->LCDResInfo = 0;
40 pVBInfo->LCDTypeInfo = 0;
41 pVBInfo->LCDInfo = 0;
42 pVBInfo->VBInfo = 0;
43 pVBInfo->TVInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020044
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053045 pVBInfo->SR15 = XGI340_SR13;
46 pVBInfo->CR40 = XGI340_cr41;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053047 pVBInfo->CR6B = XGI340_CR6B;
48 pVBInfo->CR6E = XGI340_CR6E;
49 pVBInfo->CR6F = XGI340_CR6F;
50 pVBInfo->CR89 = XGI340_CR89;
51 pVBInfo->AGPReg = XGI340_AGPReg;
52 pVBInfo->SR16 = XGI340_SR16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020053
Peter Huewe6d12dae2012-06-14 00:21:52 +020054 pVBInfo->SR21 = 0xa3;
55 pVBInfo->SR22 = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020056
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030057 pVBInfo->TimingH = XGI_TimingH;
58 pVBInfo->TimingV = XGI_TimingV;
59 pVBInfo->UpdateCRT1 = XGI_UpdateCRT1Table;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020060
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053061 /* 310 customization related */
Peter Huewe6896b942012-02-09 21:11:46 +010062 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053063 pVBInfo->LCDCapList = XGI_LCDDLCapList;
64 else
65 pVBInfo->LCDCapList = XGI_LCDCapList;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020066
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053067 if (ChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +020068 pVBInfo->XGINew_CR97 = 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020069
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053070 if (ChipType == XG27) {
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040071 unsigned char temp;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +030072 pVBInfo->MCLKData = XGI27New_MCLKData;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053073 pVBInfo->CR40 = XGI27_cr41;
Peter Huewe6d12dae2012-06-14 00:21:52 +020074 pVBInfo->XGINew_CR97 = 0xc1;
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040075 pVBInfo->SR15 = XG27_SR13;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020076
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040077 /*Z11m DDR*/
78 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
79 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
80 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Peter Huewe6d12dae2012-06-14 00:21:52 +020081 pVBInfo->XGINew_CR97 = 0x80;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053082 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020083
84}
85
Kenji Toyama1d7f6562011-04-23 19:36:49 +080086static void XGI_SetSeqRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +080087 unsigned short ModeIdIndex,
88 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020089{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053090 unsigned char tempah, SRdata;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +053091 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020092
Aaro Koskinen34c13ee2012-04-07 01:14:01 +030093 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094
Aaro Koskinen8104e322011-03-13 12:26:22 +020095 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +030096 tempah = pVBInfo->StandTable->SR[0];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020097
Peter Huewea3d675c2012-02-09 21:11:47 +010098 i = XGI_SetCRT2ToLCDA;
99 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530100 tempah |= 0x01;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300101 } else if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
102 if (pVBInfo->VBInfo & SetInSlaveMode)
103 tempah |= 0x01;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530104 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200105
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530106 tempah |= 0x20; /* screen off */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200107 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200108
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530109 for (i = 02; i <= 04; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800110 /* Get SR2,3,4 from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300111 SRdata = pVBInfo->StandTable->SR[i - 1];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200112 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530113 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200114}
115
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200116static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800117 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200118{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530119 unsigned char CRTCdata;
120 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200121
Aaro Koskinen58839b02011-03-13 12:26:23 +0200122 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530123 CRTCdata &= 0x7f;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200124 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530126 for (i = 0; i <= 0x18; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800127 /* Get CRTC from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300128 CRTCdata = pVBInfo->StandTable->CRTC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200129 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530130 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200131}
132
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800133static void XGI_SetATTRegs(unsigned short ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800134 unsigned short ModeIdIndex,
135 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200136{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530137 unsigned char ARdata;
138 unsigned short i, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200139
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300140 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530142 for (i = 0; i <= 0x13; i++) {
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300143 ARdata = pVBInfo->StandTable->ATTR[i];
Miguel Gómez661a6382012-07-06 12:40:45 +0200144
145 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
146 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
147 ARdata = 0;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300148 } else if ((pVBInfo->VBInfo &
Miguel Gómez661a6382012-07-06 12:40:45 +0200149 (SetCRT2ToTV | SetCRT2ToLCD)) &&
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300150 (pVBInfo->VBInfo & SetInSlaveMode)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530151 ARdata = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530152 }
153 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200154
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200155 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200156 outb(i, pVBInfo->P3c0); /* set index */
157 outb(ARdata, pVBInfo->P3c0); /* set data */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530158 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200159
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200160 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200161 outb(0x14, pVBInfo->P3c0); /* set index */
162 outb(0x00, pVBInfo->P3c0); /* set data */
Aaro Koskinend8ad0a62011-03-13 12:26:18 +0200163 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200164 outb(0x20, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200165}
166
Aaro Koskinena1579612012-04-07 01:14:05 +0300167static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200168{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530169 unsigned char GRdata;
170 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200171
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530172 for (i = 0; i <= 0x08; i++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800173 /* Get GR from file */
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +0300174 GRdata = pVBInfo->StandTable->GRC[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200175 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530176 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530178 if (pVBInfo->ModeType > ModeVGA) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200179 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530180 GRdata &= 0xBF; /* 256 color disable */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200181 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530182 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200183}
184
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200185static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200186{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530187 unsigned short i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530189 for (i = 0x0A; i <= 0x0E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200190 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200191}
192
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200193static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200194{
195
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200196 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200197 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
198 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200199
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200200 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200201 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
202 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200203
Aaro Koskinendc505562011-03-13 12:26:26 +0200204 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530205 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206}
207
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200208static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530209 unsigned short ModeIdIndex,
210 unsigned short RefreshRateTableIndex, unsigned short *i,
211 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200212{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530213 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200214
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300215 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530216 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
217 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
218 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200219
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530220 if (pVBInfo->IF_DEF_LVDS == 0) {
221 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
222 tempax |= SupportRAMDAC2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530224 if (pVBInfo->VBType & VB_XGI301C)
225 tempax |= SupportCRT2in301C;
226 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800228 /* 301b */
Peter Huewea3d675c2012-02-09 21:11:47 +0100229 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530230 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200231
Miguel Gómez3b175622012-07-06 12:40:46 +0200232 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
233 pVBInfo->LCDResInfo != Panel_1280x960 &&
234 (pVBInfo->LCDInfo & LCDNonExpanding) &&
235 resinfo >= 9)
236 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530237 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200238
Peter Huewe599801f2012-02-09 21:11:45 +0100239 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300240 tempax |= SupportHiVision;
241 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
242 ((resinfo == 4) ||
243 (resinfo == 3 &&
244 (pVBInfo->SetFlag & TVSimuMode)) ||
245 (resinfo > 7)))
Miguel Gómez3b175622012-07-06 12:40:46 +0200246 return 0;
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300247 } else if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800248 SetCRT2ToSVIDEO |
249 SetCRT2ToSCART |
Peter Huewe599801f2012-02-09 21:11:45 +0100250 SetCRT2ToYPbPr525750 |
251 SetCRT2ToHiVision)) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300252 tempax |= SupportTV;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200253
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300254 if (pVBInfo->VBType & (VB_SIS301B |
255 VB_SIS302B |
256 VB_SIS301LV |
257 VB_SIS302LV |
258 VB_XGI301C))
259 tempax |= SupportTV1024;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200260
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300261 if (!(pVBInfo->VBInfo & TVSetPAL) &&
262 (modeflag & NoSupportSimuTV) &&
263 (pVBInfo->VBInfo & SetInSlaveMode) &&
264 (!(pVBInfo->VBInfo & SetNotSimuMode)))
265 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530266 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300267 } else if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* for LVDS */
268 tempax |= SupportLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200269
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300270 if (resinfo > 0x08)
271 return 0; /* 1024x768 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200272
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300273 if (pVBInfo->LCDResInfo < Panel_1024x768) {
274 if (resinfo > 0x07)
275 return 0; /* 800x600 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200276
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300277 if (resinfo == 0x04)
278 return 0; /* 512x384 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530279 }
280 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200281
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800282 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
283 tempbx; (*i)--) {
284 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
285 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530286 if (infoflag & tempax)
287 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200288
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530289 if ((*i) == 0)
290 break;
291 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530293 for ((*i) = 0;; (*i)++) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800294 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
295 Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530296 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
297 != tempbx) {
298 return 0;
299 }
300
301 if (infoflag & tempax)
302 return 1;
303 }
304 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200305}
306
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200307static void XGI_SetSync(unsigned short RefreshRateTableIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530308 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200309{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530310 unsigned short sync, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200311
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800312 /* di+0x00 */
313 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530314 sync &= 0xC0;
315 temp = 0x2F;
316 temp |= sync;
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +0200317 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200318}
319
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200320static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530321 struct xgi_hw_device_info *HwDeviceExtension)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200322{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530323 unsigned char data, data1, pushax;
324 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200325
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800326 /* unlock cr0-7 */
327 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530328 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200329 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200330
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530331 data = pVBInfo->TimingH[0].data[0];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200332 xgifb_reg_set(pVBInfo->P3d4, 0, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530334 for (i = 0x01; i <= 0x04; i++) {
335 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200336 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530337 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200338
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530339 for (i = 0x05; i <= 0x06; i++) {
340 data = pVBInfo->TimingH[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200341 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530342 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200343
Aaro Koskinen58839b02011-03-13 12:26:23 +0200344 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530345 j &= 0x1F;
346 data = pVBInfo->TimingH[0].data[7];
347 data &= 0xE0;
348 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200349 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200350
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530351 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200352 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530353 data = data - 1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200354 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200355 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530356 data1 = data;
357 data1 &= 0xE0;
358 data &= 0x1F;
359 if (data == 0) {
360 pushax = data;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200361 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530362 0x0c);
363 data &= 0xFB;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200364 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530365 data = pushax;
366 }
367 data = data - 1;
368 data |= data1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200369 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200370 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530371 data = data >> 5;
372 data = data + 3;
373 if (data > 7)
374 data = data - 7;
375 data = data << 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200376 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530377 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200378}
379
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800380static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
381 unsigned short ModeNo,
382 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200383{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530384 unsigned char data;
385 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200386
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530387 for (i = 0x00; i <= 0x01; i++) {
388 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200389 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530390 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200391
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530392 for (i = 0x02; i <= 0x03; i++) {
393 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200394 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530395 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530397 for (i = 0x04; i <= 0x05; i++) {
398 data = pVBInfo->TimingV[0].data[i];
Aaro Koskinen8104e322011-03-13 12:26:22 +0200399 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530400 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200401
Aaro Koskinen58839b02011-03-13 12:26:23 +0200402 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530403 j &= 0xC0;
404 data = pVBInfo->TimingV[0].data[6];
405 data &= 0x3F;
406 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200407 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530409 data = pVBInfo->TimingV[0].data[6];
410 data &= 0x80;
411 data = data >> 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200412
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300413 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530414 i &= DoubleScanMode;
415 if (i)
416 data |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200417
Aaro Koskinen58839b02011-03-13 12:26:23 +0200418 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530419 j &= 0x5F;
420 data |= j;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200421 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200422}
423
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200424static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
425 unsigned short RefreshRateTableIndex,
426 struct vb_device_info *pVBInfo,
427 struct xgi_hw_device_info *HwDeviceExtension)
428{
429 unsigned char index, data;
430 unsigned short i;
431
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800432 /* Get index */
433 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200434 index = index & IndexMask;
435
Aaro Koskinen58839b02011-03-13 12:26:23 +0200436 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200437 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200438 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200439
440 for (i = 0; i < 8; i++)
441 pVBInfo->TimingH[0].data[i]
442 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
443
444 for (i = 0; i < 7; i++)
445 pVBInfo->TimingV[0].data[i]
446 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
447
448 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
449
450 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
451
452 if (pVBInfo->ModeType > 0x03)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200453 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200454}
455
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200456/* --------------------------------------------------------------------- */
457/* Function : XGI_SetXG21CRTC */
458/* Input : Stand or enhance CRTC table */
459/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
460/* Description : Set LCD timing */
461/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200462static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530463 unsigned short RefreshRateTableIndex,
464 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200465{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300466 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530467 unsigned short Temp1, Temp2, Temp3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200468
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300469 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
470 /* Tempax: CR4 HRS */
471 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
472 Tempcx = Tempax; /* Tempcx: HRS */
473 /* SR2E[7:0]->HRS */
474 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200475
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300476 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
477 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
478 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
479 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
480 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800481
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300482 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
483 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200484
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300485 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
486 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
487 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
488 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200489
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300490 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
491 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200492
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300493 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
494 if (Tempax < Tempcx) /* HRE < HRS */
495 Temp2 |= 0x40; /* Temp2 + 0x40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200496
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300497 Temp2 &= 0xFF;
498 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
499 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
500 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
501 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
502 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
503 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
504 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200505
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300506 /* CR10 VRS */
507 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
508 Tempbx = Tempax; /* Tempbx: VRS */
509 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
510 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
511 /* CR7[2][7] VRE */
512 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
513 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
514 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
515 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
516 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
517 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200518
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300519 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
520 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
521 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
522 Tempax &= 0x80;
523 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
524 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
525 /* Tempax: SRA */
526 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
527 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
528 Temp2 = Tempax;
529 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
530 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200531
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300532 /* Tempax: CR11 VRE */
533 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
534 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
535 /* Tempbx: SRA */
536 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
537 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
538 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
539 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
540 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
541 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200542
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300543 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
544 if (Tempax < Temp3) /* VRE < VRS */
545 Temp2 |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200546
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300547 Temp2 &= 0xFF;
548 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
549 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
550 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
551 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
552 Tempbx = (unsigned char) Temp1;
553 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
554 Tempax &= 0x7F;
555 /* SR3F D[7:2]->VRE D[1:0]->VRS */
556 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200557}
558
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800559static void XGI_SetXG27CRTC(unsigned short ModeNo,
560 unsigned short ModeIdIndex,
561 unsigned short RefreshRateTableIndex,
562 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200563{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300564 unsigned short index, Tempax, Tempbx, Tempcx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200565
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300566 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
567 /* Tempax: CR4 HRS */
568 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
569 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
570 /* SR2E[7:0]->HRS */
571 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200572
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300573 /* SR0B */
574 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
575 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
576 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200577
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300578 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
579 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
580 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200581
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300582 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
583 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
584 Tempax <<= 3; /* Tempax[5]: HRE[5] */
585 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200586
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300587 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
588 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200589
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300590 /* Tempax: CR4 HRS */
591 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
592 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
593 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
594 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200595
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300596 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
597 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
598 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
599 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
600 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
601 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
602 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200603
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300604 /* CR10 VRS */
605 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
606 /* SR34[7:0]->VRS[7:0] */
607 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200608
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300609 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
610 /* CR7[7][2] VRS[9][8] */
611 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
612 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
613 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
614 Tempax >>= 2; /* Tempax[0]: VRS[8] */
615 /* SR35[0]: VRS[8] */
616 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
617 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
618 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
619 /* Tempax: SR0A */
620 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
621 Tempax &= 0x08; /* SR0A[3] VRS[10] */
622 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200623
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300624 /* Tempax: CR11 VRE */
625 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
626 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
627 /* Tempbx: SR0A */
628 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
629 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
630 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
631 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
632 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
633 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
634 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200635
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300636 if (Tempbx <= Tempcx) /* VRE <= VRS */
637 Tempbx |= 0x20; /* VRE + 0x20 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300639 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
640 Tempax = (Tempbx << 2) & 0xFF;
641 /* SR3F[7:2]:VRE[5:0] */
642 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
643 Tempax = Tempcx >> 8;
644 /* SR35[2:0]:VRS[10:8] */
645 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200646}
647
Aaro Koskinena2d08cf2011-11-27 23:03:08 +0200648static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
649{
650 unsigned char temp;
651
652 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
653 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
654 temp = (temp & 3) << 6;
655 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
656 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
657 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
658 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
659
660}
661
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300662static void xgifb_set_lcd(int chip_id,
663 struct vb_device_info *pVBInfo,
664 unsigned short RefreshRateTableIndex,
665 unsigned short ModeNo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200666{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300667 unsigned short Data, Temp;
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400668 unsigned short XGI_P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200669
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530670 XGI_P3cc = pVBInfo->P3cc;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200671
Aaro Koskinen8104e322011-03-13 12:26:22 +0200672 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
673 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
674 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
675 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300676
677 if (chip_id == XG27) {
678 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
679 if ((Temp & 0x03) == 0) { /* dual 12 */
680 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
681 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
682 }
683 }
684
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300685 if (chip_id == XG27) {
686 XGI_SetXG27FPBits(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530687 } else {
Aaro Koskinen105d8d02011-08-31 21:46:00 +0300688 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
689 if (Temp & 0x01) {
690 /* 18 bits FP */
691 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
692 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
693 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530694 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200695
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200696 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200697
Aaro Koskinendc505562011-03-13 12:26:26 +0200698 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
699 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200700
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300701 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
702 if (Data & 0x4000)
703 /* Hsync polarity */
704 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
705 if (Data & 0x8000)
706 /* Vsync polarity */
707 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200708}
709
710/* --------------------------------------------------------------------- */
711/* Function : XGI_UpdateXG21CRTC */
712/* Input : */
713/* Output : CRT1 CRTC */
714/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
715/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800716static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
717 struct vb_device_info *pVBInfo,
718 unsigned short RefreshRateTableIndex)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200719{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300720 int index = -1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200721
Aaro Koskinendc505562011-03-13 12:26:26 +0200722 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300723 if (ModeNo == 0x2E &&
724 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
725 RES640x480x60))
726 index = 12;
727 else if (ModeNo == 0x2E && (pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800728 Ext_CRT1CRTC == RES640x480x72))
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300729 index = 13;
730 else if (ModeNo == 0x2F)
731 index = 14;
732 else if (ModeNo == 0x50)
733 index = 15;
734 else if (ModeNo == 0x59)
735 index = 16;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200736
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530737 if (index != -1) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200738 xgifb_reg_set(pVBInfo->P3d4, 0x02,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530739 pVBInfo->UpdateCRT1[index].CR02);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200740 xgifb_reg_set(pVBInfo->P3d4, 0x03,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530741 pVBInfo->UpdateCRT1[index].CR03);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200742 xgifb_reg_set(pVBInfo->P3d4, 0x15,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530743 pVBInfo->UpdateCRT1[index].CR15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200744 xgifb_reg_set(pVBInfo->P3d4, 0x16,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530745 pVBInfo->UpdateCRT1[index].CR16);
746 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200747}
748
Aaro Koskinen063b9c42011-03-08 22:16:13 +0200749static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530750 unsigned short ModeNo, unsigned short ModeIdIndex,
751 unsigned short RefreshRateTableIndex,
752 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200753{
Bill Pemberton82d6eb52010-06-17 13:10:46 -0400754 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200755
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530756 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200757
Aaro Koskinen6c0965f2012-04-07 01:14:11 +0300758 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200759
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300760 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
761 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
762 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530764 if (modeflag & HalfDCLK)
765 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200766
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300767 if (modeflag & HalfDCLK)
768 tempax = tempax << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200769
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300770 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200771
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300772 if (temp & InterlaceMode)
773 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200774
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300775 if (modeflag & DoubleScanMode)
776 tempbx = tempbx << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200777
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530778 tempcx = 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200779
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530780 tempax /= tempcx;
781 tempax -= 1;
782 tempbx -= 1;
783 tempcx = tempax;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200784 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
785 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530786 data &= 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200787 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
788 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200789 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530790 (unsigned short) ((tempcx & 0x0ff00) >> 10));
Aaro Koskinen8104e322011-03-13 12:26:22 +0200791 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530792 tempax = 0;
793 tempbx = tempbx >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200794
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530795 if (tempbx & 0x01)
796 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200797
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530798 if (tempbx & 0x02)
799 tempax |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200800
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200801 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200802 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530803 data &= 0xFF;
804 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200805
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530806 if (tempbx & 0x04)
807 tempax |= 0x02;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200808
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200809 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200810 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200811}
812
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800813static void XGI_SetCRT1Offset(unsigned short ModeNo,
814 unsigned short ModeIdIndex,
815 unsigned short RefreshRateTableIndex,
816 struct xgi_hw_device_info *HwDeviceExtension,
817 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200818{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530819 unsigned short temp, ah, al, temp2, i, DisplayUnit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530821 /* GetOffset */
822 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
823 temp = temp >> 8;
824 temp = pVBInfo->ScreenOffset[temp];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530826 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
827 temp2 &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530829 if (temp2)
830 temp = temp << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200831
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530832 temp2 = pVBInfo->ModeType - ModeEGA;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200833
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530834 switch (temp2) {
835 case 0:
836 temp2 = 1;
837 break;
838 case 1:
839 temp2 = 2;
840 break;
841 case 2:
842 temp2 = 4;
843 break;
844 case 3:
845 temp2 = 4;
846 break;
847 case 4:
848 temp2 = 6;
849 break;
850 case 5:
851 temp2 = 8;
852 break;
853 default:
854 break;
855 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530857 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
858 temp = temp * temp2 + temp2 / 2;
859 else
860 temp *= temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200861
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530862 /* SetOffset */
863 DisplayUnit = temp;
864 temp2 = temp;
865 temp = temp >> 8; /* ah */
866 temp &= 0x0F;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200867 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530868 i &= 0xF0;
869 i |= temp;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200870 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200871
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530872 temp = (unsigned char) temp2;
873 temp &= 0xFF; /* al */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200874 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530876 /* SetDisplayUnit */
877 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
878 temp2 &= InterlaceMode;
879 if (temp2)
880 DisplayUnit >>= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200881
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530882 DisplayUnit = DisplayUnit << 5;
883 ah = (DisplayUnit & 0xff00) >> 8;
884 al = DisplayUnit & 0x00ff;
885 if (al == 0)
886 ah += 1;
887 else
888 ah += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200889
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530890 if (HwDeviceExtension->jChipType >= XG20)
891 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
892 ah -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200893
Aaro Koskinen8104e322011-03-13 12:26:22 +0200894 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200895}
896
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200897static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
898 unsigned short ModeIdIndex,
899 unsigned short RefreshRateTableIndex,
900 struct xgi_hw_device_info *HwDeviceExtension,
901 struct vb_device_info *pVBInfo)
902{
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200903 unsigned short CRT2Index, VCLKIndex;
904 unsigned short modeflag, resinfo;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200905
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300906 /* si+Ext_ResInfo */
907 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
908 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
909 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200910
911 if (pVBInfo->IF_DEF_LVDS == 0) {
912 CRT2Index = CRT2Index >> 6; /* for LCD */
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200913 if (pVBInfo->VBInfo &
914 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
Peter Huewe255aabd2012-02-09 21:11:44 +0100915 if (pVBInfo->LCDResInfo != Panel_1024x768)
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200916 /* LCDXlat2VCLK */
917 VCLKIndex = VCLK108_2_315 + 5;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200918 else
Peter Huewef477d3e2012-06-14 00:21:47 +0200919 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
Peter Huewe599801f2012-02-09 21:11:45 +0100920 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200921 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200922 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200923 else
Peter Huewe95072592012-06-14 00:21:48 +0200924 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200925
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200926 if (pVBInfo->SetFlag & TVSimuMode) {
927 if (modeflag & Charx8Dot) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200928 VCLKIndex = TVCLKBASE_315_25 +
929 HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200930 } else {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200931 VCLKIndex = TVCLKBASE_315_25 +
932 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200933 }
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200934 }
935
936 /* 301lv */
Aaro Koskinen31fb40f2012-09-11 00:15:15 +0300937 if (pVBInfo->VBType & VB_SIS301LV) {
938 if (pVBInfo->SetFlag & RPLLDIV2XO)
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200939 VCLKIndex = YPbPr525iVCLK_2;
940 else
941 VCLKIndex = YPbPr525iVCLK;
942 }
943 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200944 if (pVBInfo->SetFlag & RPLLDIV2XO)
Peter Huewe95072592012-06-14 00:21:48 +0200945 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
Miguel Gómez3bcc2462012-07-06 12:40:53 +0200946 else
Peter Huewe95072592012-06-14 00:21:48 +0200947 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
Aaro Koskinen798b4da2011-11-27 23:03:20 +0200948 } else { /* for CRT2 */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300949 /* di+Ext_CRTVCLK */
950 VCLKIndex = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800951 Ext_CRTVCLK;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +0300952 VCLKIndex &= IndexMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200953 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +0300954 } else if ((pVBInfo->LCDResInfo == Panel_800x600) ||
955 (pVBInfo->LCDResInfo == Panel_320x480)) { /* LVDS */
956 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
957 } else {
958 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK, LVDSXlat3VCLK */
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200959 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +0200960
961 return VCLKIndex;
962}
963
Kenji Toyama1d7f6562011-04-23 19:36:49 +0800964static void XGI_SetCRT1VCLK(unsigned short ModeNo,
965 unsigned short ModeIdIndex,
966 struct xgi_hw_device_info *HwDeviceExtension,
967 unsigned short RefreshRateTableIndex,
968 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200969{
Bill Pemberton108afbf2010-06-17 13:10:47 -0400970 unsigned char index, data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530971 unsigned short vclkindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200972
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530973 if (pVBInfo->IF_DEF_LVDS == 1) {
974 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200975 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200976 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
977 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530978 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200979 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530980 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200981 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Peter Huewe6896b942012-02-09 21:11:46 +0100982 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
983 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +0100984 & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530985 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
986 RefreshRateTableIndex, HwDeviceExtension,
987 pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200988 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200989 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530990 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200991 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530992 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200993 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
994 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +0530995 } else {
996 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200997 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200998 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
999 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301000 pVBInfo->VCLKData[index].SR2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001001 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301002 pVBInfo->VCLKData[index].SR2C);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001003 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301004 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301006 if (HwDeviceExtension->jChipType >= XG20) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001007 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1008 HalfDCLK) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001009 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001010 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001011 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301012 index = data;
1013 index &= 0xE0;
1014 data &= 0x1F;
1015 data = data << 1;
1016 data += 1;
1017 data |= index;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001018 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301019 }
1020 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001021}
1022
Aaro Koskinene85f2032011-11-27 23:03:07 +02001023static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
1024{
1025 unsigned char temp;
1026
1027 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1028 temp = (temp & 1) << 6;
1029 /* SR06[6] 18bit Dither */
1030 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1031 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1032 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1033
1034}
1035
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001036static void XGI_SetCRT1FIFO(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301037 struct xgi_hw_device_info *HwDeviceExtension,
1038 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001039{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301040 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001041
Aaro Koskinen58839b02011-03-13 12:26:23 +02001042 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301043 data &= 0xfe;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001044 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001045
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001046 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1047 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1048 data &= 0xC0;
1049 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1050 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1051 data |= 0x01;
1052 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001053
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301054 if (HwDeviceExtension->jChipType == XG21)
1055 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001056}
1057
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001058static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1059 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1060 struct vb_device_info *pVBInfo)
1061{
1062 unsigned short data, data2 = 0;
1063 short VCLK;
1064
1065 unsigned char index;
1066
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001067 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1068 index &= IndexMask;
1069 VCLK = pVBInfo->VCLKData[index].CLOCK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001070
Aaro Koskinen58839b02011-03-13 12:26:23 +02001071 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001072 data &= 0xf3;
1073 if (VCLK >= 200)
1074 data |= 0x0c; /* VCLK > 200 */
1075
1076 if (HwDeviceExtension->jChipType >= XG20)
1077 data &= ~0x04; /* 2 pixel mode */
1078
Aaro Koskinen8104e322011-03-13 12:26:22 +02001079 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001080
1081 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001082 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001083 data &= 0xE7;
1084 if (VCLK < 200)
1085 data |= 0x10;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001086 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001087 }
1088
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001089 data2 = 0x00;
1090
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001091 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001092 if (HwDeviceExtension->jChipType >= XG27)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001093 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001094
1095}
1096
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001097static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301098 unsigned short ModeNo, unsigned short ModeIdIndex,
1099 unsigned short RefreshRateTableIndex,
1100 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001101{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301102 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1103 xres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001104
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001105 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1106 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107
Aaro Koskinen58839b02011-03-13 12:26:23 +02001108 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001109 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001110
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001111 data = infoflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301112 data2 = 0;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001113 data2 |= 0x02;
1114 data3 = pVBInfo->ModeType - ModeVGA;
1115 data3 = data3 << 2;
1116 data2 |= data3;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301117 data &= InterlaceMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001118
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301119 if (data)
1120 data2 |= 0x20;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001121
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001122 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03001123 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001124 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001125
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301126 data = 0x0000;
1127 if (infoflag & InterlaceMode) {
1128 if (xres == 1024)
1129 data = 0x0035;
1130 else if (xres == 1280)
1131 data = 0x0048;
1132 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001133
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301134 data2 = data & 0x00FF;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001135 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301136 data2 = (data & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001137 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301139 if (modeflag & HalfDCLK)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001140 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001141
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301142 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001143
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301144 if (modeflag & LineCompareOff)
1145 data2 |= 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001146
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001147 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301148 data = 0x60;
Aaro Koskinen969f7f32012-04-07 01:14:03 +03001149 data = data ^ 0x60;
1150 data = data ^ 0xA0;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001151 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001152
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301153 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1154 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001155
Aaro Koskinen58839b02011-03-13 12:26:23 +02001156 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301158 if (HwDeviceExtension->jChipType == XG27) {
1159 if (data & 0x40)
1160 data = 0x2c;
1161 else
1162 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001163 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001164 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301165 } else if (HwDeviceExtension->jChipType >= XG20) {
1166 if (data & 0x40)
1167 data = 0x33;
1168 else
1169 data = 0x73;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001170 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1171 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301172 } else {
1173 if (data & 0x40)
1174 data = 0x2c;
1175 else
1176 data = 0x6c;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001177 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301178 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001179
1180}
1181
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001182static void XGI_WriteDAC(unsigned short dl,
1183 unsigned short ah,
1184 unsigned short al,
1185 unsigned short dh,
1186 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001187{
1188 unsigned short temp, bh, bl;
1189
1190 bh = ah;
1191 bl = al;
1192
1193 if (dl != 0) {
1194 temp = bh;
1195 bh = dh;
1196 dh = temp;
1197 if (dl == 1) {
1198 temp = bl;
1199 bl = dh;
1200 dh = temp;
1201 } else {
1202 temp = bl;
1203 bl = bh;
1204 bh = temp;
1205 }
1206 }
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001207 outb((unsigned short) dh, pVBInfo->P3c9);
1208 outb((unsigned short) bh, pVBInfo->P3c9);
1209 outb((unsigned short) bl, pVBInfo->P3c9);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001210}
1211
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001212static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301213 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001214{
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001215 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1216 const unsigned short *table = XGINew_VGA_DAC;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001217
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001218 outb(0xFF, pVBInfo->P3c6);
1219 outb(0x00, pVBInfo->P3c8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001220
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001221 for (i = 0; i < 16; i++) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301222 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301224 for (k = 0; k < 3; k++) {
1225 data2 = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001226
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301227 if (data & 0x01)
1228 data2 = 0x2A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301230 if (data & 0x02)
1231 data2 += 0x15;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001232
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001233 outb(data2, pVBInfo->P3c9);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301234 data = data >> 2;
1235 }
1236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001237
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001238 for (i = 16; i < 32; i++) {
1239 data = table[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001240
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001241 for (k = 0; k < 3; k++)
1242 outb(data, pVBInfo->P3c9);
1243 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001244
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001245 si = 32;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001246
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001247 for (m = 0; m < 9; m++) {
1248 di = si;
1249 bx = si + 0x04;
1250 dl = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001251
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001252 for (n = 0; n < 3; n++) {
1253 for (o = 0; o < 5; o++) {
1254 dh = table[si];
1255 ah = table[di];
1256 al = table[bx];
1257 si++;
1258 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301259 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001260
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001261 si -= 2;
1262
1263 for (o = 0; o < 3; o++) {
1264 dh = table[bx];
1265 ah = table[di];
1266 al = table[si];
1267 si--;
1268 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1269 }
1270
1271 dl++;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301272 }
Aaro Koskinen1bb52cc2012-04-07 01:14:06 +03001273
1274 si += 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301275 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001276}
1277
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001278static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1279 unsigned short ModeIdIndex,
1280 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001281{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301282 unsigned short resindex, xres, yres, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001283
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001284 /* si+Ext_ResInfo */
1285 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001286
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001287 /* si+Ext_ResInfo */
1288 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001289
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001290 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1291 yres = pVBInfo->ModeResInfo[resindex].VTotal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001292
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001293 if (modeflag & HalfDCLK)
1294 xres = xres << 1;
1295
1296 if (modeflag & DoubleScanMode)
1297 yres = yres << 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001298
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301299 if (xres == 720)
1300 xres = 640;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301302 pVBInfo->VGAHDE = xres;
1303 pVBInfo->HDE = xres;
1304 pVBInfo->VGAVDE = yres;
1305 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001306}
1307
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001308static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1309 unsigned short ModeIdIndex,
1310 unsigned short RefreshRateTableIndex,
1311 struct vb_device_info *pVBInfo)
1312{
Aaro Koskinen898df162012-09-11 00:15:25 +03001313 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001314
1315 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1316
1317 tempbx = BX;
1318
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001319 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1320 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001321
1322 tempal = tempal & 0x0f;
1323
1324 if (tempbx <= 1) { /* ExpLink */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001325 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001326
Peter Huewea3d675c2012-02-09 21:11:47 +01001327 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001328 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001329 Ext_CRT2CRTC2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001330 }
1331
1332 if (tempbx & 0x01)
1333 tempal = (tempal >> 4);
1334
1335 tempal = (tempal & 0x0f);
1336 }
1337
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001338 switch (tempbx) {
1339 case 0:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001340 case 1:
Aaro Koskinencc5c2ae2011-08-31 21:46:08 +03001341 tempdi = xgifb_epllcd_crt1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001342 break;
1343 case 2:
1344 tempdi = XGI_EPLLCDDataPtr;
1345 break;
1346 case 3:
1347 tempdi = XGI_EPLLCDDesDataPtr;
1348 break;
1349 case 4:
1350 tempdi = XGI_LCDDataTable;
1351 break;
1352 case 5:
1353 tempdi = XGI_LCDDesDataTable;
1354 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001355 default:
1356 break;
1357 }
1358
1359 if (tempdi == NULL) /* OEMUtil */
1360 return NULL;
1361
1362 table = tempbx;
1363 i = 0;
1364
1365 while (tempdi[i].PANELID != 0xff) {
1366 tempdx = pVBInfo->LCDResInfo;
1367 if (tempbx & 0x0080) { /* OEMUtil */
1368 tempbx &= (~0x0080);
1369 tempdx = pVBInfo->LCDTypeInfo;
1370 }
1371
1372 if (pVBInfo->LCDInfo & EnableScalingLCD)
1373 tempdx &= (~PanelResInfo);
1374
1375 if (tempdi[i].PANELID == tempdx) {
1376 tempbx = tempdi[i].MASK;
1377 tempdx = pVBInfo->LCDInfo;
1378
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001379 if (modeflag & HalfDCLK)
1380 tempdx |= SetLCDLowResolution;
1381
1382 tempbx &= tempdx;
1383 if (tempbx == tempdi[i].CAP)
1384 break;
1385 }
1386 i++;
1387 }
1388
1389 if (table == 0) {
1390 switch (tempdi[i].DATAPTR) {
1391 case 0:
1392 return &XGI_LVDSCRT11024x768_1_H[tempal];
1393 break;
1394 case 1:
1395 return &XGI_LVDSCRT11024x768_2_H[tempal];
1396 break;
1397 case 2:
1398 return &XGI_LVDSCRT11280x1024_1_H[tempal];
1399 break;
1400 case 3:
1401 return &XGI_LVDSCRT11280x1024_2_H[tempal];
1402 break;
1403 case 4:
1404 return &XGI_LVDSCRT11400x1050_1_H[tempal];
1405 break;
1406 case 5:
1407 return &XGI_LVDSCRT11400x1050_2_H[tempal];
1408 break;
1409 case 6:
1410 return &XGI_LVDSCRT11600x1200_1_H[tempal];
1411 break;
1412 case 7:
1413 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
1414 break;
1415 case 8:
1416 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
1417 break;
1418 case 9:
1419 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
1420 break;
1421 case 10:
1422 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
1423 break;
1424 default:
1425 break;
1426 }
1427 } else if (table == 1) {
1428 switch (tempdi[i].DATAPTR) {
1429 case 0:
1430 return &XGI_LVDSCRT11024x768_1_V[tempal];
1431 break;
1432 case 1:
1433 return &XGI_LVDSCRT11024x768_2_V[tempal];
1434 break;
1435 case 2:
1436 return &XGI_LVDSCRT11280x1024_1_V[tempal];
1437 break;
1438 case 3:
1439 return &XGI_LVDSCRT11280x1024_2_V[tempal];
1440 break;
1441 case 4:
1442 return &XGI_LVDSCRT11400x1050_1_V[tempal];
1443 break;
1444 case 5:
1445 return &XGI_LVDSCRT11400x1050_2_V[tempal];
1446 break;
1447 case 6:
1448 return &XGI_LVDSCRT11600x1200_1_V[tempal];
1449 break;
1450 case 7:
1451 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
1452 break;
1453 case 8:
1454 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
1455 break;
1456 case 9:
1457 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
1458 break;
1459 case 10:
1460 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
1461 break;
1462 default:
1463 break;
1464 }
1465 } else if (table == 2) {
1466 switch (tempdi[i].DATAPTR) {
1467 case 0:
1468 return &XGI_LVDS1024x768Data_1[tempal];
1469 break;
1470 case 1:
1471 return &XGI_LVDS1024x768Data_2[tempal];
1472 break;
1473 case 2:
1474 return &XGI_LVDS1280x1024Data_1[tempal];
1475 break;
1476 case 3:
1477 return &XGI_LVDS1280x1024Data_2[tempal];
1478 break;
1479 case 4:
1480 return &XGI_LVDS1400x1050Data_1[tempal];
1481 break;
1482 case 5:
1483 return &XGI_LVDS1400x1050Data_2[tempal];
1484 break;
1485 case 6:
1486 return &XGI_LVDS1600x1200Data_1[tempal];
1487 break;
1488 case 7:
1489 return &XGI_LVDSNoScalingData[tempal];
1490 break;
1491 case 8:
1492 return &XGI_LVDS1024x768Data_1x75[tempal];
1493 break;
1494 case 9:
1495 return &XGI_LVDS1024x768Data_2x75[tempal];
1496 break;
1497 case 10:
1498 return &XGI_LVDS1280x1024Data_1x75[tempal];
1499 break;
1500 case 11:
1501 return &XGI_LVDS1280x1024Data_2x75[tempal];
1502 break;
1503 case 12:
1504 return &XGI_LVDSNoScalingDatax75[tempal];
1505 break;
1506 default:
1507 break;
1508 }
1509 } else if (table == 3) {
1510 switch (tempdi[i].DATAPTR) {
1511 case 0:
1512 return &XGI_LVDS1024x768Des_1[tempal];
1513 break;
1514 case 1:
1515 return &XGI_LVDS1024x768Des_3[tempal];
1516 break;
1517 case 2:
1518 return &XGI_LVDS1024x768Des_2[tempal];
1519 break;
1520 case 3:
1521 return &XGI_LVDS1280x1024Des_1[tempal];
1522 break;
1523 case 4:
1524 return &XGI_LVDS1280x1024Des_2[tempal];
1525 break;
1526 case 5:
1527 return &XGI_LVDS1400x1050Des_1[tempal];
1528 break;
1529 case 6:
1530 return &XGI_LVDS1400x1050Des_2[tempal];
1531 break;
1532 case 7:
1533 return &XGI_LVDS1600x1200Des_1[tempal];
1534 break;
1535 case 8:
1536 return &XGI_LVDSNoScalingDesData[tempal];
1537 break;
1538 case 9:
1539 return &XGI_LVDS1024x768Des_1x75[tempal];
1540 break;
1541 case 10:
1542 return &XGI_LVDS1024x768Des_3x75[tempal];
1543 break;
1544 case 11:
1545 return &XGI_LVDS1024x768Des_2x75[tempal];
1546 break;
1547 case 12:
1548 return &XGI_LVDS1280x1024Des_1x75[tempal];
1549 break;
1550 case 13:
1551 return &XGI_LVDS1280x1024Des_2x75[tempal];
1552 break;
1553 case 14:
1554 return &XGI_LVDSNoScalingDesDatax75[tempal];
1555 break;
1556 default:
1557 break;
1558 }
1559 } else if (table == 4) {
1560 switch (tempdi[i].DATAPTR) {
1561 case 0:
1562 return &XGI_ExtLCD1024x768Data[tempal];
1563 break;
1564 case 1:
1565 return &XGI_StLCD1024x768Data[tempal];
1566 break;
1567 case 2:
1568 return &XGI_CetLCD1024x768Data[tempal];
1569 break;
1570 case 3:
1571 return &XGI_ExtLCD1280x1024Data[tempal];
1572 break;
1573 case 4:
1574 return &XGI_StLCD1280x1024Data[tempal];
1575 break;
1576 case 5:
1577 return &XGI_CetLCD1280x1024Data[tempal];
1578 break;
1579 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001580 case 7:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001581 return &xgifb_lcd_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001582 break;
1583 case 8:
1584 return &XGI_CetLCD1400x1050Data[tempal];
1585 break;
1586 case 9:
1587 return &XGI_ExtLCD1600x1200Data[tempal];
1588 break;
1589 case 10:
1590 return &XGI_StLCD1600x1200Data[tempal];
1591 break;
1592 case 11:
1593 return &XGI_NoScalingData[tempal];
1594 break;
1595 case 12:
1596 return &XGI_ExtLCD1024x768x75Data[tempal];
1597 break;
1598 case 13:
1599 return &XGI_ExtLCD1024x768x75Data[tempal];
1600 break;
1601 case 14:
1602 return &XGI_CetLCD1024x768x75Data[tempal];
1603 break;
1604 case 15:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001605 case 16:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001606 return &xgifb_lcd_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001607 break;
1608 case 17:
1609 return &XGI_CetLCD1280x1024x75Data[tempal];
1610 break;
1611 case 18:
1612 return &XGI_NoScalingDatax75[tempal];
1613 break;
1614 default:
1615 break;
1616 }
1617 } else if (table == 5) {
1618 switch (tempdi[i].DATAPTR) {
1619 case 0:
1620 return &XGI_ExtLCDDes1024x768Data[tempal];
1621 break;
1622 case 1:
1623 return &XGI_StLCDDes1024x768Data[tempal];
1624 break;
1625 case 2:
1626 return &XGI_CetLCDDes1024x768Data[tempal];
1627 break;
1628 case 3:
Peter Huewe6896b942012-02-09 21:11:46 +01001629 if ((pVBInfo->VBType & VB_SIS301LV) ||
1630 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001631 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
1632 else
1633 return &XGI_ExtLCDDes1280x1024Data[tempal];
1634 break;
1635 case 4:
Peter Huewe6896b942012-02-09 21:11:46 +01001636 if ((pVBInfo->VBType & VB_SIS301LV) ||
1637 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001638 return &XGI_StLCDDLDes1280x1024Data[tempal];
1639 else
1640 return &XGI_StLCDDes1280x1024Data[tempal];
1641 break;
1642 case 5:
Peter Huewe6896b942012-02-09 21:11:46 +01001643 if ((pVBInfo->VBType & VB_SIS301LV) ||
1644 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001645 return &XGI_CetLCDDLDes1280x1024Data[tempal];
1646 else
1647 return &XGI_CetLCDDes1280x1024Data[tempal];
1648 break;
1649 case 6:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001650 case 7:
Peter Huewe6896b942012-02-09 21:11:46 +01001651 if ((pVBInfo->VBType & VB_SIS301LV) ||
1652 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001653 return &xgifb_lcddldes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001654 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001655 return &xgifb_lcddes_1400x1050[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001656 break;
1657 case 8:
1658 return &XGI_CetLCDDes1400x1050Data[tempal];
1659 break;
1660 case 9:
1661 return &XGI_CetLCDDes1400x1050Data2[tempal];
1662 break;
1663 case 10:
Peter Huewe6896b942012-02-09 21:11:46 +01001664 if ((pVBInfo->VBType & VB_SIS301LV) ||
1665 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001666 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
1667 else
1668 return &XGI_ExtLCDDes1600x1200Data[tempal];
1669 break;
1670 case 11:
Peter Huewe6896b942012-02-09 21:11:46 +01001671 if ((pVBInfo->VBType & VB_SIS301LV) ||
1672 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001673 return &XGI_StLCDDLDes1600x1200Data[tempal];
1674 else
1675 return &XGI_StLCDDes1600x1200Data[tempal];
1676 break;
1677 case 12:
1678 return &XGI_NoScalingDesData[tempal];
1679 break;
1680 case 13:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001681 case 14:
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001682 return &xgifb_lcddes_1024x768x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001683 break;
1684 case 15:
1685 return &XGI_CetLCDDes1024x768x75Data[tempal];
1686 break;
1687 case 16:
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001688 case 17:
Peter Huewe6896b942012-02-09 21:11:46 +01001689 if ((pVBInfo->VBType & VB_SIS301LV) ||
1690 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001691 return &xgifb_lcddldes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001692 else
Aaro Koskinenada2bda2011-08-31 21:46:07 +03001693 return &xgifb_lcddes_1280x1024x75[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001694 break;
1695 case 18:
Peter Huewe6896b942012-02-09 21:11:46 +01001696 if ((pVBInfo->VBType & VB_SIS301LV) ||
1697 (pVBInfo->VBType & VB_SIS302LV))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001698 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
1699 else
1700 return &XGI_CetLCDDes1280x1024x75Data[tempal];
1701 break;
1702 case 19:
1703 return &XGI_NoScalingDesDatax75[tempal];
1704 break;
1705 default:
1706 break;
1707 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001708 }
1709 return NULL;
1710}
1711
Aaro Koskinen24572542012-09-11 00:15:21 +03001712static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001713 unsigned short ModeIdIndex,
1714 unsigned short RefreshRateTableIndex,
1715 struct vb_device_info *pVBInfo)
1716{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001717 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001718
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001719 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1720 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001721 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001722 tempdx = pVBInfo->TVInfo;
1723
1724 if (pVBInfo->VBInfo & SetInSlaveMode)
1725 tempdx = tempdx | SetTVLockMode;
1726
1727 if (modeflag & HalfDCLK)
1728 tempdx = tempdx | SetTVLowResolution;
1729
1730 i = 0;
1731
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001732 while (XGI_TVDataTable[i].MASK != 0xffff) {
1733 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1734 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001735 break;
1736 i++;
1737 }
1738
Aaro Koskinen18ba8662012-09-11 00:15:22 +03001739 return &XGI_TVDataTable[i].DATAPTR[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001740}
1741
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001742static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301743 unsigned short RefreshRateTableIndex,
1744 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001745{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301746 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001747 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001748
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301749 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001750
Peter Huewea3d675c2012-02-09 21:11:47 +01001751 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001752 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1753 RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301754 pVBInfo->VGAHT = LCDPtr->VGAHT;
1755 pVBInfo->VGAVT = LCDPtr->VGAVT;
1756 pVBInfo->HT = LCDPtr->LCDHT;
1757 pVBInfo->VT = LCDPtr->LCDVT;
1758 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001759
Peter Huewea3d675c2012-02-09 21:11:47 +01001760 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301761 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1762 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001763 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1764 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301765 pVBInfo->HDE = 1024;
1766 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001767 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001768 (pVBInfo->LCDResInfo ==
1769 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301770 pVBInfo->HDE = 1280;
1771 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001772 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301773 pVBInfo->HDE = 1400;
1774 pVBInfo->VDE = 1050;
1775 } else {
1776 pVBInfo->HDE = 1600;
1777 pVBInfo->VDE = 1200;
1778 }
1779 }
1780 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001781}
1782
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001783static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301784 unsigned short RefreshRateTableIndex,
1785 struct xgi_hw_device_info *HwDeviceExtension,
1786 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001787{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301788 unsigned char index;
1789 unsigned short tempbx, i;
1790 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1791 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001792
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001793 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301794 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001795
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001796 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001797
Peter Huewea3d675c2012-02-09 21:11:47 +01001798 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001799 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1800 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001801
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001802 for (i = 0; i < 8; i++)
1803 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301804 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001805
1806 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1807
1808 tempbx = 1;
1809
Peter Huewea3d675c2012-02-09 21:11:47 +01001810 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001811 LCDPtr1 = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1812 RefreshRateTableIndex, pVBInfo);
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001813 for (i = 0; i < 7; i++)
1814 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1815 }
1816
1817 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001818}
1819
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001820static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1821{
1822 unsigned char tempal, tempah, tempbl, i;
1823
Aaro Koskinen58839b02011-03-13 12:26:23 +02001824 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001825 tempal = tempah & 0x0F;
1826 tempah = tempah & 0xF0;
1827 i = 0;
1828 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1829
1830 while (tempbl != 0xFF) {
1831 if (tempbl & 0x80) { /* OEMUtil */
1832 tempal = tempah;
1833 tempbl = tempbl & ~(0x80);
1834 }
1835
1836 if (tempal == tempbl)
1837 break;
1838
1839 i++;
1840
1841 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1842 }
1843
1844 return i;
1845}
1846
1847static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1848{
1849 unsigned short tempah, tempal, tempbl, i;
1850
1851 tempal = pVBInfo->LCDResInfo;
1852 tempah = pVBInfo->LCDTypeInfo;
1853
1854 i = 0;
1855 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1856
1857 while (tempbl != 0xFF) {
1858 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1859 tempal = tempah;
1860 tempbl &= ~0x80;
1861 }
1862
1863 if (tempal == tempbl)
1864 break;
1865
1866 i++;
1867 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1868 }
1869
1870 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001871 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001872 pVBInfo->LCDTypeInfo = 0;
1873 i = 0;
1874 }
1875
1876 return i;
1877}
1878
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001879static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1880 unsigned short *VSyncWidth,
1881 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001882{
1883 unsigned short Index;
1884
1885 Index = XGI_GetLCDCapPtr(pVBInfo);
1886 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1887 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1888
1889 return;
1890}
1891
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001892static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301893 unsigned short RefreshRateTableIndex,
1894 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001895{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301896 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1897 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03001898 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301899 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001900
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001901 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03001902 tempbx = 3;
1903 if (pVBInfo->LCDInfo & EnableScalingLCD)
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001904 LCDPtr1 = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1905 RefreshRateTableIndex, pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03001906 else
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001907 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1908 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001909
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001910 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1911 push1 = tempbx;
1912 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001913
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001914 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01001915 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1916 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001917 tempax = 1024;
1918 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001919 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1920 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001921 tempax = 1280;
1922 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001923 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001924 tempax = 1400;
1925 tempbx = 1050;
1926 } else {
1927 tempax = 1600;
1928 tempbx = 1200;
1929 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001930
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001931 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1932 pVBInfo->HDE = tempax;
1933 pVBInfo->VDE = tempbx;
1934 pVBInfo->VGAHDE = tempax;
1935 pVBInfo->VGAVDE = tempbx;
1936 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001937
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001938 tempax = pVBInfo->HT;
1939
1940 if (pVBInfo->LCDInfo & EnableScalingLCD)
1941 tempbx = LCDPtr1->LCDHDES;
1942 else
1943 tempbx = LCDPtr->LCDHDES;
1944
1945 tempcx = pVBInfo->HDE;
1946 tempbx = tempbx & 0x0fff;
1947 tempcx += tempbx;
1948
1949 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001950 tempcx -= tempax;
1951
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001952 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001953
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001954 tempcx = tempcx >> 3;
1955 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001956
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001957 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1958 (unsigned short) (tempbx & 0xff));
1959 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1960 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001961
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001962 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001963
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001964 if (pVBInfo->LCDInfo & EnableScalingLCD)
1965 tempbx = LCDPtr1->LCDHRS;
1966 else
1967 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001968
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001969 tempcx = push2;
1970
1971 if (pVBInfo->LCDInfo & EnableScalingLCD)
1972 tempcx = LCDPtr1->LCDHSync;
1973
1974 tempcx += tempbx;
1975
1976 if (tempcx >= tempax)
1977 tempcx -= tempax;
1978
1979 tempax = tempbx & 0x07;
1980 tempax = tempax >> 5;
1981 tempcx = tempcx >> 3;
1982 tempbx = tempbx >> 3;
1983
1984 tempcx &= 0x1f;
1985 tempax |= tempcx;
1986
1987 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
1988 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
1989 (unsigned short) (tempbx & 0xff));
1990
1991 tempax = pVBInfo->VT;
1992 if (pVBInfo->LCDInfo & EnableScalingLCD)
1993 tempbx = LCDPtr1->LCDVDES;
1994 else
1995 tempbx = LCDPtr->LCDVDES;
1996 tempcx = pVBInfo->VDE;
1997
1998 tempbx = tempbx & 0x0fff;
1999 tempcx += tempbx;
2000 if (tempcx >= tempax)
2001 tempcx -= tempax;
2002
2003 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2004 (unsigned short) (tempbx & 0xff));
2005 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2006 (unsigned short) (tempcx & 0xff));
2007
2008 tempbx = (tempbx >> 8) & 0x07;
2009 tempcx = (tempcx >> 8) & 0x07;
2010
2011 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2012 (unsigned short) ((tempcx << 3)
2013 | tempbx));
2014
2015 tempax = pVBInfo->VT;
2016 if (pVBInfo->LCDInfo & EnableScalingLCD)
2017 tempbx = LCDPtr1->LCDVRS;
2018 else
2019 tempbx = LCDPtr->LCDVRS;
2020
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002021 tempcx = push1;
2022
2023 if (pVBInfo->LCDInfo & EnableScalingLCD)
2024 tempcx = LCDPtr1->LCDVSync;
2025
2026 tempcx += tempbx;
2027 if (tempcx >= tempax)
2028 tempcx -= tempax;
2029
2030 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2031 (unsigned short) (tempbx & 0xff));
2032 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2033 (unsigned short) (tempcx & 0x0f));
2034
2035 tempax = ((tempbx >> 8) & 0x07) << 3;
2036
2037 tempbx = pVBInfo->VGAVDE;
2038 if (tempbx != pVBInfo->VDE)
2039 tempax |= 0x40;
2040
Peter Huewea3d675c2012-02-09 21:11:47 +01002041 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002042 tempax |= 0x40;
2043
2044 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2045 tempax);
2046
2047 tempcx = pVBInfo->VGAVT;
2048 tempbx = pVBInfo->VDE;
2049 tempax = pVBInfo->VGAVDE;
2050 tempcx -= tempax;
2051
2052 temp = tempax; /* 0430 ylshieh */
2053 temp1 = (temp << 18) / tempbx;
2054
2055 tempdx = (unsigned short) ((temp << 18) % tempbx);
2056
2057 if (tempdx != 0)
2058 temp1 += 1;
2059
2060 temp2 = temp1;
2061 push3 = temp2;
2062
2063 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
2064 (unsigned short) (temp2 & 0xff));
2065 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
2066 (unsigned short) ((temp2 >> 8) & 0xff));
2067
2068 tempbx = (unsigned short) (temp2 >> 16);
2069 tempax = tempbx & 0x03;
2070
2071 tempbx = pVBInfo->VGAVDE;
2072 if (tempbx == pVBInfo->VDE)
2073 tempax |= 0x04;
2074
2075 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
2076
2077 if (pVBInfo->VBType & VB_XGI301C) {
2078 temp2 = push3;
2079 xgifb_reg_set(pVBInfo->Part4Port,
2080 0x3c,
2081 (unsigned short) (temp2 & 0xff));
2082 xgifb_reg_set(pVBInfo->Part4Port,
2083 0x3b,
2084 (unsigned short) ((temp2 >> 8) &
2085 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002086 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002087 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
2088 ~0xc0,
2089 (unsigned short) ((tempbx &
2090 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03002091
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002092 tempcx = pVBInfo->VGAVDE;
2093 if (tempcx == pVBInfo->VDE)
2094 xgifb_reg_and_or(pVBInfo->Part4Port,
2095 0x30, ~0x0c, 0x00);
2096 else
2097 xgifb_reg_and_or(pVBInfo->Part4Port,
2098 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302099 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002100
2101 tempcx = pVBInfo->VGAHDE;
2102 tempbx = pVBInfo->HDE;
2103
2104 temp1 = tempcx << 16;
2105
2106 tempax = (unsigned short) (temp1 / tempbx);
2107
2108 if ((tempbx & 0xffff) == (tempcx & 0xffff))
2109 tempax = 65535;
2110
2111 temp3 = tempax;
2112 temp1 = pVBInfo->VGAHDE << 16;
2113
2114 temp1 /= temp3;
2115 temp3 = temp3 << 16;
2116 temp1 -= 1;
2117
2118 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
2119
2120 tempax = (unsigned short) (temp3 & 0xff);
2121 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
2122
2123 temp1 = pVBInfo->VGAVDE << 18;
2124 temp1 = temp1 / push3;
2125 tempbx = (unsigned short) (temp1 & 0xffff);
2126
Peter Huewe255aabd2012-02-09 21:11:44 +01002127 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002128 tempbx -= 1;
2129
2130 tempax = ((tempbx >> 8) & 0xff) << 3;
2131 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
2132 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
2133 (unsigned short) (tempax & 0xff));
2134 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
2135 (unsigned short) (tempbx & 0xff));
2136
2137 temp3 = temp3 >> 16;
2138
2139 if (modeflag & HalfDCLK)
2140 temp3 = temp3 >> 1;
2141
2142 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
2143 (unsigned short) ((temp3 >> 8) & 0xff));
2144 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
2145 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002146}
2147
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002148/* --------------------------------------------------------------------- */
2149/* Function : XGI_GETLCDVCLKPtr */
2150/* Input : */
2151/* Output : al -> VCLK Index */
2152/* Description : */
2153/* --------------------------------------------------------------------- */
2154static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
2155 struct vb_device_info *pVBInfo)
2156{
2157 unsigned short index;
2158
Peter Huewea3d675c2012-02-09 21:11:47 +01002159 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002160 index = XGI_GetLCDCapPtr1(pVBInfo);
2161
2162 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
2163 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
2164 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
2165 } else { /* LCDA */
2166 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
2167 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
2168 }
2169 }
2170 return;
2171}
2172
2173static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
2174 unsigned short ModeNo, unsigned short ModeIdIndex,
2175 struct vb_device_info *pVBInfo)
2176{
2177
2178 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002179 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002180
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002181 /* si+Ext_ResInfo */
2182 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002183
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002184 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
2185 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002186 index = XGI_GetLCDCapPtr(pVBInfo);
2187 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
2188
Peter Huewea3d675c2012-02-09 21:11:47 +01002189 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002190 return tempal;
2191
2192 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002193 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002194 (VB_SIS301B |
2195 VB_SIS302B |
2196 VB_SIS301LV |
2197 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002198 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01002199 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002200 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002201 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002202 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002203 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002204 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002205 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002206 tempal = TVCLKBASE_315 +
2207 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002208
2209 }
2210 return tempal;
2211 }
2212
Peter Huewe599801f2012-02-09 21:11:45 +01002213 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01002214 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002215 return tempal;
2216 }
2217
Peter Huewe599801f2012-02-09 21:11:45 +01002218 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002219 tempal = YPbPr525pVCLK;
2220 return tempal;
2221 }
2222
2223 tempal = NTSC1024VCLK;
2224
2225 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01002226 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002227 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01002228 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002229 }
2230
2231 if (pVBInfo->VBInfo & SetCRT2ToTV)
2232 return tempal;
2233 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002234 } /* {End of VB} */
2235
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002236 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002237 tempal = tempal >> 2;
2238 tempal &= 0x03;
2239
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002240 /* for Dot8 Scaling LCD */
2241 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002242 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
2243
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002244 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
2245 return tempal;
2246}
2247
2248static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
2249 unsigned char *di_1, struct vb_device_info *pVBInfo)
2250{
Peter Huewe6896b942012-02-09 21:11:46 +01002251 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
2252 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002253 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
2254 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinene8cb03d2012-09-11 00:15:31 +03002255 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03002256 *di_1 = XGI_VBVCLKData[tempal].Part4_B;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002257 }
2258 } else {
2259 *di_0 = XGI_VCLKData[tempal].SR2B;
2260 *di_1 = XGI_VCLKData[tempal].SR2C;
2261 }
2262}
2263
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002264static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302265 unsigned short RefreshRateTableIndex,
2266 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002267{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302268 unsigned char di_0, di_1, tempal;
2269 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302271 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2272 pVBInfo);
2273 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2274 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002275
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302276 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002277 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302278 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01002279 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302280 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002281 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
2282 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302283 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02002284 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
2285 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302286 }
2287 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002288}
2289
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002290static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302291 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002292{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302293 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002294
Peter Huewe6896b942012-02-09 21:11:46 +01002295 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
2296 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302297 tempcl = 0;
2298 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002299 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302301 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002302 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302303 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002304 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302305 if (!(temp & 0x40))
2306 tempcl |= ActiveCRT1;
2307 }
2308 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002309
Aaro Koskinen58839b02011-03-13 12:26:23 +02002310 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302311 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302313 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002314 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002315 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302316 if (tempax & 0x04)
2317 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002318
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302319 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002320
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302321 if (!(tempcl & ActiveLCD))
2322 if (temp == 0x01)
2323 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002324
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302325 if (temp == 0x04)
2326 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302328 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002329 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002330
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302331 if (!(temp & 0x08))
2332 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002333
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302334 if (!(temp & 0x04))
2335 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302337 if (temp & 0x02)
2338 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002339
Peter Huewe599801f2012-02-09 21:11:45 +01002340 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302341 if (temp & 0x01)
2342 tempch |= ActiveHiTV;
2343 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002344
Peter Huewe599801f2012-02-09 21:11:45 +01002345 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002346 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302347 pVBInfo->Part2Port,
2348 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302350 if (temp & 0x10)
2351 tempch |= ActiveYPbPr;
2352 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002353
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302354 if (tempch != 0)
2355 tempcl |= ActiveTV;
2356 }
2357 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002358
Aaro Koskinen58839b02011-03-13 12:26:23 +02002359 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302360 if (tempcl & ActiveLCD) {
2361 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2362 if (temp & ActiveTV)
2363 tempcl |= ActiveTV;
2364 }
2365 }
2366 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002367 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002368 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002369
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302370 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002371 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302372 } else {
2373 return;
2374 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002375}
2376
Bill Pemberton80adad82010-06-17 13:10:51 -04002377void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002378{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302379 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002380
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002381 if (pVBInfo->IF_DEF_LVDS != 0)
2382 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002383
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002384 tempbx = VB_SIS302B;
2385 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2386 if (flag == 0x02)
2387 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002388
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002389 tempbx = VB_SIS301;
2390 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2391 if (flag < 0xB0)
2392 goto finish;
2393
2394 tempbx = VB_SIS301B;
2395 if (flag < 0xC0)
2396 goto bigger_than_0xB0;
2397
2398 tempbx = VB_XGI301C;
2399 if (flag < 0xD0)
2400 goto bigger_than_0xB0;
2401
2402 tempbx = VB_SIS301LV;
2403 if (flag < 0xE0)
2404 goto bigger_than_0xB0;
2405
2406 tempbx = VB_SIS302LV;
2407 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2408 if (tempah != 0xFF)
2409 tempbx = VB_XGI301C;
2410
2411bigger_than_0xB0:
2412 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2413 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2414 if (!(flag & 0x02))
2415 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302416 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002417
2418finish:
2419 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002420}
2421
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002422static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302423 struct xgi_hw_device_info *HwDeviceExtension,
2424 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002425{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302426 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002427
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002428 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302429 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002430 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302431 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002432
Miguel Gómezf9317352012-07-06 12:40:48 +02002433 if (!(pVBInfo->VBType & 0xFFFF))
2434 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002435
Miguel Gómezf9317352012-07-06 12:40:48 +02002436 /* Check Display Device */
2437 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2438 tempbx = tempbx | temp;
2439 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2440 push = temp;
2441 push = push << 8;
2442 tempax = temp << 8;
2443 tempbx = tempbx | tempax;
2444 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2445 | SetInSlaveMode | DisableCRT2Display);
2446 temp = 0xFFFF ^ temp;
2447 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002448
Miguel Gómezf9317352012-07-06 12:40:48 +02002449 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002450
Aaro Koskinen4d8f5ca2012-09-11 00:15:17 +03002451 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002452 if (pVBInfo->VBType &
2453 (VB_SIS302B |
2454 VB_SIS301LV |
2455 VB_SIS302LV |
2456 VB_XGI301C)) {
2457 if (temp & EnableDualEdge) {
2458 tempbx |= SetCRT2ToDualEdge;
2459 if (temp & SetToLCDA)
2460 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002461 }
2462 }
2463 }
2464
2465 if (pVBInfo->IF_DEF_YPbPr == 1) {
2466 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2467 ((pVBInfo->VBType & VB_SIS301LV) ||
2468 (pVBInfo->VBType & VB_SIS302LV) ||
2469 (pVBInfo->VBType & VB_XGI301C)))) {
2470 if (temp & SetYPbPr) {
2471 if (pVBInfo->IF_DEF_HiVision == 1) {
2472 /* shampoo add for new
2473 * scratch */
2474 temp = xgifb_reg_get(
2475 pVBInfo->P3d4,
2476 0x35);
2477 temp &= YPbPrMode;
2478 tempbx |= SetCRT2ToHiVision;
2479
2480 if (temp != YPbPrMode1080i) {
2481 tempbx &=
2482 (~SetCRT2ToHiVision);
2483 tempbx |=
2484 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302485 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302486 }
2487 }
2488 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002489 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002490
Miguel Gómezf9317352012-07-06 12:40:48 +02002491 tempax = push; /* restore CR31 */
2492
2493 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302494 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002495 if (pVBInfo->IF_DEF_HiVision == 1)
2496 temp = 0x09FC;
2497 else
2498 temp = 0x097C;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002499 } else if (pVBInfo->IF_DEF_HiVision == 1) {
2500 temp = 0x01FC;
Miguel Gómezf9317352012-07-06 12:40:48 +02002501 } else {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002502 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302503 }
Justin P. Mattock558f7582012-10-02 21:17:11 -07002504 } else { /* 3rd party chip */
Miguel Gómezf9317352012-07-06 12:40:48 +02002505 temp = SetCRT2ToLCD;
2506 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002507
Miguel Gómezf9317352012-07-06 12:40:48 +02002508 if (!(tempbx & temp)) {
2509 tempax |= DisableCRT2Display;
2510 tempbx = 0;
2511 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002512
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002513 if (!(pVBInfo->VBType & VB_NoLCD)) {
2514 if (tempbx & XGI_SetCRT2ToLCDA) {
2515 if (tempbx & SetSimuScanMode)
2516 tempbx &= (~(SetCRT2ToLCD |
2517 SetCRT2ToRAMDAC |
2518 SwitchCRT2));
2519 else
2520 tempbx &= (~(SetCRT2ToLCD |
2521 SetCRT2ToRAMDAC |
2522 SetCRT2ToTV |
2523 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002524 }
2525 }
2526
2527 /* shampoo add */
2528 /* for driver abnormal */
2529 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2530 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2531 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002532 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002533 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002534 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002535 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002536 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302537 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002538 } else {
2539 tempbx &= (~(SetCRT2ToRAMDAC |
2540 SetCRT2ToLCD |
2541 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302542 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002543 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002544
Miguel Gómezf9317352012-07-06 12:40:48 +02002545 if (!(pVBInfo->VBType & VB_NoLCD)) {
2546 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002547 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002548 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002549 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002550 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002551 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302552 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002553 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002554
Miguel Gómezf9317352012-07-06 12:40:48 +02002555 if (tempbx & SetCRT2ToSCART) {
2556 tempbx &= (0xFF00 |
2557 SetCRT2ToSCART |
2558 SwitchCRT2 |
2559 SetSimuScanMode);
2560 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2561 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002562
Miguel Gómezf9317352012-07-06 12:40:48 +02002563 if (pVBInfo->IF_DEF_YPbPr == 1) {
2564 if (tempbx & SetCRT2ToYPbPr525750)
2565 tempbx &= (0xFF00 |
2566 SwitchCRT2 |
2567 SetSimuScanMode);
2568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002569
Miguel Gómezf9317352012-07-06 12:40:48 +02002570 if (pVBInfo->IF_DEF_HiVision == 1) {
2571 if (tempbx & SetCRT2ToHiVision)
2572 tempbx &= (0xFF00 |
2573 SetCRT2ToHiVision |
2574 SwitchCRT2 |
2575 SetSimuScanMode);
2576 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002577
Miguel Gómezf9317352012-07-06 12:40:48 +02002578 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2579 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2580 tempbx = DisableCRT2Display;
2581 }
2582
2583 if (!(tempbx & DisableCRT2Display)) {
2584 if ((!(tempbx & DriverMode)) ||
2585 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002586 if (!(tempbx & XGI_SetCRT2ToLCDA))
2587 tempbx |= (SetInSlaveMode |
2588 SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02002589 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002590
Miguel Gómezf9317352012-07-06 12:40:48 +02002591 /* LCD+TV can't support in slave mode
2592 * (Force LCDA+TV->LCDB) */
2593 if ((tempbx & SetInSlaveMode) &&
2594 (tempbx & XGI_SetCRT2ToLCDA)) {
2595 tempbx ^= (SetCRT2ToLCD |
2596 XGI_SetCRT2ToLCDA |
2597 SetCRT2ToDualEdge);
2598 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302599 }
2600 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002601
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002603}
2604
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002605static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302606 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002607{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302608 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002609
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302610 tempbx = 0;
2611 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002612
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302613 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002614 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2615 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002616
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302617 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002618 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302619 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002620 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002621 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002622 TVSetPALM |
2623 TVSetPALN |
2624 TVSetPAL);
2625 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002626 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002627 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302628 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002629 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002630 TVSetNTSCJ |
2631 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302632 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002633
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302634 if (pVBInfo->IF_DEF_LVDS == 0) {
2635 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002636 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302637 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302639 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002640 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002641 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302642 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302644 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002645 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002646
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302647 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002648 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302649 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002650 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302651 }
2652 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302654 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002655 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2656 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302657 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002658
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302659 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002660 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2661 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302662 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002663
Peter Huewe599801f2012-02-09 21:11:45 +01002664 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002665 (modeflag > 13) &&
2666 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302667 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302669 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002670
Peter Huewe599801f2012-02-09 21:11:45 +01002671 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302672 if (pVBInfo->VBInfo & SetInSlaveMode)
2673 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002674 } else if (tempbx &
2675 (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302676 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002677 } else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002678 (VB_SIS301B |
2679 VB_SIS302B |
2680 VB_SIS301LV |
2681 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002682 VB_XGI301C))) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002683 if (tempbx & TVSimuMode)
2684 tempbx &= (~RPLLDIV2XO);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302685 }
2686 }
2687 }
2688 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002689}
2690
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002691static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2692 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002693{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302694 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002695
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302696 pVBInfo->LCDResInfo = 0;
2697 pVBInfo->LCDTypeInfo = 0;
2698 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002700 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2701 /* si+Ext_ResInfo // */
2702 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002703 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302704 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002705
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302706 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002707 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002708
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002709 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002710 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302711 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002712 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002713 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302714 tempax &= 0x0F;
2715 else
2716 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002717
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302718 if ((resinfo == 6) || (resinfo == 9)) {
2719 if (tempax >= 3)
2720 tempbx |= PanelRef75Hz;
2721 } else if ((resinfo == 7) || (resinfo == 8)) {
2722 if (tempax >= 4)
2723 tempbx |= PanelRef75Hz;
2724 }
2725 }
2726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302728 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002729
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302730 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002731
Peter Huewea3d675c2012-02-09 21:11:47 +01002732 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302733 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002734
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302735 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002736
Aaro Koskinen58839b02011-03-13 12:26:23 +02002737 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302739 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002740
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302741 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002742
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302743 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002744
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302745 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002746
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302747 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002748 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002749 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302750 tempbx |= SetLCDDualLink;
2751 }
2752 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002753
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302754 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002755 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002756 & SetCRT2ToLCD) && (resinfo == 9) &&
2757 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002758 /*
2759 * set to center in 1280x1024 LCDB
2760 * for Panel_1400x1050
2761 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002762 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302763 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302765 if (pVBInfo->VBInfo & SetInSlaveMode) {
2766 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002767 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302768 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002769 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302772 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302774 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002775}
2776
Bill Pemberton108afbf2010-06-17 13:10:47 -04002777unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302778 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002779{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002780 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2781 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2782 break;
2783 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2784 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302785 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302787 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002788}
2789
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002790static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2791{
2792 unsigned char ujRet = 0;
2793 unsigned char i = 0;
2794
2795 for (i = 0; i < 8; i++) {
2796 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002797 ujRet |= (ujDate >> i) & 1;
2798 }
2799
2800 return ujRet;
2801}
2802
2803/*----------------------------------------------------------------------------*/
2804/* output */
2805/* bl[5] : LVDS signal */
2806/* bl[1] : LVDS backlight */
2807/* bl[0] : LVDS VDD */
2808/*----------------------------------------------------------------------------*/
2809static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2810{
2811 unsigned char CR4A, temp;
2812
Aaro Koskinen58839b02011-03-13 12:26:23 +02002813 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002814 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002815
Aaro Koskinen58839b02011-03-13 12:26:23 +02002816 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002817
2818 temp = XG21GPIODataTransfer(temp);
2819 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002820 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002821 return temp;
2822}
2823
2824/*----------------------------------------------------------------------------*/
2825/* output */
2826/* bl[5] : LVDS signal */
2827/* bl[1] : LVDS backlight */
2828/* bl[0] : LVDS VDD */
2829/*----------------------------------------------------------------------------*/
2830static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2831{
2832 unsigned char CR4A, CRB4, temp;
2833
Aaro Koskinen58839b02011-03-13 12:26:23 +02002834 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002835 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002836
Aaro Koskinen58839b02011-03-13 12:26:23 +02002837 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002838
2839 temp &= 0x0C;
2840 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002841 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002842 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002843 temp |= ((CRB4 & 0x04) << 3);
2844 return temp;
2845}
2846
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002847/*----------------------------------------------------------------------------*/
2848/* input */
2849/* bl[5] : 1;LVDS signal on */
2850/* bl[1] : 1;LVDS backlight on */
2851/* bl[0] : 1:LVDS VDD on */
2852/* bh: 100000b : clear bit 5, to set bit5 */
2853/* 000010b : clear bit 1, to set bit1 */
2854/* 000001b : clear bit 0, to set bit0 */
2855/*----------------------------------------------------------------------------*/
2856static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2857 struct vb_device_info *pVBInfo)
2858{
2859 unsigned char CR4A, temp;
2860
2861 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2862 tempbh &= 0x23;
2863 tempbl &= 0x23;
2864 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2865
2866 if (tempbh & 0x20) {
2867 temp = (tempbl >> 4) & 0x02;
2868
2869 /* CR B4[1] */
2870 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2871
2872 }
2873
2874 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2875
2876 temp = XG21GPIODataTransfer(temp);
2877 temp &= ~tempbh;
2878 temp |= tempbl;
2879 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2880}
2881
Aaro Koskinen776115a2011-11-27 23:03:10 +02002882static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2883 struct vb_device_info *pVBInfo)
2884{
2885 unsigned char CR4A, temp;
2886 unsigned short tempbh0, tempbl0;
2887
2888 tempbh0 = tempbh;
2889 tempbl0 = tempbl;
2890 tempbh0 &= 0x20;
2891 tempbl0 &= 0x20;
2892 tempbh0 >>= 3;
2893 tempbl0 >>= 3;
2894
2895 if (tempbh & 0x20) {
2896 temp = (tempbl >> 4) & 0x02;
2897
2898 /* CR B4[1] */
2899 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2900
2901 }
2902 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2903
2904 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2905 tempbh &= 0x03;
2906 tempbl &= 0x03;
2907 tempbh <<= 2;
2908 tempbl <<= 2; /* GPIOC,GPIOD */
2909 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2910 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2911}
2912
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002913static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2914 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302915 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002916{
2917
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002918 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302919 if (pXGIHWDE->jChipType == XG21) {
2920 if (pVBInfo->IF_DEF_LVDS == 1) {
2921 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002922 /* LVDS VDD on */
2923 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002924 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302925 }
2926 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002927 /* LVDS signal on */
2928 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002929 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002930 /* LVDS backlight on */
2931 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302932 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002933 /* DVO/DVI signal on */
2934 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302935 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302939 if (pXGIHWDE->jChipType == XG27) {
2940 if (pVBInfo->IF_DEF_LVDS == 1) {
2941 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002942 /* LVDS VDD on */
2943 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002944 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302945 }
2946 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002947 /* LVDS signal on */
2948 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002949 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002950 /* LVDS backlight on */
2951 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302952 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002953 /* DVO/DVI signal on */
2954 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302955 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302957 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002958}
2959
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002960void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2961 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302962 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002963{
2964
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302965 if (pXGIHWDE->jChipType == XG21) {
2966 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002967 /* LVDS backlight off */
2968 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002969 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302970 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002971 /* DVO/DVI signal off */
2972 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302973 }
2974 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002975
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302976 if (pXGIHWDE->jChipType == XG27) {
2977 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002978 /* LVDS backlight off */
2979 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002980 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302981 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002982
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302983 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002984 /* DVO/DVI signal off */
2985 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302986 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002987
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002988 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002989}
2990
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002991static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002992{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002993 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302994 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002995
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002996 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302997 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002998}
2999
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003000static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003001{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03003002 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003003}
3004
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003005static void XGI_SaveCRT2Info(unsigned short ModeNo,
3006 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003007{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303008 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003009
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003010 /* reserve CR34 for CRT1 Mode No */
3011 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303012 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
3013 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003014 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003015}
3016
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003017static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
3018 unsigned short ModeIdIndex,
3019 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003020{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303021 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003022
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03003023 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003024 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
3025 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
3026 /* si+St_ModeFlag */
3027 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003028
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003029 if (modeflag & HalfDCLK)
3030 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003031
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003032 if (modeflag & DoubleScanMode)
3033 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003034
Miguel Gómez3339db82012-07-06 12:40:49 +02003035 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3036 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003037
Miguel Gómez3339db82012-07-06 12:40:49 +02003038 if (pVBInfo->IF_DEF_LVDS == 0) {
3039 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
3040 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3041 if (yres == 1024)
3042 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303043 }
3044 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003045
Miguel Gómez3339db82012-07-06 12:40:49 +02003046 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
3047 if (yres == 400)
3048 yres = 405;
3049 else if (yres == 350)
3050 yres = 360;
3051
3052 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
3053 if (yres == 360)
3054 yres = 375;
3055 }
3056 }
3057
3058 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3059 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3060 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
3061 if (yres == 350)
3062 yres = 357;
3063 else if (yres == 400)
3064 yres = 420;
3065 else if (yres == 480)
3066 yres = 525;
3067 }
3068 }
3069 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303070 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003071
Miguel Gómez3339db82012-07-06 12:40:49 +02003072 if (xres == 720)
3073 xres = 640;
3074
3075exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303076 pVBInfo->VGAHDE = xres;
3077 pVBInfo->HDE = xres;
3078 pVBInfo->VGAVDE = yres;
3079 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003080}
3081
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003082static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003083{
3084
Peter Huewea3d675c2012-02-09 21:11:47 +01003085 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03003086 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303087 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003088
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003090}
3091
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003092static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
3093 unsigned short ModeIdIndex,
3094 unsigned short RefreshRateTableIndex,
3095 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003096{
3097 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003098 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003099
3100 pVBInfo->RVBHCMAX = 1;
3101 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003102 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3103 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3104 CRT1Index &= IndexMask;
3105 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
3106 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3107 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
3108 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
3109 tempcx = (unsigned short)
3110 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
3111 tempcx &= 0x0100;
3112 tempcx = tempcx << 2;
3113 tempbx |= tempcx;
3114 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003115
3116 if (temp1 & 0x01)
3117 tempbx |= 0x0100;
3118
3119 if (temp1 & 0x20)
3120 tempbx |= 0x0200;
3121 tempax += 5;
3122
3123 if (modeflag & Charx8Dot)
3124 tempax *= 8;
3125 else
3126 tempax *= 9;
3127
3128 pVBInfo->VGAHT = tempax;
3129 pVBInfo->HT = tempax;
3130 tempbx++;
3131 pVBInfo->VGAVT = tempbx;
3132 pVBInfo->VT = tempbx;
3133}
3134
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003135static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303136 unsigned short RefreshRateTableIndex,
3137 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003138{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303139 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003140
Peter Huewefc39dcb2012-01-15 19:22:12 +01003141 struct SiS_LCDData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003142
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003143 /* si+Ext_ResInfo */
3144 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3145 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303146 pVBInfo->NewFlickerMode = 0;
3147 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003148
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303149 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3150 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3151 pVBInfo);
3152 return;
3153 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003154
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303155 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003156
Peter Huewea3d675c2012-02-09 21:11:47 +01003157 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03003158 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
3159 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003160
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303161 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
3162 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
3163 pVBInfo->VGAHT = LCDPtr->VGAHT;
3164 pVBInfo->VGAVT = LCDPtr->VGAVT;
3165 pVBInfo->HT = LCDPtr->LCDHT;
3166 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003167
Peter Huewe255aabd2012-02-09 21:11:44 +01003168 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303169 tempax = 1024;
3170 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003171
Peter Huewea3d675c2012-02-09 21:11:47 +01003172 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303173 if (pVBInfo->VGAVDE == 357)
3174 tempbx = 527;
3175 else if (pVBInfo->VGAVDE == 420)
3176 tempbx = 620;
3177 else if (pVBInfo->VGAVDE == 525)
3178 tempbx = 775;
3179 else if (pVBInfo->VGAVDE == 600)
3180 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303181 else
3182 tempbx = 768;
3183 } else
3184 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003185 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303186 tempax = 1024;
3187 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01003188 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303189 tempax = 1280;
3190 if (pVBInfo->VGAVDE == 360)
3191 tempbx = 768;
3192 else if (pVBInfo->VGAVDE == 375)
3193 tempbx = 800;
3194 else if (pVBInfo->VGAVDE == 405)
3195 tempbx = 864;
3196 else
3197 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003198 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303199 tempax = 1280;
3200 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01003201 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303202 tempax = 1280;
3203 if (pVBInfo->VGAVDE == 350)
3204 tempbx = 700;
3205 else if (pVBInfo->VGAVDE == 400)
3206 tempbx = 800;
3207 else if (pVBInfo->VGAVDE == 1024)
3208 tempbx = 960;
3209 else
3210 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01003211 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303212 tempax = 1400;
3213 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303215 if (pVBInfo->VGAVDE == 1024) {
3216 tempax = 1280;
3217 tempbx = 1024;
3218 }
Peter Huewe255aabd2012-02-09 21:11:44 +01003219 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303220 tempax = 1600;
3221 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01003222 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303223 if (pVBInfo->VGAVDE == 350)
3224 tempbx = 875;
3225 else if (pVBInfo->VGAVDE == 400)
3226 tempbx = 1000;
3227 }
3228 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303230 if (pVBInfo->LCDInfo & LCDNonExpanding) {
3231 tempax = pVBInfo->VGAHDE;
3232 tempbx = pVBInfo->VGAVDE;
3233 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303235 pVBInfo->HDE = tempax;
3236 pVBInfo->VDE = tempbx;
3237 return;
3238 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303240 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03003241 struct SiS_TVData const *TVPtr;
3242
3243 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3244 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003245
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303246 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
3247 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
3248 pVBInfo->VGAHT = TVPtr->VGAHT;
3249 pVBInfo->VGAVT = TVPtr->VGAVT;
3250 pVBInfo->HDE = TVPtr->TVHDE;
3251 pVBInfo->VDE = TVPtr->TVVDE;
3252 pVBInfo->RVBHRS = TVPtr->RVBHRS;
3253 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003254
Peter Huewe599801f2012-02-09 21:11:45 +01003255 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303256 if (resinfo == 0x08)
3257 pVBInfo->NewFlickerMode = 0x40;
3258 else if (resinfo == 0x09)
3259 pVBInfo->NewFlickerMode = 0x40;
3260 else if (resinfo == 0x12)
3261 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303263 if (pVBInfo->VGAVDE == 350)
3264 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303266 tempax = ExtHiTVHT;
3267 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303269 if (pVBInfo->VBInfo & SetInSlaveMode) {
3270 if (pVBInfo->TVInfo & TVSimuMode) {
3271 tempax = StHiTVHT;
3272 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003273
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303274 if (!(modeflag & Charx8Dot)) {
3275 tempax = StHiTextTVHT;
3276 tempbx = StHiTextTVVT;
3277 }
3278 }
3279 }
Peter Huewe599801f2012-02-09 21:11:45 +01003280 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3281 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303282 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
3283 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
3284 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003285
Peter Huewe599801f2012-02-09 21:11:45 +01003286 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303287 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
3288 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01003289 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303290 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
3291 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
3292 if (pVBInfo->TVInfo & NTSC1024x768)
3293 tempax = NTSC1024x768HT;
3294 }
3295 } else {
3296 tempax = PALHT;
3297 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01003298 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303299 tempax = NTSCHT;
3300 tempbx = NTSCVT;
3301 if (pVBInfo->TVInfo & NTSC1024x768)
3302 tempax = NTSC1024x768HT;
3303 }
3304 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003305
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303306 pVBInfo->HT = tempax;
3307 pVBInfo->VT = tempbx;
3308 return;
3309 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003310}
3311
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003312static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 unsigned short RefreshRateTableIndex,
3314 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003315{
Bill Pemberton108afbf2010-06-17 13:10:47 -04003316 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003317
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303318 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3319 pVBInfo);
3320 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3321 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003322
Peter Huewe6896b942012-02-09 21:11:46 +01003323 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303324 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003325 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
3326 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
3327 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303328 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003329 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
3330 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003332
Aaro Koskinen8104e322011-03-13 12:26:22 +02003333 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303335 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003336 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303337 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003338 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003339}
3340
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003341static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3342 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003343{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003344 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3345 short index;
3346 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303347
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003348 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003349 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003351 if (index < 0)
3352 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303353
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003354 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303355}
3356
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003357static unsigned short XGI_GetOffset(unsigned short ModeNo,
3358 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303359 unsigned short RefreshRateTableIndex,
3360 struct xgi_hw_device_info *HwDeviceExtension,
3361 struct vb_device_info *pVBInfo)
3362{
3363 unsigned short temp, colordepth, modeinfo, index, infoflag,
3364 ColorDepth[] = { 0x01, 0x02, 0x04 };
3365
3366 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003367 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303368
3369 index = (modeinfo >> 8) & 0xFF;
3370
3371 temp = pVBInfo->ScreenOffset[index];
3372
3373 if (infoflag & InterlaceMode)
3374 temp = temp << 1;
3375
3376 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3377
3378 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3379 temp = ModeNo - 0x7C;
3380 colordepth = ColorDepth[temp];
3381 temp = 0x6B;
3382 if (infoflag & InterlaceMode)
3383 temp = temp << 1;
3384 return temp * colordepth;
3385 } else {
3386 return temp * colordepth;
3387 }
3388}
3389
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003390static void XGI_SetCRT2Offset(unsigned short ModeNo,
3391 unsigned short ModeIdIndex,
3392 unsigned short RefreshRateTableIndex,
3393 struct xgi_hw_device_info *HwDeviceExtension,
3394 struct vb_device_info *pVBInfo)
3395{
3396 unsigned short offset;
3397 unsigned char temp;
3398
3399 if (pVBInfo->VBInfo & SetInSlaveMode)
3400 return;
3401
3402 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3403 HwDeviceExtension, pVBInfo);
3404 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003405 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003406 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003407 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003408 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003409 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003410}
3411
Randy Dunlap89229672010-08-10 08:46:44 -07003412static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003413{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003414 /* threshold high ,disable auto threshold */
3415 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3416 /* threshold low default 04h */
3417 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003418}
3419
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003420static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 struct xgi_hw_device_info *HwDeviceExtension,
3422 unsigned short RefreshRateTableIndex,
3423 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003424{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303425 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003426
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003427 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3428 CRT1Index &= IndexMask;
3429 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003430
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303431 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3432 HwDeviceExtension, pVBInfo);
3433 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003434
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303435 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003436 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003437
Aaro Koskinen8104e322011-03-13 12:26:22 +02003438 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3439 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003440}
3441
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003442static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303443 struct xgi_hw_device_info *HwDeviceExtension,
3444 unsigned short RefreshRateTableIndex,
3445 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003446{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303447 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3448 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003449
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003450 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3451 CRT1Index &= IndexMask;
3452 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3453 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303455 /* bainy change table name */
3456 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003457 /* BTVGA2HT 0x08,0x09 */
3458 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003459 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303460 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003461 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003462 /* BTVGA2HDEE 0x0A,0x0C */
3463 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003464 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303465 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3466 pushbx = pVBInfo->VGAHDE / 2 + 16;
3467 tempcx = tempcx >> 1;
3468 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3469 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003470
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303471 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3472 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003473 tempbx |= ((pVBInfo->
3474 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3475 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303476 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3477 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3478 tempcx &= 0x1F;
3479 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3480 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3481 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3482 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003483
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303484 tempbx += 4;
3485 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003486
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303487 if (tempcx > (pVBInfo->VGAHT / 2))
3488 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303490 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003491
Aaro Koskinen8104e322011-03-13 12:26:22 +02003492 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303493 } else {
3494 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003495 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303496 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003497 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003498 /* BTVGA2HDEE 0x0A,0x0C */
3499 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003500 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303501 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3502 pushbx = pVBInfo->VGAHDE + 16;
3503 tempcx = tempcx >> 1;
3504 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3505 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003506
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303507 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3508 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003509 tempbx |= ((pVBInfo->
3510 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3511 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303512 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3513 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3514 tempcx &= 0x1F;
3515 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3516 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3517 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3518 tempbx += 16;
3519 tempcx += 16;
3520 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003521
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303522 if (tempcx > pVBInfo->VGAHT)
3523 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003524
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303525 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003526 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303527 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003528
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303529 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3530 tempbx = pushbx;
3531 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3532 tempax |= (tempbx & 0xFF00);
3533 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003534 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303535 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003536 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303537 tempcx = (pVBInfo->VGAVT - 1);
3538 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003539
Aaro Koskinen8104e322011-03-13 12:26:22 +02003540 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303541 tempbx = pVBInfo->VGAVDE - 1;
3542 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003543 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303544 temp = ((tempbx & 0xFF00) << 3) >> 8;
3545 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003546 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003547
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303548 tempax = pVBInfo->VGAVDE;
3549 tempbx = pVBInfo->VGAVDE;
3550 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003551 /* BTVGA2VRS 0x10,0x11 */
3552 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3553 /* BTVGA2VRE 0x11 */
3554 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003555
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303556 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3557 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3558 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003559
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303560 if (temp & 0x04)
3561 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003562
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303563 if (temp & 0x080)
3564 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003565
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303566 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303568 if (temp & 0x08)
3569 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303571 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3572 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003574
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303575 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003576 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303577 temp = ((tempbx & 0xFF00) >> 8) << 4;
3578 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003579 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303580 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003581
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303582 if (modeflag & DoubleScanMode)
3583 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003584
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303585 if (modeflag & HalfDCLK)
3586 tempax |= 0x40;
3587
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003588 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003589}
3590
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003591static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3592{
3593 unsigned long tempax, tempbx;
3594
3595 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3596 & 0xFFFF;
3597 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3598 tempax = (tempax * pVBInfo->HT) / tempbx;
3599
3600 return (unsigned short) tempax;
3601}
3602
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003603static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303604 struct xgi_hw_device_info *HwDeviceExtension,
3605 unsigned short RefreshRateTableIndex,
3606 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003607{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303608 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3609 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003610
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003611 /* si+Ext_ResInfo */
3612 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3613 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3614 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3615 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003616
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303617 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3618 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003619
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303620 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003621 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303622 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003623
Peter Huewe6896b942012-02-09 21:11:46 +01003624 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303625 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303627 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303629 if (modeflag & HalfDCLK)
3630 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003631
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303632 tempax = (tempax / tempcx) - 1;
3633 tempbx |= ((tempax & 0x00FF) << 8);
3634 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003635 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303637 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003638
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303639 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003640 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3641 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303642 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003643
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003644 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3645 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303646 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303647 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003648
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003649 /* 0x05 Horizontal Display Start */
3650 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3651 /* 0x06 Horizontal Blank end */
3652 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003653
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3655 if (pVBInfo->VBInfo & SetCRT2ToTV)
3656 tempax = pVBInfo->VGAHT;
3657 else
3658 tempax = XGI_GetVGAHT2(pVBInfo);
3659 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003660
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303661 if (tempax >= pVBInfo->VGAHT)
3662 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003663
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303664 if (modeflag & HalfDCLK)
3665 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303667 tempax = (tempax / tempcx) - 5;
3668 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003669 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303670 temp = (tempbx & 0x00FF) - 1;
3671 if (!(modeflag & HalfDCLK)) {
3672 temp -= 6;
3673 if (pVBInfo->TVInfo & TVSimuMode) {
3674 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003675 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303676 }
3677 }
3678 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303679 tempbx = (tempbx & 0xFF00) >> 8;
3680 tempcx = (tempcx + tempbx) >> 1;
3681 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303683 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3684 temp -= 1;
3685 if (!(modeflag & HalfDCLK)) {
3686 if ((modeflag & Charx8Dot)) {
3687 temp += 4;
3688 if (pVBInfo->VGAHDE >= 800)
3689 temp -= 6;
3690 }
3691 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003692 } else if (!(modeflag & HalfDCLK)) {
3693 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003694 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003695 pVBInfo->VGAHDE >= 800) {
3696 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003697 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003698 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003699 (pVBInfo->LCDInfo & LCDNonExpanding))
3700 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303701 }
3702 }
3703 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003704
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003705 /* 0x07 Horizontal Retrace Start */
3706 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3707 /* 0x08 Horizontal Retrace End */
3708 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003709
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303710 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3711 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003712 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303713 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003714 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303715 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003716 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303717 0x08, 0x03);
3718 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003719 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303720 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003721 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303722 0x08, 0x02);
3723 }
3724 }
3725 }
3726 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003727
Aaro Koskinen8104e322011-03-13 12:26:22 +02003728 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003729 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003730 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003731
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303732 tempbx = pVBInfo->VGAVT;
3733 push1 = tempbx;
3734 tempcx = 0x121;
3735 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003736
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303737 if (tempbx == 357)
3738 tempbx = 350;
3739 if (tempbx == 360)
3740 tempbx = 350;
3741 if (tempbx == 375)
3742 tempbx = 350;
3743 if (tempbx == 405)
3744 tempbx = 400;
3745 if (tempbx == 525)
3746 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003747
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003749
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303750 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003751 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003752 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303753 if (tempbx == 350)
3754 tempbx += 5;
3755 if (tempbx == 480)
3756 tempbx += 5;
3757 }
3758 }
3759 }
3760 tempbx--;
3761 temp = tempbx & 0x00FF;
3762 tempbx--;
3763 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003764 /* 0x10 vertical Blank Start */
3765 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303766 tempbx = push2;
3767 tempbx--;
3768 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003769 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003770
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303771 if (tempbx & 0x0100)
3772 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003773
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303774 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303776 if (modeflag & DoubleScanMode)
3777 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303779 if (tempbx & 0x0200)
3780 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303782 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003783 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003784
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303785 if (tempbx & 0x0400)
3786 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003787
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003788 /* 0x11 Vertival Blank End */
3789 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303790
3791 tempax = push1;
3792 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3793 tempax = tempax >> 2;
3794 push1 = tempax; /* push ax */
3795
3796 if (resinfo != 0x09) {
3797 tempax = tempax << 1;
3798 tempbx += tempax;
3799 }
3800
Peter Huewe599801f2012-02-09 21:11:45 +01003801 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003802 if ((pVBInfo->VBType & VB_SIS301LV) &&
3803 !(pVBInfo->TVInfo & TVSetHiVision)) {
3804 if ((pVBInfo->TVInfo & TVSimuMode) &&
3805 (pVBInfo->TVInfo & TVSetPAL)) {
3806 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3807 !(pVBInfo->TVInfo &
3808 (TVSetYPbPr525p |
3809 TVSetYPbPr750p |
3810 TVSetHiVision)))
3811 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303812 }
3813 } else {
3814 tempbx -= 10;
3815 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003816 } else if (pVBInfo->TVInfo & TVSimuMode) {
3817 if (pVBInfo->TVInfo & TVSetPAL) {
3818 if (pVBInfo->VBType & VB_SIS301LV) {
3819 if (!(pVBInfo->TVInfo &
3820 (TVSetYPbPr525p |
3821 TVSetYPbPr750p |
3822 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303823 tempbx += 40;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003824 } else {
3825 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303826 }
3827 }
3828 }
3829 tempax = push1;
3830 tempax = tempax >> 2;
3831 tempax++;
3832 tempax += tempbx;
3833 push1 = tempax; /* push ax */
3834
Peter Huewe599801f2012-02-09 21:11:45 +01003835 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303836 if (tempbx <= 513) {
3837 if (tempax >= 513)
3838 tempbx = 513;
3839 }
3840 }
3841
3842 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003843 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303844 tempbx--;
3845 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003846 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303847
3848 if (tempbx & 0x0100)
3849 tempcx |= 0x0008;
3850
3851 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003852 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303853
3854 tempbx++;
3855
3856 if (tempbx & 0x0100)
3857 tempcx |= 0x0004;
3858
3859 if (tempbx & 0x0200)
3860 tempcx |= 0x0080;
3861
3862 if (tempbx & 0x0400)
3863 tempcx |= 0x0C00;
3864
3865 tempbx = push1; /* pop ax */
3866 temp = tempbx & 0x00FF;
3867 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003868 /* 0x0D vertical Retrace End */
3869 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303870
3871 if (tempbx & 0x0010)
3872 tempcx |= 0x2000;
3873
3874 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003875 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303876 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003877 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303878 tempax = modeflag;
3879 temp = (tempax & 0xFF00) >> 8;
3880
3881 temp = (temp >> 1) & 0x09;
3882
Peter Huewe6896b942012-02-09 21:11:46 +01003883 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303884 temp |= 0x01;
3885
Aaro Koskinen8104e322011-03-13 12:26:22 +02003886 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3887 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3888 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303889
3890 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3891 temp = 0x80;
3892 else
3893 temp = 0x00;
3894
Aaro Koskinen8104e322011-03-13 12:26:22 +02003895 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303896
3897 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003898}
3899
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003900static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303901 unsigned short RefreshRateTableIndex,
3902 struct xgi_hw_device_info *HwDeviceExtension,
3903 struct vb_device_info *pVBInfo)
3904{
3905 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
3906 modeflag, resinfo, crt2crtc;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003907 unsigned char const *TimingPoint;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303908
3909 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3910
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003911 /* si+Ext_ResInfo */
3912 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3913 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3914 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303915
3916 tempax = 0;
3917
3918 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3919 tempax |= 0x0800;
3920
3921 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3922 tempax |= 0x0400;
3923
3924 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3925 tempax |= 0x0200;
3926
Peter Huewe599801f2012-02-09 21:11:45 +01003927 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303928 tempax |= 0x1000;
3929
Peter Huewe599801f2012-02-09 21:11:45 +01003930 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303931 tempax |= 0x0100;
3932
Peter Huewe599801f2012-02-09 21:11:45 +01003933 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303934 tempax &= 0xfe00;
3935
3936 tempax = (tempax & 0xff00) >> 8;
3937
Aaro Koskinen8104e322011-03-13 12:26:22 +02003938 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003939 TimingPoint = XGI330_NTSCTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303940
Peter Huewe599801f2012-02-09 21:11:45 +01003941 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003942 TimingPoint = XGI330_PALTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303943
Peter Huewe599801f2012-02-09 21:11:45 +01003944 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003945 TimingPoint = XGI330_HiTVExtTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303946
3947 if (pVBInfo->VBInfo & SetInSlaveMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003948 TimingPoint = XGI330_HiTVSt2Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303949
3950 if (pVBInfo->SetFlag & TVSimuMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003951 TimingPoint = XGI330_HiTVSt1Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303952
3953 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003954 TimingPoint = XGI330_HiTVTextTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303955 }
3956
Peter Huewe599801f2012-02-09 21:11:45 +01003957 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3958 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003959 TimingPoint = XGI330_YPbPr525iTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303960
Peter Huewe599801f2012-02-09 21:11:45 +01003961 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003962 TimingPoint = XGI330_YPbPr525pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303963
Peter Huewe599801f2012-02-09 21:11:45 +01003964 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003965 TimingPoint = XGI330_YPbPr750pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303966 }
3967
3968 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003969 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303970
3971 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003972 /* di->temp2[j] */
3973 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303974
3975 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003976 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977
3978 temp = pVBInfo->NewFlickerMode;
3979 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003980 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303981
Peter Huewe599801f2012-02-09 21:11:45 +01003982 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303983 tempax = 950;
3984
Peter Huewe599801f2012-02-09 21:11:45 +01003985 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303986 tempax = 520;
3987 else
3988 tempax = 440;
3989
3990 if (pVBInfo->VDE <= tempax) {
3991 tempax -= pVBInfo->VDE;
3992 tempax = tempax >> 2;
3993 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
3994 push1 = tempax;
3995 temp = (tempax & 0xFF00) >> 8;
3996 temp += (unsigned short) TimingPoint[0];
3997
Peter Huewe6896b942012-02-09 21:11:46 +01003998 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3999 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304000 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4001 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004002 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304003 tempcx = pVBInfo->VGAHDE;
4004 if (tempcx >= 1024) {
4005 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004006 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304007 temp = 0x19; /* PAL */
4008 }
4009 }
4010 }
4011
Aaro Koskinen8104e322011-03-13 12:26:22 +02004012 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304013 tempax = push1;
4014 temp = (tempax & 0xFF00) >> 8;
4015 temp += TimingPoint[1];
4016
Peter Huewe6896b942012-02-09 21:11:46 +01004017 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4018 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304019 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
4020 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01004021 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304022 tempcx = pVBInfo->VGAHDE;
4023 if (tempcx >= 1024) {
4024 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01004025 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304026 temp = 0x52; /* PAL */
4027 }
4028 }
4029 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004030 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304031 }
4032
4033 /* 301b */
4034 tempcx = pVBInfo->HT;
4035
4036 if (XGI_IsLCDDualLink(pVBInfo))
4037 tempcx = tempcx >> 1;
4038
4039 tempcx -= 2;
4040 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004041 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304042
4043 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004044 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304045
4046 tempcx = pVBInfo->HT >> 1;
4047 push1 = tempcx; /* push cx */
4048 tempcx += 7;
4049
Peter Huewe599801f2012-02-09 21:11:45 +01004050 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304051 tempcx -= 4;
4052
4053 temp = tempcx & 0x00FF;
4054 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004055 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304056
4057 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4058 tempbx += tempcx;
4059 push2 = tempbx;
4060 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004061 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304062 temp = (tempbx & 0xFF00) >> 8;
4063 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004064 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304065
4066 tempbx = push2;
4067 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004068 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304069 tempbx = tempbx - 4;
4070 tempcx = tempbx;
4071 }
4072
4073 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004074 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304075
4076 j += 2;
4077 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
4078 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004079 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304080 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004081 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304082
4083 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004084 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304085 tempcx -= 4;
4086
4087 temp = tempcx & 0xFF;
4088 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004089 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090
4091 tempcx = push1; /* pop cx */
4092 j += 2;
4093 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
4094 tempcx -= temp;
4095 temp = tempcx & 0x00FF;
4096 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004097 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304098
4099 tempcx -= 11;
4100
4101 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
4102 tempax = XGI_GetVGAHT2(pVBInfo);
4103 tempcx = tempax - 1;
4104 }
4105 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004106 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304107
4108 tempbx = pVBInfo->VDE;
4109
4110 if (pVBInfo->VGAVDE == 360)
4111 tempbx = 746;
4112 if (pVBInfo->VGAVDE == 375)
4113 tempbx = 746;
4114 if (pVBInfo->VGAVDE == 405)
4115 tempbx = 853;
4116
4117 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004118 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01004119 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004120 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01004121 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304122 tempbx = tempbx >> 1;
4123 } else
4124 tempbx = tempbx >> 1;
4125 }
4126
4127 tempbx -= 2;
4128 temp = tempbx & 0x00FF;
4129
Peter Huewe599801f2012-02-09 21:11:45 +01004130 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01004131 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004132 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304133 if (pVBInfo->VBInfo & SetInSlaveMode) {
4134 if (ModeNo == 0x2f)
4135 temp += 1;
4136 }
4137 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004138 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
4139 if (ModeNo == 0x2f)
4140 temp += 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304141 }
4142 }
4143
Aaro Koskinen8104e322011-03-13 12:26:22 +02004144 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304145
4146 temp = (tempcx & 0xFF00) >> 8;
4147 temp |= ((tempbx & 0xFF00) >> 8) << 6;
4148
Peter Huewe599801f2012-02-09 21:11:45 +01004149 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01004150 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004151 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304152 temp |= 0x10;
4153
4154 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4155 temp |= 0x20;
4156 }
4157 } else {
4158 temp |= 0x10;
4159 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
4160 temp |= 0x20;
4161 }
4162 }
4163
Aaro Koskinen8104e322011-03-13 12:26:22 +02004164 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304165
Peter Huewe6896b942012-02-09 21:11:46 +01004166 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4167 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304168 tempbx = pVBInfo->VDE;
4169 tempcx = tempbx - 2;
4170
4171 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01004172 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
4173 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304174 tempbx = tempbx >> 1;
4175 }
4176
Peter Huewe6896b942012-02-09 21:11:46 +01004177 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304178 temp = 0;
4179 if (tempcx & 0x0400)
4180 temp |= 0x20;
4181
4182 if (tempbx & 0x0400)
4183 temp |= 0x40;
4184
Aaro Koskinen8104e322011-03-13 12:26:22 +02004185 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304186 }
4187
4188 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004189 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304190 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004191 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304192 }
4193
4194 tempbx = tempbx & 0x00FF;
4195
4196 if (!(modeflag & HalfDCLK)) {
4197 tempcx = pVBInfo->VGAHDE;
4198 if (tempcx >= pVBInfo->HDE) {
4199 tempbx |= 0x2000;
4200 tempax &= 0x00FF;
4201 }
4202 }
4203
4204 tempcx = 0x0101;
4205
4206 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
4207 if (pVBInfo->VGAHDE >= 1024) {
4208 tempcx = 0x1920;
4209 if (pVBInfo->VGAHDE >= 1280) {
4210 tempcx = 0x1420;
4211 tempbx = tempbx & 0xDFFF;
4212 }
4213 }
4214 }
4215
4216 if (!(tempbx & 0x2000)) {
4217 if (modeflag & HalfDCLK)
4218 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
4219
4220 push1 = tempbx;
4221 tempeax = pVBInfo->VGAHDE;
4222 tempebx = (tempcx & 0xFF00) >> 8;
4223 longtemp = tempeax * tempebx;
4224 tempecx = tempcx & 0x00FF;
4225 longtemp = longtemp / tempecx;
4226
4227 /* 301b */
4228 tempecx = 8 * 1024;
4229
Peter Huewe6896b942012-02-09 21:11:46 +01004230 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4231 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304232 tempecx = tempecx * 8;
4233 }
4234
4235 longtemp = longtemp * tempecx;
4236 tempecx = pVBInfo->HDE;
4237 temp2 = longtemp % tempecx;
4238 tempeax = longtemp / tempecx;
4239 if (temp2 != 0)
4240 tempeax += 1;
4241
4242 tempax = (unsigned short) tempeax;
4243
4244 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004245 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4246 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304247 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
4248 }
4249 /* end 301b */
4250
4251 tempbx = push1;
4252 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
4253 | (tempbx & 0x00FF));
4254 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
4255 | (tempax & 0x00FF));
4256 temp = (tempax & 0xFF00) >> 8;
4257 } else {
4258 temp = (tempax & 0x00FF) >> 8;
4259 }
4260
Aaro Koskinen8104e322011-03-13 12:26:22 +02004261 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304262 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004263 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304264 temp = tempcx & 0x00FF;
4265
4266 if (tempbx & 0x2000)
4267 temp = 0;
4268
4269 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4270 temp |= 0x18;
4271
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004272 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01004273 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304274 tempbx = 0x0382;
4275 tempcx = 0x007e;
4276 } else {
4277 tempbx = 0x0369;
4278 tempcx = 0x0061;
4279 }
4280
4281 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004282 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304283 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004284 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304285
4286 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
4287 temp = temp << 2;
4288 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
4289
Peter Huewe599801f2012-02-09 21:11:45 +01004290 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304291 temp |= 0x10;
4292
Peter Huewe599801f2012-02-09 21:11:45 +01004293 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304294 temp |= 0x20;
4295
Peter Huewe599801f2012-02-09 21:11:45 +01004296 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304297 temp |= 0x60;
4298 }
4299
Aaro Koskinen8104e322011-03-13 12:26:22 +02004300 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004301 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004302 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304303
Peter Huewe599801f2012-02-09 21:11:45 +01004304 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304305 if (pVBInfo->TVInfo & NTSC1024x768) {
4306 TimingPoint = XGI_NTSC1024AdjTime;
4307 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004308 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304309 TimingPoint[j]);
4310 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02004311 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304312 }
4313 }
4314
Miguel Gómez949eb0a2012-07-06 12:40:36 +02004315 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304316 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01004317 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004318 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304319 0x08); /* PALM Mode */
4320 }
4321
Peter Huewe599801f2012-02-09 21:11:45 +01004322 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02004323 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304324 0x01);
4325 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02004326 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304327
Aaro Koskinendc505562011-03-13 12:26:26 +02004328 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 }
4330
Peter Huewe599801f2012-02-09 21:11:45 +01004331 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304332 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004333 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304334 }
4335
4336 if (pVBInfo->VBInfo & SetCRT2ToTV)
4337 return;
4338}
4339
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004340static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304341 struct xgi_hw_device_info *HwDeviceExtension,
4342 unsigned short RefreshRateTableIndex,
4343 struct vb_device_info *pVBInfo)
4344{
4345 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4346 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4347
4348 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4349
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004350 /* si+Ext_ResInfo */
4351 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4352 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4353 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4354 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355
4356 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4357 return;
4358
4359 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4360
4361 if (XGI_IsLCDDualLink(pVBInfo))
4362 tempbx = tempbx >> 1;
4363
4364 tempbx -= 1;
4365 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004366 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304367 temp = (tempbx & 0xFF00) >> 8;
4368 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004369 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 temp = 0x01;
4371
Aaro Koskinen8104e322011-03-13 12:26:22 +02004372 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304373 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4374 push1 = tempbx;
4375 tempbx--;
4376 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004377 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304378 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004379 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304380
4381 tempcx = pVBInfo->VT - 1;
4382 push2 = tempcx + 1;
4383 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004384 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304385 temp = (tempcx & 0xFF00) >> 8;
4386 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004387 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004388 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4389 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4390 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4391 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392
Justin P. Mattock558f7582012-10-02 21:17:11 -07004393 /* Customized LCDB Does not add */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304394 tempbx = 5;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03004395 LCDBDesPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
4396 RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304397 tempah = pVBInfo->LCDResInfo;
4398 tempah &= PanelResInfo;
4399
Peter Huewe255aabd2012-02-09 21:11:44 +01004400 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304401 tempbx = 1024;
4402 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004403 } else if ((tempah == Panel_1280x1024) ||
4404 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304405 tempbx = 1280;
4406 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004407 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304408 tempbx = 1400;
4409 tempcx = 1050;
4410 } else {
4411 tempbx = 1600;
4412 tempcx = 1200;
4413 }
4414
4415 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4416 tempbx = pVBInfo->HDE;
4417 tempcx = pVBInfo->VDE;
4418 }
4419
4420 pushbx = tempbx;
4421 tempax = pVBInfo->VT;
4422 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4423 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4424 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4425 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4426 tempbx = pVBInfo->LCDVDES;
4427 tempcx += tempbx;
4428
4429 if (tempcx >= tempax)
4430 tempcx -= tempax; /* lcdvdes */
4431
4432 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004433 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304434 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004435 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304436 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4437 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4438 tempah = tempch;
4439 tempah = tempah << 3;
4440 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004441 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304442
4443 /* getlcdsync() */
4444 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4445 tempcx = tempbx;
4446 tempax = pVBInfo->VT;
4447 tempbx = pVBInfo->LCDVRS;
4448
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304449 tempcx += tempbx;
4450 if (tempcx >= tempax)
4451 tempcx -= tempax;
4452
4453 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004454 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304455 temp = (tempbx & 0xFF00) >> 8;
4456 temp = temp << 4;
4457 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004458 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304459 tempcx = pushbx;
4460 tempax = pVBInfo->HT;
4461 tempbx = pVBInfo->LCDHDES;
4462 tempbx &= 0x0FFF;
4463
4464 if (XGI_IsLCDDualLink(pVBInfo)) {
4465 tempax = tempax >> 1;
4466 tempbx = tempbx >> 1;
4467 tempcx = tempcx >> 1;
4468 }
4469
Peter Huewe6896b942012-02-09 21:11:46 +01004470 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304471 tempbx += 1;
4472
4473 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4474 tempbx += 1;
4475
4476 tempcx += tempbx;
4477
4478 if (tempcx >= tempax)
4479 tempcx -= tempax;
4480
4481 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004482 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304483 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004484 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304485 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004486 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304487 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004488 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304489
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304490 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4491 tempcx = tempax;
4492 tempax = pVBInfo->HT;
4493 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304494 if (XGI_IsLCDDualLink(pVBInfo)) {
4495 tempax = tempax >> 1;
4496 tempbx = tempbx >> 1;
4497 tempcx = tempcx >> 1;
4498 }
4499
Peter Huewe6896b942012-02-09 21:11:46 +01004500 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304501 tempbx += 1;
4502
4503 tempcx += tempbx;
4504
4505 if (tempcx >= tempax)
4506 tempcx -= tempax;
4507
4508 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004509 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510
4511 temp = (tempbx & 0xFF00) >> 8;
4512 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004513 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304514 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004515 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304516
Peter Huewea3d675c2012-02-09 21:11:47 +01004517 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304518 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004519 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4520 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304521 | VB_XGI301C)) {
4522 temp = 0xC6;
4523 } else
4524 temp = 0xC4;
4525
Aaro Koskinen8104e322011-03-13 12:26:22 +02004526 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4527 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304528 }
4529
4530 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004531 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4532 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304533 | VB_XGI301C)) {
4534 temp = 0x4F;
4535 } else
4536 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004537 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304538 }
4539 }
4540}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004541
4542/* --------------------------------------------------------------------- */
4543/* Function : XGI_GetTap4Ptr */
4544/* Input : */
4545/* Output : di -> Tap4 Reg. Setting Pointer */
4546/* Description : */
4547/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004548static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004550{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304551 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304553 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004554
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304555 if (tempcx == 0) {
4556 tempax = pVBInfo->VGAHDE;
4557 tempbx = pVBInfo->HDE;
4558 } else {
4559 tempax = pVBInfo->VGAVDE;
4560 tempbx = pVBInfo->VDE;
4561 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004562
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004563 if (tempax <= tempbx)
4564 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304565 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004566 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004567
Peter Huewe599801f2012-02-09 21:11:45 +01004568 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304569 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004570
Peter Huewe599801f2012-02-09 21:11:45 +01004571 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4572 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4573 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004574 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004575 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304576 Tap4TimingPtr = YPbPr750pTap4Timing;
4577 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004578
Peter Huewe599801f2012-02-09 21:11:45 +01004579 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004580 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004581
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304582 i = 0;
4583 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4584 if (Tap4TimingPtr[i].DE == tempax)
4585 break;
4586 i++;
4587 }
4588 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004589}
4590
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004591static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004592{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304593 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004594
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304595 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004596
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304597 if (!(pVBInfo->VBType & VB_XGI301C))
4598 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004599
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304600 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4601 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004602 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004603
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004604 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004605 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004606 /* Set Vertical Scaling */
4607 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304608 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004609 xgifb_reg_set(pVBInfo->Part2Port,
4610 i,
4611 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304612 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004613
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004614 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004615 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004616 /* Enable V.Scaling */
4617 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304618 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004619 /* Enable H.Scaling */
4620 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004621}
4622
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004623static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304624 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004625{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 unsigned short i;
Aaro Koskinend21222d2012-09-11 00:15:29 +03004627 unsigned char const *tempdi;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304628 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004629
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004630 /* si+Ext_ResInfo */
4631 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004632
Aaro Koskinen8104e322011-03-13 12:26:22 +02004633 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004634 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004635 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4636 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304637 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004638 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4639 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004641
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304642 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4643 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004644
Peter Huewe599801f2012-02-09 21:11:45 +01004645 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004646 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4647 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4648 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304649 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004650
Peter Huewe599801f2012-02-09 21:11:45 +01004651 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4652 & SetCRT2ToYPbPr525750)) {
4653 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304654 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004655
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004656 tempdi = XGI330_HiTVGroup3Data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304657 if (pVBInfo->SetFlag & TVSimuMode) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004658 tempdi = XGI330_HiTVGroup3Simu;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304659 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004660 tempdi = XGI330_HiTVGroup3Text;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304661 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004662
Peter Huewe599801f2012-02-09 21:11:45 +01004663 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004664 tempdi = XGI330_Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004665
Peter Huewe599801f2012-02-09 21:11:45 +01004666 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004667 tempdi = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004668
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304669 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004670 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004671
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304672 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004673 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004674 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304675 }
4676 }
4677 return;
4678} /* {end of XGI_SetGroup3} */
4679
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004680static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304681 unsigned short RefreshRateTableIndex,
4682 struct xgi_hw_device_info *HwDeviceExtension,
4683 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004684{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304685 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004686
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304687 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004688
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004689 /* si+Ext_ResInfo */
4690 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304691 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004692 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004693
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304694 tempbx = pVBInfo->RVBHCMAX;
4695 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004696 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304697 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4698 tempcx = pVBInfo->VGAHT - 1;
4699 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004700 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004701
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304702 temp = ((tempcx & 0xFF00) >> 8) << 3;
4703 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304705 tempcx = pVBInfo->VGAVT - 1;
4706 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4707 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004708
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304709 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004710 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304711 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004712 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004713 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304714 tempcx = pVBInfo->VBInfo;
4715 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004716
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304717 if (modeflag & HalfDCLK)
4718 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304720 if (XGI_IsLCDDualLink(pVBInfo))
4721 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004722
Peter Huewe599801f2012-02-09 21:11:45 +01004723 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304724 temp = 0;
4725 if (tempbx <= 1024)
4726 temp = 0xA0;
4727 if (tempbx == 1280)
4728 temp = 0xC0;
4729 } else if (tempcx & SetCRT2ToTV) {
4730 temp = 0xA0;
4731 if (tempbx <= 800)
4732 temp = 0x80;
4733 } else {
4734 temp = 0x80;
4735 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4736 temp = 0;
4737 if (tempbx > 800)
4738 temp = 0x60;
4739 }
4740 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004741
Peter Huewe599801f2012-02-09 21:11:45 +01004742 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304743 temp = 0x00;
4744 if (pVBInfo->VGAHDE == 1280)
4745 temp = 0x40;
4746 if (pVBInfo->VGAHDE == 1024)
4747 temp = 0x20;
4748 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004749 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004750
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304751 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004752
Peter Huewe599801f2012-02-09 21:11:45 +01004753 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304754 if (!(temp & 0xE000))
4755 tempbx = tempbx >> 1;
4756 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004757
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304758 tempcx = pVBInfo->RVBHRS;
4759 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004760 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304762 tempeax = pVBInfo->VGAVDE;
4763 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004764
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304765 if (tempeax <= tempebx) {
4766 tempcx = (tempcx & (~0x4000));
4767 tempeax = pVBInfo->VGAVDE;
4768 } else {
4769 tempeax -= tempebx;
4770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 templong = (tempeax * 256 * 1024) % tempebx;
4773 tempeax = (tempeax * 256 * 1024) / tempebx;
4774 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004775
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304776 if (templong != 0)
4777 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004778
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304779 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004780 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004781
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004783 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304784 tempbx = (unsigned short) (tempebx >> 16);
4785 temp = tempbx & 0x00FF;
4786 temp = temp << 4;
4787 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004788 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004789
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304790 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004791 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4792 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304793 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004794 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304795 tempax = pVBInfo->VGAHDE;
4796 if (modeflag & HalfDCLK)
4797 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004798
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304799 if (XGI_IsLCDDualLink(pVBInfo))
4800 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004801
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304802 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4803 if (tempax > 800)
4804 tempax -= 800;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004805 } else if (pVBInfo->VGAHDE > 800) {
4806 if (pVBInfo->VGAHDE == 1024)
4807 tempax = (tempax * 25 / 32) - 1;
4808 else
4809 tempax = (tempax * 20 / 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304810 }
4811 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304813 temp = (tempax & 0xFF00) >> 8;
4814 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004815 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304816 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004817 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004818
Peter Huewe599801f2012-02-09 21:11:45 +01004819 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304820 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004821 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304823 }
4824 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004825
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304826 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4827 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004828 | TVSetYPbPr525p | TVSetYPbPr750p
4829 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304830 temp |= 0x0001;
4831 if ((pVBInfo->VBInfo & SetInSlaveMode)
4832 && (!(pVBInfo->TVInfo
4833 & TVSimuMode)))
4834 temp &= (~0x0001);
4835 }
4836 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004837
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004838 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304839 tempbx = pVBInfo->HT;
4840 if (XGI_IsLCDDualLink(pVBInfo))
4841 tempbx = tempbx >> 1;
4842 tempbx = (tempbx >> 1) - 2;
4843 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004844 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304845 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004846 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304847 }
4848 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004849
Aaro Koskinen8951dad2012-09-11 00:15:30 +03004850 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004851}
4852
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004853static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4854{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004855 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004856}
4857
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004858static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304859 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004860{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304861 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004862
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304863 Pindex = pVBInfo->Part5Port;
4864 Pdata = pVBInfo->Part5Port + 1;
4865 if (pVBInfo->ModeType == ModeVGA) {
4866 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01004867 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304868 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304869 }
4870 }
4871 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004872}
4873
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004874static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304875 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004876{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004877 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004878}
4879
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004880static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304881 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004882{
4883
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004884 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004885}
4886
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004887static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
4888 unsigned short ModeNo, unsigned short ModeIdIndex,
4889 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004890{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004891 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004892
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004893 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004894 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4895 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4896 /* si+St_ModeFlag */
4897 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304899 if (!(modeflag & Charx8Dot)) {
4900 xres /= 9;
4901 xres *= 8;
4902 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004903
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004904 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4905 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004906
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004907 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4908 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004909
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004910 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304911 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04004912
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004913 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304914 return 0;
4915
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004916 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4917 yres != xgifb_info->lvds_data.LVDSVDE) {
4918 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4919 if (colordepth > 2)
4920 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304921 }
4922 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004923}
4924
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004925static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4926 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004927 unsigned short ModeNo,
4928 unsigned short ModeIdIndex,
4929 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004930{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304931 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004932 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304933 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4934 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4935 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004936
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004937 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004938 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304939 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004940 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004941
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004942 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004943
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004944 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004945 /* SR35[7] FP VSync polarity */
4946 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4947 /* SR30[5] FP HSync polarity */
4948 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004949
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004950 if (chip_id == XG27)
4951 XGI_SetXG27FPBits(pVBInfo);
4952 else
4953 XGI_SetXG21FPBits(pVBInfo);
4954
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004955 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004956 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4957 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4958 /* si+St_ModeFlag */
4959 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004960
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304961 if (!(modeflag & Charx8Dot))
4962 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004963
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004964 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004965
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004966 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004967
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304968 if (LVDSHBS > LVDSHT)
4969 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004970
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004971 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304972 if (LVDSHRS > LVDSHT)
4973 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004974
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004975 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304976 if (LVDSHRE > LVDSHT)
4977 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004978
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004979 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004980
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004981 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004982
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004983 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004984 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304985 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304987 if (LVDSVBS > LVDSVT)
4988 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004989
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004990 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304991 if (LVDSVRS > LVDSVT)
4992 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004993
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004994 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304995 if (LVDSVRE > LVDSVT)
4996 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004997
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004998 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004999
Aaro Koskinen58839b02011-03-13 12:26:23 +02005000 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005001 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005002
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305003 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005004 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005005
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305006 /* HT SR0B[1:0] CR00 */
5007 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005008 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005009 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005010
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305011 /* HBS SR0B[5:4] CR02 */
5012 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005013 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005014 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005015
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305016 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
5017 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005018 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
5019 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
5020 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005021
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305022 /* HRS SR0B[7:6] CR04 */
5023 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005024 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005025 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005026
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305027 /* Panel HRS SR2F[1:0] SR2E[7:0] */
5028 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005029 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005030 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305032 /* HRE SR0C[2] CR05[4:0] */
5033 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005034 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
5035 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005036
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305037 /* Panel HRE SR2F[7:2] */
5038 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005039 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005040
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305041 /* VT SR0A[0] CR07[5][0] CR06 */
5042 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005043 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
5044 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
5045 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005046 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005047
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305048 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
5049 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005050 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
5051 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
5052 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005053 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005054
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305055 /* VBE SR0A[4] CR16 */
5056 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005057 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005058 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005059
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305060 /* VRS SR0A[3] CR7[7][2] CR10 */
5061 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005062 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
5063 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
5064 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005065 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005066
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005067 if (chip_id == XG27) {
5068 /* Panel VRS SR35[2:0] SR34[7:0] */
5069 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
5070 (value & 0x700) >> 8);
5071 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
5072 } else {
5073 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
5074 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
5075 (value & 0x600) >> 9);
5076 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
5077 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
5078 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005079
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305080 /* VRE SR0A[5] CR11[3:0] */
5081 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005082 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
5083 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305085 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005086 if (chip_id == XG27)
5087 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5088 (value << 2) & 0xFC);
5089 else
5090 /* SR3F[7] has to be 0, h/w bug */
5091 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
5092 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005093
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305094 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005095
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005096 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005097 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005098 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005099 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005100 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305101 value += 0x10;
5102 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005103
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305104 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005105 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005106 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005107 /* set data, panning = 0, shift left 1 dot*/
5108 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005109
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005110 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005111 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305112
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005113 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305114 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005115
5116}
5117
5118/* --------------------------------------------------------------------- */
5119/* Function : XGI_IsLCDON */
5120/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005121/* Output : 0 : Skip PSC Control */
5122/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005123/* Description : */
5124/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005125static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005126{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305127 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 tempax = pVBInfo->VBInfo;
5130 if (tempax & SetCRT2ToDualEdge)
5131 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01005132 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305133 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005134
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305135 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005136}
5137
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005138/* --------------------------------------------------------------------- */
5139/* Function : XGI_DisableChISLCD */
5140/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04005141/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005142/* Description : */
5143/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005144static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005145{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305146 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005147
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305148 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005149 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005150
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305151 if (tempbx & (EnableChA | DisableChA)) {
5152 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5153 return 0;
5154 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005155
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305156 if (!(tempbx & (EnableChB | DisableChB)))
5157 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305159 if (tempah & 0x01) /* Chk LCDB Mode */
5160 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005163}
5164
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005165/* --------------------------------------------------------------------- */
5166/* Function : XGI_EnableChISLCD */
5167/* Input : */
5168/* Output : 0 -> Not LCD mode */
5169/* Description : */
5170/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005171static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005172{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305173 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305175 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005176 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305178 if (tempbx & (EnableChA | DisableChA)) {
5179 if (!(tempah & 0x08)) /* Chk LCDA Mode */
5180 return 0;
5181 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005182
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305183 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04005184 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305186 if (tempah & 0x01) /* Chk LCDB Mode */
5187 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005188
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305189 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005190}
5191
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005192static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
5193 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305194 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005195{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005196 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005197
Peter Huewe6896b942012-02-09 21:11:46 +01005198 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5199 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305200 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005201 if (!(pVBInfo->VBInfo &
5202 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005203 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305204 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5205 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005206 if (!(pVBInfo->VBInfo &
5207 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005208 /* Disable Channel B */
5209 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005210
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305211 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005212 /* force to disable Cahnnel */
5213 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305215 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005216 /* Force to disable Channel B */
5217 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305218 }
5219 }
5220 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005221
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005222 /* disable part4_1f */
5223 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005224
Peter Huewe6896b942012-02-09 21:11:46 +01005225 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005226 if (((pVBInfo->VBInfo &
5227 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5228 || (XGI_DisableChISLCD(pVBInfo))
5229 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005230 /* LVDS Driver power down */
5231 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305232 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005233
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305234 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005235 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305236 | SetSimuScanMode))) {
5237 if (pVBInfo->SetFlag & GatingCRT)
5238 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005239 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305240 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005241
Peter Huewea3d675c2012-02-09 21:11:47 +01005242 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305243 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01005244 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005245 /* Power down */
5246 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005248
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005249 /* disable TV as primary VGA swap */
5250 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005251
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305252 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02005253 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005254
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005255 if ((pVBInfo->SetFlag & DisableChB) ||
5256 (pVBInfo->VBInfo &
5257 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005258 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005259 (pVBInfo->VBInfo &
5260 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005261 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005262
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005263 if ((pVBInfo->SetFlag & DisableChB) ||
5264 (pVBInfo->VBInfo &
5265 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01005266 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005267 (pVBInfo->VBInfo &
5268 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
5269 /* save Part1 index 0 */
5270 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5271 /* BTDAC = 1, avoid VB reset */
5272 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
5273 /* disable CRT2 */
5274 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5275 /* restore Part1 index 0 */
5276 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305277 }
5278 } else { /* {301} */
5279 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005280 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
5281 /* Disable CRT2 */
5282 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
5283 /* Disable TV asPrimary VGA swap */
5284 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305285 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005286
Peter Huewea3d675c2012-02-09 21:11:47 +01005287 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305288 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005289 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305290 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005291}
5292
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005293/* --------------------------------------------------------------------- */
5294/* Function : XGI_GetTVPtrIndex */
5295/* Input : */
5296/* Output : */
5297/* Description : bx 0 : ExtNTSC */
5298/* 1 : StNTSC */
5299/* 2 : ExtPAL */
5300/* 3 : StPAL */
5301/* 4 : ExtHiTV */
5302/* 5 : StHiTV */
5303/* 6 : Ext525i */
5304/* 7 : St525i */
5305/* 8 : Ext525p */
5306/* 9 : St525p */
5307/* A : Ext750p */
5308/* B : St750p */
5309/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005310static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005311{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005313
Peter Huewe599801f2012-02-09 21:11:45 +01005314 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305315 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01005316 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305317 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005318 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305319 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01005320 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305321 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01005322 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305323 tempbx = 10;
5324 if (pVBInfo->TVInfo & TVSimuMode)
5325 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005326
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305327 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005328}
5329
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005330/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005331/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005332/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005333/* Output : bx 0 : NTSC */
5334/* 1 : PAL */
5335/* 2 : PALM */
5336/* 3 : PALN */
5337/* 4 : NTSC1024x768 */
5338/* 5 : PAL-M 1024x768 */
5339/* 6-7: reserved */
5340/* cl 0 : YFilter1 */
5341/* 1 : YFilter2 */
5342/* ch 0 : 301A */
5343/* 1 : 301B/302B/301LV/302LV */
5344/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005345/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005346static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5347 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005348{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005349 *tempbx = 0;
5350 *tempcl = 0;
5351 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005352
Peter Huewe599801f2012-02-09 21:11:45 +01005353 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005354 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005355
Peter Huewe599801f2012-02-09 21:11:45 +01005356 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005357 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005358
Peter Huewe599801f2012-02-09 21:11:45 +01005359 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005360 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005361
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005362 if (pVBInfo->TVInfo & NTSC1024x768) {
5363 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005364 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005365 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305366 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005367
Peter Huewe6896b942012-02-09 21:11:46 +01005368 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5369 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005370 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5371 & TVSimuMode)) {
5372 *tempbx += 8;
5373 *tempcl += 1;
5374 }
5375 }
5376
Peter Huewe6896b942012-02-09 21:11:46 +01005377 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5378 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005379 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005380}
5381
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005382static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005383{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305384 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005385
Peter Huewe6896b942012-02-09 21:11:46 +01005386 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5387 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005388 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305389 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305390 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005391 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305393 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5394 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005395 if (pVBInfo->VBInfo &
5396 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005397 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005398
Peter Huewea3d675c2012-02-09 21:11:47 +01005399 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305400 tempbl = tempbh;
5401 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005402
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305403 tempbl &= 0x0F;
5404 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005405 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5408 | SetCRT2ToTV)) { /* Channel B */
5409 tempah &= 0xF0;
5410 tempah |= tempbl;
5411 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005412
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005413 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5414 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305415 tempah &= 0x0F;
5416 tempah |= tempbh;
5417 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005418 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305419 }
5420 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5421 tempbl = 0;
5422 tempbh = 0;
5423 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005424 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305425 tempah &= 0x0f;
5426 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005427 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305428 tempah);
5429 }
5430 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005431}
5432
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005433static void XGI_SetLCDCap_A(unsigned short tempcx,
5434 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005435{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305436 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005437
Aaro Koskinen58839b02011-03-13 12:26:23 +02005438 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305440 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005441 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005442 /* Enable Dither */
5443 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005444 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305445 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005446 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305447 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005448 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305449 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005450}
5451
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005452/* --------------------------------------------------------------------- */
5453/* Function : XGI_SetLCDCap_B */
5454/* Input : cx -> LCD Capability */
5455/* Output : */
5456/* Description : */
5457/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005458static void XGI_SetLCDCap_B(unsigned short tempcx,
5459 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005460{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005462 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305463 (unsigned short) (((tempcx & 0x00ff) >> 6)
5464 | 0x0c));
5465 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005466 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305467 (unsigned short) (((tempcx & 0x00ff) >> 6)
5468 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005469}
5470
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005471static void XGI_LongWait(struct vb_device_info *pVBInfo)
5472{
5473 unsigned short i;
5474
5475 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5476
5477 if (!(i & 0xC0)) {
5478 for (i = 0; i < 0xFFFF; i++) {
5479 if (!(inb(pVBInfo->P3da) & 0x08))
5480 break;
5481 }
5482
5483 for (i = 0; i < 0xFFFF; i++) {
5484 if ((inb(pVBInfo->P3da) & 0x08))
5485 break;
5486 }
5487 }
5488}
5489
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005490static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005491{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305492 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005493
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305494 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005495
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005496 /* disable down spectrum D[4] */
5497 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305498 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005499 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305500 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005501
Aaro Koskinen8104e322011-03-13 12:26:22 +02005502 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305503 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005504 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305505 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005506 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305507 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005508 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305509 pVBInfo->LCDCapList[index].Spectrum_34);
5510 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005511 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005512}
5513
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005514static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5515{
5516 unsigned short tempcx;
5517
5518 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5519
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005520 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005521 (VB_SIS301B |
5522 VB_SIS302B |
5523 VB_SIS301LV |
5524 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005525 VB_XGI301C)) { /* 301LV/302LV only */
5526 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005527 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005528 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005529 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005530 (unsigned char) (tempcx & 0x1F));
5531 }
5532 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005533 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005534 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5535 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5536 | EnablePLLSPLOW)) >> 8));
5537 }
5538
Peter Huewe6896b942012-02-09 21:11:46 +01005539 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5540 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005541 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5542 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005543 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005544 XGI_SetLCDCap_A(tempcx, pVBInfo);
5545
Peter Huewe6896b942012-02-09 21:11:46 +01005546 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005547 if (tempcx & EnableSpectrum)
5548 SetSpectrum(pVBInfo);
5549 }
5550 } else {
5551 /* LVDS,CH7017 */
5552 XGI_SetLCDCap_A(tempcx, pVBInfo);
5553 }
5554}
5555
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005556/* --------------------------------------------------------------------- */
5557/* Function : XGI_SetAntiFlicker */
5558/* Input : */
5559/* Output : */
5560/* Description : Set TV Customized Param. */
5561/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005562static void XGI_SetAntiFlicker(unsigned short ModeNo,
5563 unsigned short ModeIdIndex,
5564 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005565{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005566 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005567
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305568 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005569
Peter Huewe599801f2012-02-09 21:11:45 +01005570 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305571 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005572
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305573 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5574 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305575 tempah = TVAntiFlickList[tempbx];
5576 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005577
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005578 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005579}
5580
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005581static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5582 unsigned short ModeIdIndex,
5583 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005584{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005585 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005586
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305587 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305589 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5590 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305591 tempah = TVEdgeList[tempbx];
5592 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005593
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005594 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005595}
5596
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005597static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005598{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305599 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005600
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305601 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305603 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305605 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5606 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005607
Aaro Koskinen8104e322011-03-13 12:26:22 +02005608 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305609 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005610 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305611 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005612 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305613 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005614 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305615 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005616}
5617
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005618static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305619 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005620{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305621 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005622
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305623 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005624
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305625 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005626
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305627 switch (tempbx) {
5628 case 0x00:
5629 case 0x04:
5630 filterPtr = NTSCYFilter1;
5631 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305633 case 0x01:
5634 filterPtr = PALYFilter1;
5635 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005636
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305637 case 0x02:
5638 case 0x05:
5639 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305640 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005641 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305642 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305644 case 0x08:
5645 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305646 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305647 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305648 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005649 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305650 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005651
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305652 default:
5653 return;
5654 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005655
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005656 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305657 if (tempcl == 0)
5658 index = tempal * 4;
5659 else
5660 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005661
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305662 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005663 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5664 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5665 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5666 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305667 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005668 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5669 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5670 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5671 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305672 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005673
Peter Huewe6896b942012-02-09 21:11:46 +01005674 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5675 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005676 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5677 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5678 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305679 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005680}
5681
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005682/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005683/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005684/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005685/* Output : */
5686/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005687/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005688static void XGI_OEM310Setting(unsigned short ModeNo,
5689 unsigned short ModeIdIndex,
5690 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005691{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005692 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005693
Peter Huewea3d675c2012-02-09 21:11:47 +01005694 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005695 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005696
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005697 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005698 XGI_SetPhaseIncr(pVBInfo);
5699 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5700 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005701
Peter Huewe6896b942012-02-09 21:11:46 +01005702 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005703 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305704 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005705}
5706
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005707/* --------------------------------------------------------------------- */
5708/* Function : XGI_SetCRT2ModeRegs */
5709/* Input : */
5710/* Output : */
5711/* Description : Origin code for crt2group */
5712/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005713static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305714 struct xgi_hw_device_info *HwDeviceExtension,
5715 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005716{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305717 unsigned short tempbl;
5718 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305720 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005721
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305722 tempah = 0;
5723 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005724 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305725 tempah &= ~0x10; /* BTRAMDAC */
5726 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305728 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5729 | SetCRT2ToLCD)) {
5730 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005731 tempcl = pVBInfo->ModeType;
5732 tempcl -= ModeVGA;
5733 if (tempcl >= 0) {
5734 /* BT Color */
5735 tempah = (0x008 >> tempcl);
5736 if (tempah == 0)
5737 tempah = 1;
5738 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305739 }
5740 if (pVBInfo->VBInfo & SetInSlaveMode)
5741 tempah ^= 0x50; /* BTDAC */
5742 }
5743 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005744
Aaro Koskinen8104e322011-03-13 12:26:22 +02005745 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305746 tempah = 0x08;
5747 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005748
Miguel Gómeze123e462012-07-06 12:40:52 +02005749 if (pVBInfo->VBInfo & DisableCRT2Display)
5750 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005751
Miguel Gómeze123e462012-07-06 12:40:52 +02005752 tempah = 0x00;
5753 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005754
Miguel Gómeze123e462012-07-06 12:40:52 +02005755 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5756 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5757 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005758
Miguel Gómeze123e462012-07-06 12:40:52 +02005759 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5760 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5761 tempbl &= 0xf7;
5762 tempah |= 0x01;
5763 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305764 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005765
Miguel Gómeze123e462012-07-06 12:40:52 +02005766 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5767 tempbl &= 0xf7;
5768 tempah |= 0x01;
5769 }
5770
5771 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5772 goto reg_and_or;
5773
5774 tempbl &= 0xf8;
5775 tempah = 0x01;
5776
5777 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5778 tempah |= 0x02;
5779
5780 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5781 tempah = tempah ^ 0x05;
5782 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5783 tempah = tempah ^ 0x01;
5784 }
5785
5786 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5787 tempah |= 0x08;
5788
5789reg_and_or:
5790 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5791
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305792 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005793 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305794 tempah &= (~0x08);
5795 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5796 & SetInSlaveMode))) {
5797 tempah |= 0x010;
5798 }
5799 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005800
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305801 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305802 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005803 if (pVBInfo->VBInfo & DriverMode)
5804 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305805 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005806
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005807 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305808 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305810 if (pVBInfo->LCDInfo & SetLCDDualLink)
5811 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305813 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305814 if (pVBInfo->TVInfo & RPLLDIV2XO)
5815 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305816 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005817
Peter Huewe255aabd2012-02-09 21:11:44 +01005818 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5819 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305820 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005821
Peter Huewe255aabd2012-02-09 21:11:44 +01005822 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305823 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005824
Aaro Koskinen8104e322011-03-13 12:26:22 +02005825 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305826 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005827
Peter Huewe6896b942012-02-09 21:11:46 +01005828 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5829 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305830 tempah = 0;
5831 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005832
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305833 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5834 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005835 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305836 tempah |= 0x04; /* shampoo 0129 */
5837 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005838
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005839 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305840 tempah = 0x00;
5841 tempbl = 0xcf;
5842 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5843 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5844 tempah |= 0x30;
5845 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005846
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005847 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305848 tempah = 0;
5849 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305851 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5852 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5853 tempah |= 0xc0;
5854 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005855 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305856 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005857
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305858 tempah = 0;
5859 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005860 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305861 tempbl = 0xff;
5862 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5863 tempah |= 0x80;
5864 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005865
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005866 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005867
Peter Huewe6896b942012-02-09 21:11:46 +01005868 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305869 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005870 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5871 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305872 }
5873 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005874}
5875
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005876
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305877void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5878 struct vb_device_info *pVBInfo)
5879{
5880
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005881 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005882
5883}
5884
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305885void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5886 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005887{
5888
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005889 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005890
5891}
5892
Bill Pemberton80adad82010-06-17 13:10:51 -04005893unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005894{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305895 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005896
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305897 if (pVBInfo->IF_DEF_LVDS == 1) {
5898 return 1;
5899 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005900 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305901 if ((flag == 1) || (flag == 2))
5902 return 1; /* 301b */
5903 else
5904 return 0;
5905 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005906}
5907
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005908unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5909 unsigned short ModeNo, unsigned short ModeIdIndex,
5910 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005911{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005912 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
5913 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
5914 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005915
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005916 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005917
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005918 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005919
Aaro Koskinen58839b02011-03-13 12:26:23 +02005920 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005921 index = index >> pVBInfo->SelectCRT2Rate;
5922 index &= 0x0F;
5923
5924 if (pVBInfo->LCDInfo & LCDNonExpanding)
5925 index = 0;
5926
5927 if (index > 0)
5928 index--;
5929
5930 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005931 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005932 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01005933 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5934 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005935 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005936 /* 301b */
5937 temp = LCDARefreshIndex[
5938 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005939 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005940 temp = LCDRefreshIndex[
5941 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005942
5943 if (index > temp)
5944 index = temp;
5945 } else {
5946 index = 0;
5947 }
5948 }
5949 }
5950
5951 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
5952 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
5953 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005954 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
5955 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005956 index++;
5957 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005958 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005959 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5960 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005961 index++;
5962 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005963 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5964 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005965 index++;
5966 }
5967 }
5968
5969 i = 0;
5970 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005971 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
5972 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005973 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005974 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
5975 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01005976 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005977 if (temp < pVBInfo->ModeType)
5978 break;
5979 i++;
5980 index--;
5981
5982 } while (index != 0xFFFF);
5983 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5984 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005985 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
5986 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005987 if (temp & InterlaceMode)
5988 i++;
5989 }
5990 }
5991 i--;
5992 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
5993 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
5994 RefreshRateTableIndex, &i, pVBInfo);
5995 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02005996 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005997}
5998
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005999static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05306000 struct xgi_hw_device_info *HwDeviceExtension,
6001 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006002{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006003 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006004
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006005 pVBInfo->SetFlag |= ProgrammingCRT2;
6006 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6007 ModeIdIndex, pVBInfo);
6008 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
6009 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6010 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6011 HwDeviceExtension, pVBInfo);
6012 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6013 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006014}
6015
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02006016static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006017 struct xgi_hw_device_info *HwDeviceExtension,
6018 struct vb_device_info *pVBInfo)
6019{
6020 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
6021
6022 tempbx = pVBInfo->VBInfo;
6023 pVBInfo->SetFlag |= ProgrammingCRT2;
6024 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6025 pVBInfo->SelectCRT2Rate = 4;
6026 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6027 ModeIdIndex, pVBInfo);
6028 XGI_SaveCRT2Info(ModeNo, pVBInfo);
6029 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
6030 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6031 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6032 RefreshRateTableIndex, pVBInfo);
6033 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
6034 RefreshRateTableIndex, pVBInfo);
6035 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6036 RefreshRateTableIndex, pVBInfo);
6037 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6038 HwDeviceExtension, pVBInfo);
6039 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
6040 RefreshRateTableIndex, pVBInfo);
6041 XGI_SetTap4Regs(pVBInfo);
6042 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
6043 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6044 HwDeviceExtension, pVBInfo);
6045 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6046 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
6047 XGI_AutoThreshold(pVBInfo);
6048 return 1;
6049}
6050
6051void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
6052{
6053 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
6054 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
6055 0x05, 0x00 };
6056
6057 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
6058
6059 unsigned char CR17, CR63, SR31;
6060 unsigned short temp;
6061 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
6062
6063 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006064 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006065
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006066 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02006067 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02006068 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006069 pVBInfo->P3d4, 0x53) | 0x02));
6070
Aaro Koskinen58839b02011-03-13 12:26:23 +02006071 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
6072 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
6073 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006074
Aaro Koskinen8104e322011-03-13 12:26:22 +02006075 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
6076 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006077
Aaro Koskinen58839b02011-03-13 12:26:23 +02006078 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006079 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006080
Aaro Koskinen58839b02011-03-13 12:26:23 +02006081 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006082 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006083
Aaro Koskinen58839b02011-03-13 12:26:23 +02006084 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006085 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02006086 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02006087 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006088
Aaro Koskinen8104e322011-03-13 12:26:22 +02006089 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006090
6091 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006092 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006093
6094 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006095 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006096 CRTCData[i]);
6097
6098 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006099 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006100 CRTCData[i]);
6101
6102 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02006103 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006104 CRTCData[i]);
6105
Aaro Koskinen8104e322011-03-13 12:26:22 +02006106 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006107 & 0xE0));
6108
Aaro Koskinen8104e322011-03-13 12:26:22 +02006109 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
6110 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
6111 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006112
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006113 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006114
6115 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006116 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
6117 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
6118 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006119 }
6120
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006121 mdelay(1);
6122
6123 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02006124 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006125
6126 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006127 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006128 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006129 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006130
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006131 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006132 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006133
6134 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02006135 outb(0, (pVBInfo->P3c8 + 1));
6136 outb(0, (pVBInfo->P3c8 + 1));
6137 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006138 }
6139
Aaro Koskinen8104e322011-03-13 12:26:22 +02006140 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
6141 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
6142 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006143
Aaro Koskinen58839b02011-03-13 12:26:23 +02006144 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006145 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02006146 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006147}
6148
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006149static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
6150 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006151 struct vb_device_info *pVBInfo)
6152{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02006153 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006154
Peter Huewe6896b942012-02-09 21:11:46 +01006155 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6156 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006157 if (!(pVBInfo->SetFlag & DisableChA)) {
6158 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006159 /* Power on */
6160 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006161 } else if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
6162 /* Power on */
6163 xgifb_reg_set(pVBInfo->Part1Port,
6164 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006165 }
6166 }
6167
6168 if (!(pVBInfo->SetFlag & DisableChB)) {
6169 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
6170 & (SetCRT2ToLCD | SetCRT2ToTV
6171 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006172 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006173 pVBInfo->P3c4, 0x32);
6174 tempah &= 0xDF;
6175 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006176 if (!(pVBInfo->VBInfo &
6177 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006178 tempah |= 0x20;
6179 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02006180 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006181 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006182
Aaro Koskinen58839b02011-03-13 12:26:23 +02006183 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006184 pVBInfo->Part1Port, 0x2E);
6185
6186 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02006187 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006188 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006189 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006190 }
6191 }
6192
6193 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
6194 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02006195 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006196 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01006197 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006198 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006199 if (XGI_EnableChISLCD(pVBInfo) ||
6200 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01006201 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006202 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02006203 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006204 pVBInfo->Part4Port,
6205 0x2A,
6206 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006207 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006208 /* LVDS Driver power on */
6209 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006210 }
6211 }
6212
6213 tempah = 0x00;
6214
6215 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
6216 tempah = 0xc0;
6217
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006218 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
6219 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
6220 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
6221 tempah = tempah & 0x40;
6222 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
6223 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006224
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006225 if (pVBInfo->SetFlag & DisableChB)
6226 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006227
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006228 if (pVBInfo->SetFlag & DisableChA)
6229 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006230
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006231 if (pVBInfo->SetFlag & EnableChB)
6232 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006233
Miguel Gómezb1bf9982012-07-06 12:40:51 +02006234 if (pVBInfo->SetFlag & EnableChA)
6235 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006236 }
6237 }
6238
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006239 /* EnablePart4_1F */
6240 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006241
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006242 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006243 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006244 XGI_DisableGatingCRT(HwDeviceExtension,
6245 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006246 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
6247 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006248 }
6249 }
6250 } /* 301 */
6251 else { /* LVDS */
6252 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01006253 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006254 /* enable CRT2 */
6255 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006256
Aaro Koskinen58839b02011-03-13 12:26:23 +02006257 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006258 0x2E);
6259 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006260 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006261
Aaro Koskinendc505562011-03-13 12:26:26 +02006262 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006263 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006264 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006265}
6266
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006267static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
6268 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006269 unsigned short ModeNo, unsigned short ModeIdIndex,
6270 struct vb_device_info *pVBInfo)
6271{
Aaro Koskinena1579612012-04-07 01:14:05 +03006272 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006273
Aaro Koskinena1579612012-04-07 01:14:05 +03006274 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03006275 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03006276 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
6277 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
6278 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006279 XGI_ClearExt1Regs(pVBInfo);
6280
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006281 if (HwDeviceExtension->jChipType == XG27) {
6282 if (pVBInfo->IF_DEF_LVDS == 0)
6283 XGI_SetDefaultVCLK(pVBInfo);
6284 }
6285
6286 temp = ~ProgrammingCRT2;
6287 pVBInfo->SetFlag &= temp;
6288 pVBInfo->SelectCRT2Rate = 0;
6289
Peter Huewe6896b942012-02-09 21:11:46 +01006290 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
6291 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01006292 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006293 | SetInSlaveMode)) {
6294 pVBInfo->SetFlag |= ProgrammingCRT2;
6295 }
6296 }
6297
6298 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
6299 ModeIdIndex, pVBInfo);
6300 if (RefreshRateTableIndex != 0xFFFF) {
6301 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
6302 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6303 pVBInfo, HwDeviceExtension);
6304 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
6305 RefreshRateTableIndex, pVBInfo);
6306 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6307 HwDeviceExtension, pVBInfo);
6308 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
6309 RefreshRateTableIndex, pVBInfo);
6310 }
6311
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006312 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006313 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006314 if (temp & 0xA0) {
6315
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006316 if (HwDeviceExtension->jChipType == XG27)
6317 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
6318 RefreshRateTableIndex, pVBInfo);
6319 else
6320 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
6321 RefreshRateTableIndex, pVBInfo);
6322
6323 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
6324 RefreshRateTableIndex);
6325
Aaro Koskinen105d8d02011-08-31 21:46:00 +03006326 xgifb_set_lcd(HwDeviceExtension->jChipType,
6327 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006328
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006329 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006330 xgifb_set_lvds(xgifb_info,
6331 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006332 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006333 }
6334 }
6335
6336 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6337 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6338 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6339 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006340 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006341}
6342
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006343unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6344 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006345 unsigned short ModeNo)
6346{
6347 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006348 struct vb_device_info VBINF;
6349 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006350 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006351 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006352
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006353 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006354 pVBInfo->IF_DEF_YPbPr = 0;
6355 pVBInfo->IF_DEF_HiVision = 0;
6356 pVBInfo->IF_DEF_CRT2Monitor = 0;
6357 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006358 } else {
6359 pVBInfo->IF_DEF_YPbPr = 1;
6360 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006361 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006362 }
6363
6364 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6365 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6366 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6367 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6368 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6369 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6370 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6371 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6372 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6373 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6374 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6375 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6376 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006377 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6378 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6379 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6380 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6381 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006382
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006383 /* for x86 Linux, XG21 LVDS */
6384 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006385 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006386 pVBInfo->IF_DEF_LVDS = 1;
6387 }
6388 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006389 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6390 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006391 pVBInfo->IF_DEF_LVDS = 1;
6392 }
6393 }
6394
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006395 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006396 XGI_GetVBType(pVBInfo);
6397
6398 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006399 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006400 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006401 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006402
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006403 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006404 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6405
6406 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6407
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006408 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006409 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6410 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6411 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006412 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006413
Peter Huewea3d675c2012-02-09 21:11:47 +01006414 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006415 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006416 ModeIdIndex, pVBInfo);
6417
Peter Huewea3d675c2012-02-09 21:11:47 +01006418 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006419 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6420 HwDeviceExtension, pVBInfo);
6421 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006422 } else if (!(pVBInfo->VBInfo & SwitchCRT2)) {
6423 XGI_SetCRT1Group(xgifb_info,
6424 HwDeviceExtension, ModeNo,
6425 ModeIdIndex, pVBInfo);
6426 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6427 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6428 HwDeviceExtension,
6429 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006430 }
6431 }
6432
Peter Huewe6896b942012-02-09 21:11:46 +01006433 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006434 switch (HwDeviceExtension->ujVBChipID) {
6435 case VB_CHIP_301:
6436 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6437 pVBInfo); /*add for CRT2 */
6438 break;
6439
6440 case VB_CHIP_302:
6441 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6442 pVBInfo); /*add for CRT2 */
6443 break;
6444
6445 default:
6446 break;
6447 }
6448 }
6449
6450 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6451 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006452 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006453 } /* !XG20 */
6454 else {
6455 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006456 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006457 ModeIdIndex,
6458 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006459 return 0;
6460
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006461 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006462 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006463
6464 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006465 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006466
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006467 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006468
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006469 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6470 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006471
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006472 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006473 }
6474
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006475 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6476
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006477 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006478 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006479
6480 return 1;
6481}