blob: 9aa923cfdfdf7c3a2ab318a22ad515ba3129cf14 [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 Koskinen6c27b372012-11-04 21:14:45 +02001313 unsigned short i, tempdx, tempbx, modeflag;
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;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001320
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001321 switch (tempbx) {
1322 case 0:
Aaro Koskinen515e9a602012-11-04 21:14:43 +02001323 tempdi = xgifb_epllcd_crt1_h;
1324 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001325 case 1:
Aaro Koskinen515e9a602012-11-04 21:14:43 +02001326 tempdi = xgifb_epllcd_crt1_v;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001327 break;
1328 case 2:
1329 tempdi = XGI_EPLLCDDataPtr;
1330 break;
1331 case 3:
1332 tempdi = XGI_EPLLCDDesDataPtr;
1333 break;
1334 case 4:
1335 tempdi = XGI_LCDDataTable;
1336 break;
1337 case 5:
Aaro Koskinen3e779fc2012-11-04 21:14:42 +02001338 if ((pVBInfo->VBType & VB_SIS301LV) ||
1339 (pVBInfo->VBType & VB_SIS302LV))
1340 tempdi = xgifb_lcddldes;
1341 else
1342 tempdi = XGI_LCDDesDataTable;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001343 break;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001344 default:
1345 break;
1346 }
1347
1348 if (tempdi == NULL) /* OEMUtil */
1349 return NULL;
1350
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001351 i = 0;
1352
1353 while (tempdi[i].PANELID != 0xff) {
1354 tempdx = pVBInfo->LCDResInfo;
1355 if (tempbx & 0x0080) { /* OEMUtil */
1356 tempbx &= (~0x0080);
1357 tempdx = pVBInfo->LCDTypeInfo;
1358 }
1359
1360 if (pVBInfo->LCDInfo & EnableScalingLCD)
1361 tempdx &= (~PanelResInfo);
1362
1363 if (tempdi[i].PANELID == tempdx) {
1364 tempbx = tempdi[i].MASK;
1365 tempdx = pVBInfo->LCDInfo;
1366
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001367 if (modeflag & HalfDCLK)
1368 tempdx |= SetLCDLowResolution;
1369
1370 tempbx &= tempdx;
1371 if (tempbx == tempdi[i].CAP)
1372 break;
1373 }
1374 i++;
1375 }
1376
Aaro Koskinen47367832012-11-04 21:14:44 +02001377 return tempdi[i].DATAPTR;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001378}
1379
Aaro Koskinen24572542012-09-11 00:15:21 +03001380static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001381 unsigned short ModeIdIndex,
1382 unsigned short RefreshRateTableIndex,
1383 struct vb_device_info *pVBInfo)
1384{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001385 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001386
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001387 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1388 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001389 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001390 tempdx = pVBInfo->TVInfo;
1391
1392 if (pVBInfo->VBInfo & SetInSlaveMode)
1393 tempdx = tempdx | SetTVLockMode;
1394
1395 if (modeflag & HalfDCLK)
1396 tempdx = tempdx | SetTVLowResolution;
1397
1398 i = 0;
1399
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001400 while (XGI_TVDataTable[i].MASK != 0xffff) {
1401 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1402 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001403 break;
1404 i++;
1405 }
1406
Aaro Koskinen18ba8662012-09-11 00:15:22 +03001407 return &XGI_TVDataTable[i].DATAPTR[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001408}
1409
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001410static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301411 unsigned short RefreshRateTableIndex,
1412 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001413{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301414 unsigned short tempbx;
Peter Huewe51f984b2012-06-14 00:21:51 +02001415 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301417 tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001418
Peter Huewea3d675c2012-02-09 21:11:47 +01001419 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001420 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1421 RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301422 pVBInfo->VGAHT = LCDPtr->VGAHT;
1423 pVBInfo->VGAVT = LCDPtr->VGAVT;
1424 pVBInfo->HT = LCDPtr->LCDHT;
1425 pVBInfo->VT = LCDPtr->LCDVT;
1426 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001427
Peter Huewea3d675c2012-02-09 21:11:47 +01001428 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301429 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1430 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001431 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1432 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301433 pVBInfo->HDE = 1024;
1434 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001435 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001436 (pVBInfo->LCDResInfo ==
1437 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301438 pVBInfo->HDE = 1280;
1439 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001440 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301441 pVBInfo->HDE = 1400;
1442 pVBInfo->VDE = 1050;
1443 } else {
1444 pVBInfo->HDE = 1600;
1445 pVBInfo->VDE = 1200;
1446 }
1447 }
1448 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001449}
1450
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001451static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301452 unsigned short RefreshRateTableIndex,
1453 struct xgi_hw_device_info *HwDeviceExtension,
1454 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001455{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301456 unsigned char index;
1457 unsigned short tempbx, i;
1458 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1459 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001460
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001461 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301462 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001463
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001464 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001465
Peter Huewea3d675c2012-02-09 21:11:47 +01001466 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001467 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1468 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001469
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001470 for (i = 0; i < 8; i++)
1471 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301472 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001473
1474 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1475
1476 tempbx = 1;
1477
Peter Huewea3d675c2012-02-09 21:11:47 +01001478 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001479 LCDPtr1 = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1480 RefreshRateTableIndex, pVBInfo);
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001481 for (i = 0; i < 7; i++)
1482 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1483 }
1484
1485 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001486}
1487
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001488static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1489{
1490 unsigned char tempal, tempah, tempbl, i;
1491
Aaro Koskinen58839b02011-03-13 12:26:23 +02001492 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001493 tempal = tempah & 0x0F;
1494 tempah = tempah & 0xF0;
1495 i = 0;
1496 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1497
1498 while (tempbl != 0xFF) {
1499 if (tempbl & 0x80) { /* OEMUtil */
1500 tempal = tempah;
1501 tempbl = tempbl & ~(0x80);
1502 }
1503
1504 if (tempal == tempbl)
1505 break;
1506
1507 i++;
1508
1509 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1510 }
1511
1512 return i;
1513}
1514
1515static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1516{
1517 unsigned short tempah, tempal, tempbl, i;
1518
1519 tempal = pVBInfo->LCDResInfo;
1520 tempah = pVBInfo->LCDTypeInfo;
1521
1522 i = 0;
1523 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1524
1525 while (tempbl != 0xFF) {
1526 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1527 tempal = tempah;
1528 tempbl &= ~0x80;
1529 }
1530
1531 if (tempal == tempbl)
1532 break;
1533
1534 i++;
1535 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1536 }
1537
1538 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001539 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001540 pVBInfo->LCDTypeInfo = 0;
1541 i = 0;
1542 }
1543
1544 return i;
1545}
1546
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001547static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1548 unsigned short *VSyncWidth,
1549 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001550{
1551 unsigned short Index;
1552
1553 Index = XGI_GetLCDCapPtr(pVBInfo);
1554 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1555 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1556
1557 return;
1558}
1559
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001560static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301561 unsigned short RefreshRateTableIndex,
1562 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001563{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301564 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1565 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03001566 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301567 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001568
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001569 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03001570 tempbx = 3;
1571 if (pVBInfo->LCDInfo & EnableScalingLCD)
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001572 LCDPtr1 = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1573 RefreshRateTableIndex, pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03001574 else
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001575 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
1576 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001577
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001578 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1579 push1 = tempbx;
1580 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001581
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001582 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01001583 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1584 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001585 tempax = 1024;
1586 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001587 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1588 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001589 tempax = 1280;
1590 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001591 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001592 tempax = 1400;
1593 tempbx = 1050;
1594 } else {
1595 tempax = 1600;
1596 tempbx = 1200;
1597 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001598
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001599 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1600 pVBInfo->HDE = tempax;
1601 pVBInfo->VDE = tempbx;
1602 pVBInfo->VGAHDE = tempax;
1603 pVBInfo->VGAVDE = tempbx;
1604 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001605
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001606 tempax = pVBInfo->HT;
1607
1608 if (pVBInfo->LCDInfo & EnableScalingLCD)
1609 tempbx = LCDPtr1->LCDHDES;
1610 else
1611 tempbx = LCDPtr->LCDHDES;
1612
1613 tempcx = pVBInfo->HDE;
1614 tempbx = tempbx & 0x0fff;
1615 tempcx += tempbx;
1616
1617 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001618 tempcx -= tempax;
1619
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001620 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001621
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001622 tempcx = tempcx >> 3;
1623 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001624
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001625 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1626 (unsigned short) (tempbx & 0xff));
1627 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1628 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001629
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001630 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001631
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001632 if (pVBInfo->LCDInfo & EnableScalingLCD)
1633 tempbx = LCDPtr1->LCDHRS;
1634 else
1635 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001636
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001637 tempcx = push2;
1638
1639 if (pVBInfo->LCDInfo & EnableScalingLCD)
1640 tempcx = LCDPtr1->LCDHSync;
1641
1642 tempcx += tempbx;
1643
1644 if (tempcx >= tempax)
1645 tempcx -= tempax;
1646
1647 tempax = tempbx & 0x07;
1648 tempax = tempax >> 5;
1649 tempcx = tempcx >> 3;
1650 tempbx = tempbx >> 3;
1651
1652 tempcx &= 0x1f;
1653 tempax |= tempcx;
1654
1655 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
1656 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
1657 (unsigned short) (tempbx & 0xff));
1658
1659 tempax = pVBInfo->VT;
1660 if (pVBInfo->LCDInfo & EnableScalingLCD)
1661 tempbx = LCDPtr1->LCDVDES;
1662 else
1663 tempbx = LCDPtr->LCDVDES;
1664 tempcx = pVBInfo->VDE;
1665
1666 tempbx = tempbx & 0x0fff;
1667 tempcx += tempbx;
1668 if (tempcx >= tempax)
1669 tempcx -= tempax;
1670
1671 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
1672 (unsigned short) (tempbx & 0xff));
1673 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
1674 (unsigned short) (tempcx & 0xff));
1675
1676 tempbx = (tempbx >> 8) & 0x07;
1677 tempcx = (tempcx >> 8) & 0x07;
1678
1679 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
1680 (unsigned short) ((tempcx << 3)
1681 | tempbx));
1682
1683 tempax = pVBInfo->VT;
1684 if (pVBInfo->LCDInfo & EnableScalingLCD)
1685 tempbx = LCDPtr1->LCDVRS;
1686 else
1687 tempbx = LCDPtr->LCDVRS;
1688
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001689 tempcx = push1;
1690
1691 if (pVBInfo->LCDInfo & EnableScalingLCD)
1692 tempcx = LCDPtr1->LCDVSync;
1693
1694 tempcx += tempbx;
1695 if (tempcx >= tempax)
1696 tempcx -= tempax;
1697
1698 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
1699 (unsigned short) (tempbx & 0xff));
1700 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
1701 (unsigned short) (tempcx & 0x0f));
1702
1703 tempax = ((tempbx >> 8) & 0x07) << 3;
1704
1705 tempbx = pVBInfo->VGAVDE;
1706 if (tempbx != pVBInfo->VDE)
1707 tempax |= 0x40;
1708
Peter Huewea3d675c2012-02-09 21:11:47 +01001709 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001710 tempax |= 0x40;
1711
1712 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
1713 tempax);
1714
1715 tempcx = pVBInfo->VGAVT;
1716 tempbx = pVBInfo->VDE;
1717 tempax = pVBInfo->VGAVDE;
1718 tempcx -= tempax;
1719
1720 temp = tempax; /* 0430 ylshieh */
1721 temp1 = (temp << 18) / tempbx;
1722
1723 tempdx = (unsigned short) ((temp << 18) % tempbx);
1724
1725 if (tempdx != 0)
1726 temp1 += 1;
1727
1728 temp2 = temp1;
1729 push3 = temp2;
1730
1731 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
1732 (unsigned short) (temp2 & 0xff));
1733 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
1734 (unsigned short) ((temp2 >> 8) & 0xff));
1735
1736 tempbx = (unsigned short) (temp2 >> 16);
1737 tempax = tempbx & 0x03;
1738
1739 tempbx = pVBInfo->VGAVDE;
1740 if (tempbx == pVBInfo->VDE)
1741 tempax |= 0x04;
1742
1743 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
1744
1745 if (pVBInfo->VBType & VB_XGI301C) {
1746 temp2 = push3;
1747 xgifb_reg_set(pVBInfo->Part4Port,
1748 0x3c,
1749 (unsigned short) (temp2 & 0xff));
1750 xgifb_reg_set(pVBInfo->Part4Port,
1751 0x3b,
1752 (unsigned short) ((temp2 >> 8) &
1753 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001754 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001755 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
1756 ~0xc0,
1757 (unsigned short) ((tempbx &
1758 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001759
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001760 tempcx = pVBInfo->VGAVDE;
1761 if (tempcx == pVBInfo->VDE)
1762 xgifb_reg_and_or(pVBInfo->Part4Port,
1763 0x30, ~0x0c, 0x00);
1764 else
1765 xgifb_reg_and_or(pVBInfo->Part4Port,
1766 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301767 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001768
1769 tempcx = pVBInfo->VGAHDE;
1770 tempbx = pVBInfo->HDE;
1771
1772 temp1 = tempcx << 16;
1773
1774 tempax = (unsigned short) (temp1 / tempbx);
1775
1776 if ((tempbx & 0xffff) == (tempcx & 0xffff))
1777 tempax = 65535;
1778
1779 temp3 = tempax;
1780 temp1 = pVBInfo->VGAHDE << 16;
1781
1782 temp1 /= temp3;
1783 temp3 = temp3 << 16;
1784 temp1 -= 1;
1785
1786 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
1787
1788 tempax = (unsigned short) (temp3 & 0xff);
1789 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
1790
1791 temp1 = pVBInfo->VGAVDE << 18;
1792 temp1 = temp1 / push3;
1793 tempbx = (unsigned short) (temp1 & 0xffff);
1794
Peter Huewe255aabd2012-02-09 21:11:44 +01001795 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001796 tempbx -= 1;
1797
1798 tempax = ((tempbx >> 8) & 0xff) << 3;
1799 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
1800 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
1801 (unsigned short) (tempax & 0xff));
1802 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
1803 (unsigned short) (tempbx & 0xff));
1804
1805 temp3 = temp3 >> 16;
1806
1807 if (modeflag & HalfDCLK)
1808 temp3 = temp3 >> 1;
1809
1810 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
1811 (unsigned short) ((temp3 >> 8) & 0xff));
1812 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
1813 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001814}
1815
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001816/* --------------------------------------------------------------------- */
1817/* Function : XGI_GETLCDVCLKPtr */
1818/* Input : */
1819/* Output : al -> VCLK Index */
1820/* Description : */
1821/* --------------------------------------------------------------------- */
1822static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
1823 struct vb_device_info *pVBInfo)
1824{
1825 unsigned short index;
1826
Peter Huewea3d675c2012-02-09 21:11:47 +01001827 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001828 index = XGI_GetLCDCapPtr1(pVBInfo);
1829
1830 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
1831 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
1832 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
1833 } else { /* LCDA */
1834 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
1835 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
1836 }
1837 }
1838 return;
1839}
1840
1841static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
1842 unsigned short ModeNo, unsigned short ModeIdIndex,
1843 struct vb_device_info *pVBInfo)
1844{
1845
1846 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001847 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001848
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001849 /* si+Ext_ResInfo */
1850 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001851
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001852 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
1853 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001854 index = XGI_GetLCDCapPtr(pVBInfo);
1855 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
1856
Peter Huewea3d675c2012-02-09 21:11:47 +01001857 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001858 return tempal;
1859
1860 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001861 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01001862 (VB_SIS301B |
1863 VB_SIS302B |
1864 VB_SIS301LV |
1865 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001866 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01001867 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001868 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001869 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001870 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001871 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001872 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001873 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001874 tempal = TVCLKBASE_315 +
1875 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001876
1877 }
1878 return tempal;
1879 }
1880
Peter Huewe599801f2012-02-09 21:11:45 +01001881 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01001882 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001883 return tempal;
1884 }
1885
Peter Huewe599801f2012-02-09 21:11:45 +01001886 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001887 tempal = YPbPr525pVCLK;
1888 return tempal;
1889 }
1890
1891 tempal = NTSC1024VCLK;
1892
1893 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001894 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001895 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001896 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001897 }
1898
1899 if (pVBInfo->VBInfo & SetCRT2ToTV)
1900 return tempal;
1901 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001902 } /* {End of VB} */
1903
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001904 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001905 tempal = tempal >> 2;
1906 tempal &= 0x03;
1907
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001908 /* for Dot8 Scaling LCD */
1909 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001910 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
1911
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001912 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1913 return tempal;
1914}
1915
1916static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
1917 unsigned char *di_1, struct vb_device_info *pVBInfo)
1918{
Peter Huewe6896b942012-02-09 21:11:46 +01001919 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
1920 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001921 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
1922 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinene8cb03d2012-09-11 00:15:31 +03001923 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001924 *di_1 = XGI_VBVCLKData[tempal].Part4_B;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001925 }
1926 } else {
1927 *di_0 = XGI_VCLKData[tempal].SR2B;
1928 *di_1 = XGI_VCLKData[tempal].SR2C;
1929 }
1930}
1931
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001932static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301933 unsigned short RefreshRateTableIndex,
1934 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001935{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301936 unsigned char di_0, di_1, tempal;
1937 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001938
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301939 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
1940 pVBInfo);
1941 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
1942 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001943
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301944 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001945 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301946 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01001947 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301948 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001949 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
1950 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301951 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001952 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
1953 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301954 }
1955 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001956}
1957
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001958static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301959 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001960{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301961 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001962
Peter Huewe6896b942012-02-09 21:11:46 +01001963 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1964 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301965 tempcl = 0;
1966 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001967 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301969 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001970 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301971 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001972 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301973 if (!(temp & 0x40))
1974 tempcl |= ActiveCRT1;
1975 }
1976 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001977
Aaro Koskinen58839b02011-03-13 12:26:23 +02001978 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301979 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001980
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301981 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001982 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001983 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301984 if (tempax & 0x04)
1985 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001986
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301987 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001988
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301989 if (!(tempcl & ActiveLCD))
1990 if (temp == 0x01)
1991 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001992
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301993 if (temp == 0x04)
1994 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001995
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301996 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001997 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001998
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301999 if (!(temp & 0x08))
2000 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302002 if (!(temp & 0x04))
2003 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002004
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302005 if (temp & 0x02)
2006 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002007
Peter Huewe599801f2012-02-09 21:11:45 +01002008 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302009 if (temp & 0x01)
2010 tempch |= ActiveHiTV;
2011 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002012
Peter Huewe599801f2012-02-09 21:11:45 +01002013 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002014 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302015 pVBInfo->Part2Port,
2016 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002017
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302018 if (temp & 0x10)
2019 tempch |= ActiveYPbPr;
2020 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002021
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302022 if (tempch != 0)
2023 tempcl |= ActiveTV;
2024 }
2025 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002026
Aaro Koskinen58839b02011-03-13 12:26:23 +02002027 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302028 if (tempcl & ActiveLCD) {
2029 if ((pVBInfo->SetFlag & ReserveTVOption)) {
2030 if (temp & ActiveTV)
2031 tempcl |= ActiveTV;
2032 }
2033 }
2034 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01002035 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002036 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002037
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302038 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002039 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302040 } else {
2041 return;
2042 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002043}
2044
Bill Pemberton80adad82010-06-17 13:10:51 -04002045void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002046{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302047 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002048
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002049 if (pVBInfo->IF_DEF_LVDS != 0)
2050 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002051
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002052 tempbx = VB_SIS302B;
2053 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2054 if (flag == 0x02)
2055 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002056
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002057 tempbx = VB_SIS301;
2058 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2059 if (flag < 0xB0)
2060 goto finish;
2061
2062 tempbx = VB_SIS301B;
2063 if (flag < 0xC0)
2064 goto bigger_than_0xB0;
2065
2066 tempbx = VB_XGI301C;
2067 if (flag < 0xD0)
2068 goto bigger_than_0xB0;
2069
2070 tempbx = VB_SIS301LV;
2071 if (flag < 0xE0)
2072 goto bigger_than_0xB0;
2073
2074 tempbx = VB_SIS302LV;
2075 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2076 if (tempah != 0xFF)
2077 tempbx = VB_XGI301C;
2078
2079bigger_than_0xB0:
2080 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2081 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2082 if (!(flag & 0x02))
2083 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302084 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002085
2086finish:
2087 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002088}
2089
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002090static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302091 struct xgi_hw_device_info *HwDeviceExtension,
2092 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002093{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302094 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002095
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002096 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302097 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002098 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302099 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002100
Miguel Gómezf9317352012-07-06 12:40:48 +02002101 if (!(pVBInfo->VBType & 0xFFFF))
2102 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002103
Miguel Gómezf9317352012-07-06 12:40:48 +02002104 /* Check Display Device */
2105 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2106 tempbx = tempbx | temp;
2107 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2108 push = temp;
2109 push = push << 8;
2110 tempax = temp << 8;
2111 tempbx = tempbx | tempax;
2112 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2113 | SetInSlaveMode | DisableCRT2Display);
2114 temp = 0xFFFF ^ temp;
2115 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002116
Miguel Gómezf9317352012-07-06 12:40:48 +02002117 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002118
Aaro Koskinen4d8f5ca2012-09-11 00:15:17 +03002119 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002120 if (pVBInfo->VBType &
2121 (VB_SIS302B |
2122 VB_SIS301LV |
2123 VB_SIS302LV |
2124 VB_XGI301C)) {
2125 if (temp & EnableDualEdge) {
2126 tempbx |= SetCRT2ToDualEdge;
2127 if (temp & SetToLCDA)
2128 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002129 }
2130 }
2131 }
2132
2133 if (pVBInfo->IF_DEF_YPbPr == 1) {
2134 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2135 ((pVBInfo->VBType & VB_SIS301LV) ||
2136 (pVBInfo->VBType & VB_SIS302LV) ||
2137 (pVBInfo->VBType & VB_XGI301C)))) {
2138 if (temp & SetYPbPr) {
2139 if (pVBInfo->IF_DEF_HiVision == 1) {
2140 /* shampoo add for new
2141 * scratch */
2142 temp = xgifb_reg_get(
2143 pVBInfo->P3d4,
2144 0x35);
2145 temp &= YPbPrMode;
2146 tempbx |= SetCRT2ToHiVision;
2147
2148 if (temp != YPbPrMode1080i) {
2149 tempbx &=
2150 (~SetCRT2ToHiVision);
2151 tempbx |=
2152 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302153 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302154 }
2155 }
2156 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002158
Miguel Gómezf9317352012-07-06 12:40:48 +02002159 tempax = push; /* restore CR31 */
2160
2161 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302162 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002163 if (pVBInfo->IF_DEF_HiVision == 1)
2164 temp = 0x09FC;
2165 else
2166 temp = 0x097C;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002167 } else if (pVBInfo->IF_DEF_HiVision == 1) {
2168 temp = 0x01FC;
Miguel Gómezf9317352012-07-06 12:40:48 +02002169 } else {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002170 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302171 }
Justin P. Mattock558f7582012-10-02 21:17:11 -07002172 } else { /* 3rd party chip */
Miguel Gómezf9317352012-07-06 12:40:48 +02002173 temp = SetCRT2ToLCD;
2174 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002175
Miguel Gómezf9317352012-07-06 12:40:48 +02002176 if (!(tempbx & temp)) {
2177 tempax |= DisableCRT2Display;
2178 tempbx = 0;
2179 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002180
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002181 if (!(pVBInfo->VBType & VB_NoLCD)) {
2182 if (tempbx & XGI_SetCRT2ToLCDA) {
2183 if (tempbx & SetSimuScanMode)
2184 tempbx &= (~(SetCRT2ToLCD |
2185 SetCRT2ToRAMDAC |
2186 SwitchCRT2));
2187 else
2188 tempbx &= (~(SetCRT2ToLCD |
2189 SetCRT2ToRAMDAC |
2190 SetCRT2ToTV |
2191 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002192 }
2193 }
2194
2195 /* shampoo add */
2196 /* for driver abnormal */
2197 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2198 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2199 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002200 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002201 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002202 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002203 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002204 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302205 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002206 } else {
2207 tempbx &= (~(SetCRT2ToRAMDAC |
2208 SetCRT2ToLCD |
2209 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302210 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002211 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002212
Miguel Gómezf9317352012-07-06 12:40:48 +02002213 if (!(pVBInfo->VBType & VB_NoLCD)) {
2214 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002215 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002216 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002217 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002218 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002219 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302220 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002221 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002222
Miguel Gómezf9317352012-07-06 12:40:48 +02002223 if (tempbx & SetCRT2ToSCART) {
2224 tempbx &= (0xFF00 |
2225 SetCRT2ToSCART |
2226 SwitchCRT2 |
2227 SetSimuScanMode);
2228 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2229 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002230
Miguel Gómezf9317352012-07-06 12:40:48 +02002231 if (pVBInfo->IF_DEF_YPbPr == 1) {
2232 if (tempbx & SetCRT2ToYPbPr525750)
2233 tempbx &= (0xFF00 |
2234 SwitchCRT2 |
2235 SetSimuScanMode);
2236 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002237
Miguel Gómezf9317352012-07-06 12:40:48 +02002238 if (pVBInfo->IF_DEF_HiVision == 1) {
2239 if (tempbx & SetCRT2ToHiVision)
2240 tempbx &= (0xFF00 |
2241 SetCRT2ToHiVision |
2242 SwitchCRT2 |
2243 SetSimuScanMode);
2244 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002245
Miguel Gómezf9317352012-07-06 12:40:48 +02002246 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2247 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2248 tempbx = DisableCRT2Display;
2249 }
2250
2251 if (!(tempbx & DisableCRT2Display)) {
2252 if ((!(tempbx & DriverMode)) ||
2253 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002254 if (!(tempbx & XGI_SetCRT2ToLCDA))
2255 tempbx |= (SetInSlaveMode |
2256 SetSimuScanMode);
Miguel Gómezf9317352012-07-06 12:40:48 +02002257 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002258
Miguel Gómezf9317352012-07-06 12:40:48 +02002259 /* LCD+TV can't support in slave mode
2260 * (Force LCDA+TV->LCDB) */
2261 if ((tempbx & SetInSlaveMode) &&
2262 (tempbx & XGI_SetCRT2ToLCDA)) {
2263 tempbx ^= (SetCRT2ToLCD |
2264 XGI_SetCRT2ToLCDA |
2265 SetCRT2ToDualEdge);
2266 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302267 }
2268 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002269
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302270 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002271}
2272
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002273static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302274 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002275{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302276 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002277
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302278 tempbx = 0;
2279 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002280
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302281 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002282 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2283 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302285 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002286 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302287 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002288 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002289 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002290 TVSetPALM |
2291 TVSetPALN |
2292 TVSetPAL);
2293 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002294 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002295 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302296 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002297 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002298 TVSetNTSCJ |
2299 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302300 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002301
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302302 if (pVBInfo->IF_DEF_LVDS == 0) {
2303 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002304 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302305 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302307 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002308 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002309 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302310 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302312 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002313 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002314
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302315 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002316 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302317 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002318 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302319 }
2320 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002321
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302322 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002323 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2324 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302325 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002326
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302327 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002328 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2329 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302330 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002331
Peter Huewe599801f2012-02-09 21:11:45 +01002332 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002333 (modeflag > 13) &&
2334 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302335 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302337 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002338
Peter Huewe599801f2012-02-09 21:11:45 +01002339 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302340 if (pVBInfo->VBInfo & SetInSlaveMode)
2341 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002342 } else if (tempbx &
2343 (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302344 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002345 } else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002346 (VB_SIS301B |
2347 VB_SIS302B |
2348 VB_SIS301LV |
2349 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002350 VB_XGI301C))) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002351 if (tempbx & TVSimuMode)
2352 tempbx &= (~RPLLDIV2XO);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302353 }
2354 }
2355 }
2356 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002357}
2358
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002359static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2360 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002361{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302362 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002363
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302364 pVBInfo->LCDResInfo = 0;
2365 pVBInfo->LCDTypeInfo = 0;
2366 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002367
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002368 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2369 /* si+Ext_ResInfo // */
2370 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002371 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302372 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002373
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302374 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002375 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002376
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002377 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002378 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302379 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002380 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002381 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302382 tempax &= 0x0F;
2383 else
2384 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302386 if ((resinfo == 6) || (resinfo == 9)) {
2387 if (tempax >= 3)
2388 tempbx |= PanelRef75Hz;
2389 } else if ((resinfo == 7) || (resinfo == 8)) {
2390 if (tempax >= 4)
2391 tempbx |= PanelRef75Hz;
2392 }
2393 }
2394 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302396 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002397
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302398 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002399
Peter Huewea3d675c2012-02-09 21:11:47 +01002400 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302401 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002402
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302403 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002404
Aaro Koskinen58839b02011-03-13 12:26:23 +02002405 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302407 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302409 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002410
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302411 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002412
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302413 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002414
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302415 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002416 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002417 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302418 tempbx |= SetLCDDualLink;
2419 }
2420 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002421
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302422 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002423 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002424 & SetCRT2ToLCD) && (resinfo == 9) &&
2425 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002426 /*
2427 * set to center in 1280x1024 LCDB
2428 * for Panel_1400x1050
2429 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002430 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302431 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002432
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302433 if (pVBInfo->VBInfo & SetInSlaveMode) {
2434 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002435 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302436 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002437 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302438 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302440 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302442 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002443}
2444
Bill Pemberton108afbf2010-06-17 13:10:47 -04002445unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302446 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002447{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002448 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2449 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2450 break;
2451 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2452 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302453 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002454
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302455 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002456}
2457
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002458static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2459{
2460 unsigned char ujRet = 0;
2461 unsigned char i = 0;
2462
2463 for (i = 0; i < 8; i++) {
2464 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002465 ujRet |= (ujDate >> i) & 1;
2466 }
2467
2468 return ujRet;
2469}
2470
2471/*----------------------------------------------------------------------------*/
2472/* output */
2473/* bl[5] : LVDS signal */
2474/* bl[1] : LVDS backlight */
2475/* bl[0] : LVDS VDD */
2476/*----------------------------------------------------------------------------*/
2477static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2478{
2479 unsigned char CR4A, temp;
2480
Aaro Koskinen58839b02011-03-13 12:26:23 +02002481 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002482 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002483
Aaro Koskinen58839b02011-03-13 12:26:23 +02002484 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002485
2486 temp = XG21GPIODataTransfer(temp);
2487 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002488 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002489 return temp;
2490}
2491
2492/*----------------------------------------------------------------------------*/
2493/* output */
2494/* bl[5] : LVDS signal */
2495/* bl[1] : LVDS backlight */
2496/* bl[0] : LVDS VDD */
2497/*----------------------------------------------------------------------------*/
2498static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2499{
2500 unsigned char CR4A, CRB4, temp;
2501
Aaro Koskinen58839b02011-03-13 12:26:23 +02002502 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002503 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002504
Aaro Koskinen58839b02011-03-13 12:26:23 +02002505 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002506
2507 temp &= 0x0C;
2508 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002509 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002510 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002511 temp |= ((CRB4 & 0x04) << 3);
2512 return temp;
2513}
2514
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002515/*----------------------------------------------------------------------------*/
2516/* input */
2517/* bl[5] : 1;LVDS signal on */
2518/* bl[1] : 1;LVDS backlight on */
2519/* bl[0] : 1:LVDS VDD on */
2520/* bh: 100000b : clear bit 5, to set bit5 */
2521/* 000010b : clear bit 1, to set bit1 */
2522/* 000001b : clear bit 0, to set bit0 */
2523/*----------------------------------------------------------------------------*/
2524static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2525 struct vb_device_info *pVBInfo)
2526{
2527 unsigned char CR4A, temp;
2528
2529 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2530 tempbh &= 0x23;
2531 tempbl &= 0x23;
2532 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2533
2534 if (tempbh & 0x20) {
2535 temp = (tempbl >> 4) & 0x02;
2536
2537 /* CR B4[1] */
2538 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2539
2540 }
2541
2542 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2543
2544 temp = XG21GPIODataTransfer(temp);
2545 temp &= ~tempbh;
2546 temp |= tempbl;
2547 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2548}
2549
Aaro Koskinen776115a2011-11-27 23:03:10 +02002550static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2551 struct vb_device_info *pVBInfo)
2552{
2553 unsigned char CR4A, temp;
2554 unsigned short tempbh0, tempbl0;
2555
2556 tempbh0 = tempbh;
2557 tempbl0 = tempbl;
2558 tempbh0 &= 0x20;
2559 tempbl0 &= 0x20;
2560 tempbh0 >>= 3;
2561 tempbl0 >>= 3;
2562
2563 if (tempbh & 0x20) {
2564 temp = (tempbl >> 4) & 0x02;
2565
2566 /* CR B4[1] */
2567 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2568
2569 }
2570 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2571
2572 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2573 tempbh &= 0x03;
2574 tempbl &= 0x03;
2575 tempbh <<= 2;
2576 tempbl <<= 2; /* GPIOC,GPIOD */
2577 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2578 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2579}
2580
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002581static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2582 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302583 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002584{
2585
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002586 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302587 if (pXGIHWDE->jChipType == XG21) {
2588 if (pVBInfo->IF_DEF_LVDS == 1) {
2589 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002590 /* LVDS VDD on */
2591 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002592 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302593 }
2594 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002595 /* LVDS signal on */
2596 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002597 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002598 /* LVDS backlight on */
2599 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302600 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002601 /* DVO/DVI signal on */
2602 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302603 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002604
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302605 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002606
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302607 if (pXGIHWDE->jChipType == XG27) {
2608 if (pVBInfo->IF_DEF_LVDS == 1) {
2609 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002610 /* LVDS VDD on */
2611 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002612 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302613 }
2614 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002615 /* LVDS signal on */
2616 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002617 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002618 /* LVDS backlight on */
2619 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302620 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002621 /* DVO/DVI signal on */
2622 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302623 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002624
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302625 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002626}
2627
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002628void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2629 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302630 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002631{
2632
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302633 if (pXGIHWDE->jChipType == XG21) {
2634 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002635 /* LVDS backlight off */
2636 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002637 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302638 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002639 /* DVO/DVI signal off */
2640 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302641 }
2642 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002643
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302644 if (pXGIHWDE->jChipType == XG27) {
2645 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002646 /* LVDS backlight off */
2647 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002648 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302649 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302651 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002652 /* DVO/DVI signal off */
2653 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302654 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002655
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002656 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002657}
2658
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002659static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002660{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002661 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302662 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002663
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002664 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302665 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002666}
2667
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002668static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002669{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002670 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002671}
2672
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002673static void XGI_SaveCRT2Info(unsigned short ModeNo,
2674 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002675{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302676 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002677
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002678 /* reserve CR34 for CRT1 Mode No */
2679 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302680 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
2681 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002682 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002683}
2684
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002685static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
2686 unsigned short ModeIdIndex,
2687 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002688{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302689 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002690
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03002691 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002692 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
2693 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
2694 /* si+St_ModeFlag */
2695 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002696
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002697 if (modeflag & HalfDCLK)
2698 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002699
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002700 if (modeflag & DoubleScanMode)
2701 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002702
Miguel Gómez3339db82012-07-06 12:40:49 +02002703 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
2704 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002705
Miguel Gómez3339db82012-07-06 12:40:49 +02002706 if (pVBInfo->IF_DEF_LVDS == 0) {
2707 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
2708 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2709 if (yres == 1024)
2710 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302711 }
2712 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002713
Miguel Gómez3339db82012-07-06 12:40:49 +02002714 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
2715 if (yres == 400)
2716 yres = 405;
2717 else if (yres == 350)
2718 yres = 360;
2719
2720 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
2721 if (yres == 360)
2722 yres = 375;
2723 }
2724 }
2725
2726 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2727 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2728 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
2729 if (yres == 350)
2730 yres = 357;
2731 else if (yres == 400)
2732 yres = 420;
2733 else if (yres == 480)
2734 yres = 525;
2735 }
2736 }
2737 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302738 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002739
Miguel Gómez3339db82012-07-06 12:40:49 +02002740 if (xres == 720)
2741 xres = 640;
2742
2743exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302744 pVBInfo->VGAHDE = xres;
2745 pVBInfo->HDE = xres;
2746 pVBInfo->VGAVDE = yres;
2747 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002748}
2749
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002750static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002751{
2752
Peter Huewea3d675c2012-02-09 21:11:47 +01002753 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03002754 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302755 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002756
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302757 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002758}
2759
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002760static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
2761 unsigned short ModeIdIndex,
2762 unsigned short RefreshRateTableIndex,
2763 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002764{
2765 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002766 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002767
2768 pVBInfo->RVBHCMAX = 1;
2769 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002770 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2771 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
2772 CRT1Index &= IndexMask;
2773 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
2774 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
2775 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
2776 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
2777 tempcx = (unsigned short)
2778 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
2779 tempcx &= 0x0100;
2780 tempcx = tempcx << 2;
2781 tempbx |= tempcx;
2782 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002783
2784 if (temp1 & 0x01)
2785 tempbx |= 0x0100;
2786
2787 if (temp1 & 0x20)
2788 tempbx |= 0x0200;
2789 tempax += 5;
2790
2791 if (modeflag & Charx8Dot)
2792 tempax *= 8;
2793 else
2794 tempax *= 9;
2795
2796 pVBInfo->VGAHT = tempax;
2797 pVBInfo->HT = tempax;
2798 tempbx++;
2799 pVBInfo->VGAVT = tempbx;
2800 pVBInfo->VT = tempbx;
2801}
2802
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002803static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302804 unsigned short RefreshRateTableIndex,
2805 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002806{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302807 unsigned short tempax = 0, tempbx, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002808
Peter Huewefc39dcb2012-01-15 19:22:12 +01002809 struct SiS_LCDData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002810
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002811 /* si+Ext_ResInfo */
2812 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2813 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302814 pVBInfo->NewFlickerMode = 0;
2815 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002816
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302817 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
2818 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2819 pVBInfo);
2820 return;
2821 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002822
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302823 tempbx = 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002824
Peter Huewea3d675c2012-02-09 21:11:47 +01002825 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03002826 LCDPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
2827 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002828
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302829 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
2830 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
2831 pVBInfo->VGAHT = LCDPtr->VGAHT;
2832 pVBInfo->VGAVT = LCDPtr->VGAVT;
2833 pVBInfo->HT = LCDPtr->LCDHT;
2834 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002835
Peter Huewe255aabd2012-02-09 21:11:44 +01002836 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302837 tempax = 1024;
2838 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002839
Peter Huewea3d675c2012-02-09 21:11:47 +01002840 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302841 if (pVBInfo->VGAVDE == 357)
2842 tempbx = 527;
2843 else if (pVBInfo->VGAVDE == 420)
2844 tempbx = 620;
2845 else if (pVBInfo->VGAVDE == 525)
2846 tempbx = 775;
2847 else if (pVBInfo->VGAVDE == 600)
2848 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302849 else
2850 tempbx = 768;
2851 } else
2852 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002853 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302854 tempax = 1024;
2855 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002856 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302857 tempax = 1280;
2858 if (pVBInfo->VGAVDE == 360)
2859 tempbx = 768;
2860 else if (pVBInfo->VGAVDE == 375)
2861 tempbx = 800;
2862 else if (pVBInfo->VGAVDE == 405)
2863 tempbx = 864;
2864 else
2865 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002866 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302867 tempax = 1280;
2868 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002869 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302870 tempax = 1280;
2871 if (pVBInfo->VGAVDE == 350)
2872 tempbx = 700;
2873 else if (pVBInfo->VGAVDE == 400)
2874 tempbx = 800;
2875 else if (pVBInfo->VGAVDE == 1024)
2876 tempbx = 960;
2877 else
2878 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01002879 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302880 tempax = 1400;
2881 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302883 if (pVBInfo->VGAVDE == 1024) {
2884 tempax = 1280;
2885 tempbx = 1024;
2886 }
Peter Huewe255aabd2012-02-09 21:11:44 +01002887 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302888 tempax = 1600;
2889 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01002890 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302891 if (pVBInfo->VGAVDE == 350)
2892 tempbx = 875;
2893 else if (pVBInfo->VGAVDE == 400)
2894 tempbx = 1000;
2895 }
2896 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002897
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302898 if (pVBInfo->LCDInfo & LCDNonExpanding) {
2899 tempax = pVBInfo->VGAHDE;
2900 tempbx = pVBInfo->VGAVDE;
2901 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002902
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302903 pVBInfo->HDE = tempax;
2904 pVBInfo->VDE = tempbx;
2905 return;
2906 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302908 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03002909 struct SiS_TVData const *TVPtr;
2910
2911 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2912 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002913
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302914 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
2915 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
2916 pVBInfo->VGAHT = TVPtr->VGAHT;
2917 pVBInfo->VGAVT = TVPtr->VGAVT;
2918 pVBInfo->HDE = TVPtr->TVHDE;
2919 pVBInfo->VDE = TVPtr->TVVDE;
2920 pVBInfo->RVBHRS = TVPtr->RVBHRS;
2921 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002922
Peter Huewe599801f2012-02-09 21:11:45 +01002923 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302924 if (resinfo == 0x08)
2925 pVBInfo->NewFlickerMode = 0x40;
2926 else if (resinfo == 0x09)
2927 pVBInfo->NewFlickerMode = 0x40;
2928 else if (resinfo == 0x12)
2929 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002930
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302931 if (pVBInfo->VGAVDE == 350)
2932 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002933
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302934 tempax = ExtHiTVHT;
2935 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002936
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302937 if (pVBInfo->VBInfo & SetInSlaveMode) {
2938 if (pVBInfo->TVInfo & TVSimuMode) {
2939 tempax = StHiTVHT;
2940 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002941
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302942 if (!(modeflag & Charx8Dot)) {
2943 tempax = StHiTextTVHT;
2944 tempbx = StHiTextTVVT;
2945 }
2946 }
2947 }
Peter Huewe599801f2012-02-09 21:11:45 +01002948 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2949 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302950 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
2951 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
2952 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002953
Peter Huewe599801f2012-02-09 21:11:45 +01002954 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302955 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
2956 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01002957 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302958 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
2959 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
2960 if (pVBInfo->TVInfo & NTSC1024x768)
2961 tempax = NTSC1024x768HT;
2962 }
2963 } else {
2964 tempax = PALHT;
2965 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01002966 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302967 tempax = NTSCHT;
2968 tempbx = NTSCVT;
2969 if (pVBInfo->TVInfo & NTSC1024x768)
2970 tempax = NTSC1024x768HT;
2971 }
2972 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002973
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302974 pVBInfo->HT = tempax;
2975 pVBInfo->VT = tempbx;
2976 return;
2977 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002978}
2979
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002980static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302981 unsigned short RefreshRateTableIndex,
2982 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002983{
Bill Pemberton108afbf2010-06-17 13:10:47 -04002984 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302986 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2987 pVBInfo);
2988 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2989 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002990
Peter Huewe6896b942012-02-09 21:11:46 +01002991 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302992 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002993 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
2994 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
2995 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302996 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002997 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
2998 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302999 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003000
Aaro Koskinen8104e322011-03-13 12:26:22 +02003001 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003002
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303003 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003004 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303005 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02003006 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003007}
3008
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003009static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
3010 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003011{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003012 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3013 short index;
3014 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303015
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003016 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01003017 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303018
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003019 if (index < 0)
3020 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303021
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003022 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303023}
3024
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003025static unsigned short XGI_GetOffset(unsigned short ModeNo,
3026 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303027 unsigned short RefreshRateTableIndex,
3028 struct xgi_hw_device_info *HwDeviceExtension,
3029 struct vb_device_info *pVBInfo)
3030{
3031 unsigned short temp, colordepth, modeinfo, index, infoflag,
3032 ColorDepth[] = { 0x01, 0x02, 0x04 };
3033
3034 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003035 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303036
3037 index = (modeinfo >> 8) & 0xFF;
3038
3039 temp = pVBInfo->ScreenOffset[index];
3040
3041 if (infoflag & InterlaceMode)
3042 temp = temp << 1;
3043
3044 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3045
3046 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3047 temp = ModeNo - 0x7C;
3048 colordepth = ColorDepth[temp];
3049 temp = 0x6B;
3050 if (infoflag & InterlaceMode)
3051 temp = temp << 1;
3052 return temp * colordepth;
3053 } else {
3054 return temp * colordepth;
3055 }
3056}
3057
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003058static void XGI_SetCRT2Offset(unsigned short ModeNo,
3059 unsigned short ModeIdIndex,
3060 unsigned short RefreshRateTableIndex,
3061 struct xgi_hw_device_info *HwDeviceExtension,
3062 struct vb_device_info *pVBInfo)
3063{
3064 unsigned short offset;
3065 unsigned char temp;
3066
3067 if (pVBInfo->VBInfo & SetInSlaveMode)
3068 return;
3069
3070 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3071 HwDeviceExtension, pVBInfo);
3072 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003073 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003074 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003075 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003076 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003077 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003078}
3079
Randy Dunlap89229672010-08-10 08:46:44 -07003080static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003081{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003082 /* threshold high ,disable auto threshold */
3083 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3084 /* threshold low default 04h */
3085 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003086}
3087
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003088static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303089 struct xgi_hw_device_info *HwDeviceExtension,
3090 unsigned short RefreshRateTableIndex,
3091 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003092{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303093 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003094
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003095 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3096 CRT1Index &= IndexMask;
3097 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003098
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303099 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3100 HwDeviceExtension, pVBInfo);
3101 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003102
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303103 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003104 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003105
Aaro Koskinen8104e322011-03-13 12:26:22 +02003106 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3107 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003108}
3109
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003110static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303111 struct xgi_hw_device_info *HwDeviceExtension,
3112 unsigned short RefreshRateTableIndex,
3113 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003114{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303115 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3116 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003117
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003118 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3119 CRT1Index &= IndexMask;
3120 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3121 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003122
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303123 /* bainy change table name */
3124 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003125 /* BTVGA2HT 0x08,0x09 */
3126 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003127 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303128 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003129 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003130 /* BTVGA2HDEE 0x0A,0x0C */
3131 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003132 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303133 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3134 pushbx = pVBInfo->VGAHDE / 2 + 16;
3135 tempcx = tempcx >> 1;
3136 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3137 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003138
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303139 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3140 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003141 tempbx |= ((pVBInfo->
3142 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3143 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303144 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3145 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3146 tempcx &= 0x1F;
3147 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3148 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3149 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 tempbx += 4;
3153 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003154
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303155 if (tempcx > (pVBInfo->VGAHT / 2))
3156 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303158 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003159
Aaro Koskinen8104e322011-03-13 12:26:22 +02003160 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303161 } else {
3162 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003163 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303164 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003165 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003166 /* BTVGA2HDEE 0x0A,0x0C */
3167 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003168 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303169 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3170 pushbx = pVBInfo->VGAHDE + 16;
3171 tempcx = tempcx >> 1;
3172 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3173 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003174
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303175 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3176 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003177 tempbx |= ((pVBInfo->
3178 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3179 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303180 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3181 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3182 tempcx &= 0x1F;
3183 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3184 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3185 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3186 tempbx += 16;
3187 tempcx += 16;
3188 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303190 if (tempcx > pVBInfo->VGAHT)
3191 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003194 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303195 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003196
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303197 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3198 tempbx = pushbx;
3199 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3200 tempax |= (tempbx & 0xFF00);
3201 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003202 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303203 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003204 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303205 tempcx = (pVBInfo->VGAVT - 1);
3206 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003207
Aaro Koskinen8104e322011-03-13 12:26:22 +02003208 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303209 tempbx = pVBInfo->VGAVDE - 1;
3210 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003211 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303212 temp = ((tempbx & 0xFF00) << 3) >> 8;
3213 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003214 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003215
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303216 tempax = pVBInfo->VGAVDE;
3217 tempbx = pVBInfo->VGAVDE;
3218 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003219 /* BTVGA2VRS 0x10,0x11 */
3220 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3221 /* BTVGA2VRE 0x11 */
3222 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303224 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3225 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3226 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003227
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303228 if (temp & 0x04)
3229 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003230
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303231 if (temp & 0x080)
3232 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003233
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303234 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303236 if (temp & 0x08)
3237 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003238
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303239 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3240 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3241 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003242
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303243 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003244 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303245 temp = ((tempbx & 0xFF00) >> 8) << 4;
3246 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003247 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303248 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003249
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303250 if (modeflag & DoubleScanMode)
3251 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003252
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303253 if (modeflag & HalfDCLK)
3254 tempax |= 0x40;
3255
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003256 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003257}
3258
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003259static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3260{
3261 unsigned long tempax, tempbx;
3262
3263 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3264 & 0xFFFF;
3265 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3266 tempax = (tempax * pVBInfo->HT) / tempbx;
3267
3268 return (unsigned short) tempax;
3269}
3270
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003271static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303272 struct xgi_hw_device_info *HwDeviceExtension,
3273 unsigned short RefreshRateTableIndex,
3274 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003275{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303276 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3277 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003278
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003279 /* si+Ext_ResInfo */
3280 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3281 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3282 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3283 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003284
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303285 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3286 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003287
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303288 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003289 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303290 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003291
Peter Huewe6896b942012-02-09 21:11:46 +01003292 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303293 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003294
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303295 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303297 if (modeflag & HalfDCLK)
3298 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003299
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 tempax = (tempax / tempcx) - 1;
3301 tempbx |= ((tempax & 0x00FF) << 8);
3302 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003303 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003304
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303305 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303307 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003308 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3309 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303310 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003311
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003312 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3313 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303314 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303315 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003316
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003317 /* 0x05 Horizontal Display Start */
3318 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3319 /* 0x06 Horizontal Blank end */
3320 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003321
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303322 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3323 if (pVBInfo->VBInfo & SetCRT2ToTV)
3324 tempax = pVBInfo->VGAHT;
3325 else
3326 tempax = XGI_GetVGAHT2(pVBInfo);
3327 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303329 if (tempax >= pVBInfo->VGAHT)
3330 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003331
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303332 if (modeflag & HalfDCLK)
3333 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003334
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303335 tempax = (tempax / tempcx) - 5;
3336 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003337 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303338 temp = (tempbx & 0x00FF) - 1;
3339 if (!(modeflag & HalfDCLK)) {
3340 temp -= 6;
3341 if (pVBInfo->TVInfo & TVSimuMode) {
3342 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003343 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303344 }
3345 }
3346 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303347 tempbx = (tempbx & 0xFF00) >> 8;
3348 tempcx = (tempcx + tempbx) >> 1;
3349 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003350
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303351 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3352 temp -= 1;
3353 if (!(modeflag & HalfDCLK)) {
3354 if ((modeflag & Charx8Dot)) {
3355 temp += 4;
3356 if (pVBInfo->VGAHDE >= 800)
3357 temp -= 6;
3358 }
3359 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003360 } else if (!(modeflag & HalfDCLK)) {
3361 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003362 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003363 pVBInfo->VGAHDE >= 800) {
3364 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003365 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003366 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003367 (pVBInfo->LCDInfo & LCDNonExpanding))
3368 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303369 }
3370 }
3371 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003372
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003373 /* 0x07 Horizontal Retrace Start */
3374 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3375 /* 0x08 Horizontal Retrace End */
3376 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003377
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303378 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3379 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003380 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303381 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003382 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003384 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303385 0x08, 0x03);
3386 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003387 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303388 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003389 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303390 0x08, 0x02);
3391 }
3392 }
3393 }
3394 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003395
Aaro Koskinen8104e322011-03-13 12:26:22 +02003396 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003397 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003398 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303400 tempbx = pVBInfo->VGAVT;
3401 push1 = tempbx;
3402 tempcx = 0x121;
3403 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003404
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303405 if (tempbx == 357)
3406 tempbx = 350;
3407 if (tempbx == 360)
3408 tempbx = 350;
3409 if (tempbx == 375)
3410 tempbx = 350;
3411 if (tempbx == 405)
3412 tempbx = 400;
3413 if (tempbx == 525)
3414 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003415
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303416 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003417
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303418 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003419 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003420 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303421 if (tempbx == 350)
3422 tempbx += 5;
3423 if (tempbx == 480)
3424 tempbx += 5;
3425 }
3426 }
3427 }
3428 tempbx--;
3429 temp = tempbx & 0x00FF;
3430 tempbx--;
3431 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003432 /* 0x10 vertical Blank Start */
3433 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303434 tempbx = push2;
3435 tempbx--;
3436 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003437 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003438
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303439 if (tempbx & 0x0100)
3440 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003441
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303442 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303444 if (modeflag & DoubleScanMode)
3445 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303447 if (tempbx & 0x0200)
3448 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303450 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003451 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003452
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 if (tempbx & 0x0400)
3454 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003455
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003456 /* 0x11 Vertival Blank End */
3457 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303458
3459 tempax = push1;
3460 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3461 tempax = tempax >> 2;
3462 push1 = tempax; /* push ax */
3463
3464 if (resinfo != 0x09) {
3465 tempax = tempax << 1;
3466 tempbx += tempax;
3467 }
3468
Peter Huewe599801f2012-02-09 21:11:45 +01003469 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003470 if ((pVBInfo->VBType & VB_SIS301LV) &&
3471 !(pVBInfo->TVInfo & TVSetHiVision)) {
3472 if ((pVBInfo->TVInfo & TVSimuMode) &&
3473 (pVBInfo->TVInfo & TVSetPAL)) {
3474 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3475 !(pVBInfo->TVInfo &
3476 (TVSetYPbPr525p |
3477 TVSetYPbPr750p |
3478 TVSetHiVision)))
3479 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303480 }
3481 } else {
3482 tempbx -= 10;
3483 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003484 } else if (pVBInfo->TVInfo & TVSimuMode) {
3485 if (pVBInfo->TVInfo & TVSetPAL) {
3486 if (pVBInfo->VBType & VB_SIS301LV) {
3487 if (!(pVBInfo->TVInfo &
3488 (TVSetYPbPr525p |
3489 TVSetYPbPr750p |
3490 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303491 tempbx += 40;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003492 } else {
3493 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303494 }
3495 }
3496 }
3497 tempax = push1;
3498 tempax = tempax >> 2;
3499 tempax++;
3500 tempax += tempbx;
3501 push1 = tempax; /* push ax */
3502
Peter Huewe599801f2012-02-09 21:11:45 +01003503 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303504 if (tempbx <= 513) {
3505 if (tempax >= 513)
3506 tempbx = 513;
3507 }
3508 }
3509
3510 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003511 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303512 tempbx--;
3513 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003514 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303515
3516 if (tempbx & 0x0100)
3517 tempcx |= 0x0008;
3518
3519 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003520 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303521
3522 tempbx++;
3523
3524 if (tempbx & 0x0100)
3525 tempcx |= 0x0004;
3526
3527 if (tempbx & 0x0200)
3528 tempcx |= 0x0080;
3529
3530 if (tempbx & 0x0400)
3531 tempcx |= 0x0C00;
3532
3533 tempbx = push1; /* pop ax */
3534 temp = tempbx & 0x00FF;
3535 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003536 /* 0x0D vertical Retrace End */
3537 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303538
3539 if (tempbx & 0x0010)
3540 tempcx |= 0x2000;
3541
3542 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003543 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303544 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003545 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303546 tempax = modeflag;
3547 temp = (tempax & 0xFF00) >> 8;
3548
3549 temp = (temp >> 1) & 0x09;
3550
Peter Huewe6896b942012-02-09 21:11:46 +01003551 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303552 temp |= 0x01;
3553
Aaro Koskinen8104e322011-03-13 12:26:22 +02003554 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3555 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3556 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303557
3558 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3559 temp = 0x80;
3560 else
3561 temp = 0x00;
3562
Aaro Koskinen8104e322011-03-13 12:26:22 +02003563 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564
3565 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003566}
3567
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003568static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303569 unsigned short RefreshRateTableIndex,
3570 struct xgi_hw_device_info *HwDeviceExtension,
3571 struct vb_device_info *pVBInfo)
3572{
3573 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
3574 modeflag, resinfo, crt2crtc;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003575 unsigned char const *TimingPoint;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303576
3577 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3578
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003579 /* si+Ext_ResInfo */
3580 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3581 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3582 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303583
3584 tempax = 0;
3585
3586 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3587 tempax |= 0x0800;
3588
3589 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3590 tempax |= 0x0400;
3591
3592 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3593 tempax |= 0x0200;
3594
Peter Huewe599801f2012-02-09 21:11:45 +01003595 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303596 tempax |= 0x1000;
3597
Peter Huewe599801f2012-02-09 21:11:45 +01003598 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303599 tempax |= 0x0100;
3600
Peter Huewe599801f2012-02-09 21:11:45 +01003601 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303602 tempax &= 0xfe00;
3603
3604 tempax = (tempax & 0xff00) >> 8;
3605
Aaro Koskinen8104e322011-03-13 12:26:22 +02003606 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003607 TimingPoint = XGI330_NTSCTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303608
Peter Huewe599801f2012-02-09 21:11:45 +01003609 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003610 TimingPoint = XGI330_PALTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303611
Peter Huewe599801f2012-02-09 21:11:45 +01003612 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003613 TimingPoint = XGI330_HiTVExtTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303614
3615 if (pVBInfo->VBInfo & SetInSlaveMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003616 TimingPoint = XGI330_HiTVSt2Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303617
3618 if (pVBInfo->SetFlag & TVSimuMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003619 TimingPoint = XGI330_HiTVSt1Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303620
3621 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003622 TimingPoint = XGI330_HiTVTextTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303623 }
3624
Peter Huewe599801f2012-02-09 21:11:45 +01003625 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3626 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003627 TimingPoint = XGI330_YPbPr525iTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303628
Peter Huewe599801f2012-02-09 21:11:45 +01003629 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003630 TimingPoint = XGI330_YPbPr525pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303631
Peter Huewe599801f2012-02-09 21:11:45 +01003632 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003633 TimingPoint = XGI330_YPbPr750pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303634 }
3635
3636 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003637 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303638
3639 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003640 /* di->temp2[j] */
3641 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303642
3643 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003644 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303645
3646 temp = pVBInfo->NewFlickerMode;
3647 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003648 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303649
Peter Huewe599801f2012-02-09 21:11:45 +01003650 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303651 tempax = 950;
3652
Peter Huewe599801f2012-02-09 21:11:45 +01003653 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303654 tempax = 520;
3655 else
3656 tempax = 440;
3657
3658 if (pVBInfo->VDE <= tempax) {
3659 tempax -= pVBInfo->VDE;
3660 tempax = tempax >> 2;
3661 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
3662 push1 = tempax;
3663 temp = (tempax & 0xFF00) >> 8;
3664 temp += (unsigned short) TimingPoint[0];
3665
Peter Huewe6896b942012-02-09 21:11:46 +01003666 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3667 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303668 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3669 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003670 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303671 tempcx = pVBInfo->VGAHDE;
3672 if (tempcx >= 1024) {
3673 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003674 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303675 temp = 0x19; /* PAL */
3676 }
3677 }
3678 }
3679
Aaro Koskinen8104e322011-03-13 12:26:22 +02003680 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303681 tempax = push1;
3682 temp = (tempax & 0xFF00) >> 8;
3683 temp += TimingPoint[1];
3684
Peter Huewe6896b942012-02-09 21:11:46 +01003685 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3686 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303687 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3688 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003689 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303690 tempcx = pVBInfo->VGAHDE;
3691 if (tempcx >= 1024) {
3692 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003693 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303694 temp = 0x52; /* PAL */
3695 }
3696 }
3697 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003698 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303699 }
3700
3701 /* 301b */
3702 tempcx = pVBInfo->HT;
3703
3704 if (XGI_IsLCDDualLink(pVBInfo))
3705 tempcx = tempcx >> 1;
3706
3707 tempcx -= 2;
3708 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003709 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303710
3711 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003712 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303713
3714 tempcx = pVBInfo->HT >> 1;
3715 push1 = tempcx; /* push cx */
3716 tempcx += 7;
3717
Peter Huewe599801f2012-02-09 21:11:45 +01003718 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303719 tempcx -= 4;
3720
3721 temp = tempcx & 0x00FF;
3722 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003723 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303724
3725 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3726 tempbx += tempcx;
3727 push2 = tempbx;
3728 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003729 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303730 temp = (tempbx & 0xFF00) >> 8;
3731 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003732 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303733
3734 tempbx = push2;
3735 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003736 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303737 tempbx = tempbx - 4;
3738 tempcx = tempbx;
3739 }
3740
3741 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003742 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303743
3744 j += 2;
3745 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
3746 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003747 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303748 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003749 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303750
3751 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003752 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303753 tempcx -= 4;
3754
3755 temp = tempcx & 0xFF;
3756 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003757 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303758
3759 tempcx = push1; /* pop cx */
3760 j += 2;
3761 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3762 tempcx -= temp;
3763 temp = tempcx & 0x00FF;
3764 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003765 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303766
3767 tempcx -= 11;
3768
3769 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
3770 tempax = XGI_GetVGAHT2(pVBInfo);
3771 tempcx = tempax - 1;
3772 }
3773 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003774 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303775
3776 tempbx = pVBInfo->VDE;
3777
3778 if (pVBInfo->VGAVDE == 360)
3779 tempbx = 746;
3780 if (pVBInfo->VGAVDE == 375)
3781 tempbx = 746;
3782 if (pVBInfo->VGAVDE == 405)
3783 tempbx = 853;
3784
3785 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003786 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003787 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003788 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01003789 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303790 tempbx = tempbx >> 1;
3791 } else
3792 tempbx = tempbx >> 1;
3793 }
3794
3795 tempbx -= 2;
3796 temp = tempbx & 0x00FF;
3797
Peter Huewe599801f2012-02-09 21:11:45 +01003798 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01003799 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003800 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303801 if (pVBInfo->VBInfo & SetInSlaveMode) {
3802 if (ModeNo == 0x2f)
3803 temp += 1;
3804 }
3805 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003806 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
3807 if (ModeNo == 0x2f)
3808 temp += 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303809 }
3810 }
3811
Aaro Koskinen8104e322011-03-13 12:26:22 +02003812 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303813
3814 temp = (tempcx & 0xFF00) >> 8;
3815 temp |= ((tempbx & 0xFF00) >> 8) << 6;
3816
Peter Huewe599801f2012-02-09 21:11:45 +01003817 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01003818 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003819 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303820 temp |= 0x10;
3821
3822 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3823 temp |= 0x20;
3824 }
3825 } else {
3826 temp |= 0x10;
3827 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3828 temp |= 0x20;
3829 }
3830 }
3831
Aaro Koskinen8104e322011-03-13 12:26:22 +02003832 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303833
Peter Huewe6896b942012-02-09 21:11:46 +01003834 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3835 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303836 tempbx = pVBInfo->VDE;
3837 tempcx = tempbx - 2;
3838
3839 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003840 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
3841 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303842 tempbx = tempbx >> 1;
3843 }
3844
Peter Huewe6896b942012-02-09 21:11:46 +01003845 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303846 temp = 0;
3847 if (tempcx & 0x0400)
3848 temp |= 0x20;
3849
3850 if (tempbx & 0x0400)
3851 temp |= 0x40;
3852
Aaro Koskinen8104e322011-03-13 12:26:22 +02003853 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303854 }
3855
3856 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003857 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303858 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003859 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303860 }
3861
3862 tempbx = tempbx & 0x00FF;
3863
3864 if (!(modeflag & HalfDCLK)) {
3865 tempcx = pVBInfo->VGAHDE;
3866 if (tempcx >= pVBInfo->HDE) {
3867 tempbx |= 0x2000;
3868 tempax &= 0x00FF;
3869 }
3870 }
3871
3872 tempcx = 0x0101;
3873
3874 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
3875 if (pVBInfo->VGAHDE >= 1024) {
3876 tempcx = 0x1920;
3877 if (pVBInfo->VGAHDE >= 1280) {
3878 tempcx = 0x1420;
3879 tempbx = tempbx & 0xDFFF;
3880 }
3881 }
3882 }
3883
3884 if (!(tempbx & 0x2000)) {
3885 if (modeflag & HalfDCLK)
3886 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
3887
3888 push1 = tempbx;
3889 tempeax = pVBInfo->VGAHDE;
3890 tempebx = (tempcx & 0xFF00) >> 8;
3891 longtemp = tempeax * tempebx;
3892 tempecx = tempcx & 0x00FF;
3893 longtemp = longtemp / tempecx;
3894
3895 /* 301b */
3896 tempecx = 8 * 1024;
3897
Peter Huewe6896b942012-02-09 21:11:46 +01003898 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3899 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303900 tempecx = tempecx * 8;
3901 }
3902
3903 longtemp = longtemp * tempecx;
3904 tempecx = pVBInfo->HDE;
3905 temp2 = longtemp % tempecx;
3906 tempeax = longtemp / tempecx;
3907 if (temp2 != 0)
3908 tempeax += 1;
3909
3910 tempax = (unsigned short) tempeax;
3911
3912 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01003913 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3914 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303915 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
3916 }
3917 /* end 301b */
3918
3919 tempbx = push1;
3920 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
3921 | (tempbx & 0x00FF));
3922 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
3923 | (tempax & 0x00FF));
3924 temp = (tempax & 0xFF00) >> 8;
3925 } else {
3926 temp = (tempax & 0x00FF) >> 8;
3927 }
3928
Aaro Koskinen8104e322011-03-13 12:26:22 +02003929 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303930 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003931 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303932 temp = tempcx & 0x00FF;
3933
3934 if (tempbx & 0x2000)
3935 temp = 0;
3936
3937 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3938 temp |= 0x18;
3939
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003940 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01003941 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303942 tempbx = 0x0382;
3943 tempcx = 0x007e;
3944 } else {
3945 tempbx = 0x0369;
3946 tempcx = 0x0061;
3947 }
3948
3949 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003950 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303951 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003952 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303953
3954 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
3955 temp = temp << 2;
3956 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
3957
Peter Huewe599801f2012-02-09 21:11:45 +01003958 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303959 temp |= 0x10;
3960
Peter Huewe599801f2012-02-09 21:11:45 +01003961 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 temp |= 0x20;
3963
Peter Huewe599801f2012-02-09 21:11:45 +01003964 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303965 temp |= 0x60;
3966 }
3967
Aaro Koskinen8104e322011-03-13 12:26:22 +02003968 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003969 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003970 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971
Peter Huewe599801f2012-02-09 21:11:45 +01003972 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303973 if (pVBInfo->TVInfo & NTSC1024x768) {
3974 TimingPoint = XGI_NTSC1024AdjTime;
3975 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003976 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303977 TimingPoint[j]);
3978 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003979 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303980 }
3981 }
3982
Miguel Gómez949eb0a2012-07-06 12:40:36 +02003983 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303984 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01003985 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003986 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303987 0x08); /* PALM Mode */
3988 }
3989
Peter Huewe599801f2012-02-09 21:11:45 +01003990 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003991 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303992 0x01);
3993 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02003994 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303995
Aaro Koskinendc505562011-03-13 12:26:26 +02003996 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303997 }
3998
Peter Huewe599801f2012-02-09 21:11:45 +01003999 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304000 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02004001 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304002 }
4003
4004 if (pVBInfo->VBInfo & SetCRT2ToTV)
4005 return;
4006}
4007
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004008static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304009 struct xgi_hw_device_info *HwDeviceExtension,
4010 unsigned short RefreshRateTableIndex,
4011 struct vb_device_info *pVBInfo)
4012{
4013 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
4014 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
4015
4016 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
4017
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004018 /* si+Ext_ResInfo */
4019 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4020 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4021 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4022 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304023
4024 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
4025 return;
4026
4027 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
4028
4029 if (XGI_IsLCDDualLink(pVBInfo))
4030 tempbx = tempbx >> 1;
4031
4032 tempbx -= 1;
4033 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004034 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304035 temp = (tempbx & 0xFF00) >> 8;
4036 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004037 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304038 temp = 0x01;
4039
Aaro Koskinen8104e322011-03-13 12:26:22 +02004040 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304041 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4042 push1 = tempbx;
4043 tempbx--;
4044 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004045 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304046 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004047 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304048
4049 tempcx = pVBInfo->VT - 1;
4050 push2 = tempcx + 1;
4051 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004052 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304053 temp = (tempcx & 0xFF00) >> 8;
4054 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004055 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004056 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4057 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4058 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4059 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304060
Justin P. Mattock558f7582012-10-02 21:17:11 -07004061 /* Customized LCDB Does not add */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304062 tempbx = 5;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03004063 LCDBDesPtr = XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex,
4064 RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304065 tempah = pVBInfo->LCDResInfo;
4066 tempah &= PanelResInfo;
4067
Peter Huewe255aabd2012-02-09 21:11:44 +01004068 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304069 tempbx = 1024;
4070 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004071 } else if ((tempah == Panel_1280x1024) ||
4072 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304073 tempbx = 1280;
4074 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004075 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304076 tempbx = 1400;
4077 tempcx = 1050;
4078 } else {
4079 tempbx = 1600;
4080 tempcx = 1200;
4081 }
4082
4083 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4084 tempbx = pVBInfo->HDE;
4085 tempcx = pVBInfo->VDE;
4086 }
4087
4088 pushbx = tempbx;
4089 tempax = pVBInfo->VT;
4090 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4091 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4092 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4093 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4094 tempbx = pVBInfo->LCDVDES;
4095 tempcx += tempbx;
4096
4097 if (tempcx >= tempax)
4098 tempcx -= tempax; /* lcdvdes */
4099
4100 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004101 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304102 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004103 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304104 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4105 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4106 tempah = tempch;
4107 tempah = tempah << 3;
4108 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004109 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304110
4111 /* getlcdsync() */
4112 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4113 tempcx = tempbx;
4114 tempax = pVBInfo->VT;
4115 tempbx = pVBInfo->LCDVRS;
4116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304117 tempcx += tempbx;
4118 if (tempcx >= tempax)
4119 tempcx -= tempax;
4120
4121 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004122 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304123 temp = (tempbx & 0xFF00) >> 8;
4124 temp = temp << 4;
4125 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004126 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304127 tempcx = pushbx;
4128 tempax = pVBInfo->HT;
4129 tempbx = pVBInfo->LCDHDES;
4130 tempbx &= 0x0FFF;
4131
4132 if (XGI_IsLCDDualLink(pVBInfo)) {
4133 tempax = tempax >> 1;
4134 tempbx = tempbx >> 1;
4135 tempcx = tempcx >> 1;
4136 }
4137
Peter Huewe6896b942012-02-09 21:11:46 +01004138 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304139 tempbx += 1;
4140
4141 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4142 tempbx += 1;
4143
4144 tempcx += tempbx;
4145
4146 if (tempcx >= tempax)
4147 tempcx -= tempax;
4148
4149 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004150 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304151 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004152 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304153 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004154 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304155 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004156 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304157
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304158 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4159 tempcx = tempax;
4160 tempax = pVBInfo->HT;
4161 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304162 if (XGI_IsLCDDualLink(pVBInfo)) {
4163 tempax = tempax >> 1;
4164 tempbx = tempbx >> 1;
4165 tempcx = tempcx >> 1;
4166 }
4167
Peter Huewe6896b942012-02-09 21:11:46 +01004168 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304169 tempbx += 1;
4170
4171 tempcx += tempbx;
4172
4173 if (tempcx >= tempax)
4174 tempcx -= tempax;
4175
4176 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004177 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304178
4179 temp = (tempbx & 0xFF00) >> 8;
4180 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004181 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304182 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004183 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184
Peter Huewea3d675c2012-02-09 21:11:47 +01004185 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304186 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004187 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4188 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304189 | VB_XGI301C)) {
4190 temp = 0xC6;
4191 } else
4192 temp = 0xC4;
4193
Aaro Koskinen8104e322011-03-13 12:26:22 +02004194 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4195 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304196 }
4197
4198 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004199 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4200 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304201 | VB_XGI301C)) {
4202 temp = 0x4F;
4203 } else
4204 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004205 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304206 }
4207 }
4208}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004209
4210/* --------------------------------------------------------------------- */
4211/* Function : XGI_GetTap4Ptr */
4212/* Input : */
4213/* Output : di -> Tap4 Reg. Setting Pointer */
4214/* Description : */
4215/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004216static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304217 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004218{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304219 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004220
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304221 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004222
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304223 if (tempcx == 0) {
4224 tempax = pVBInfo->VGAHDE;
4225 tempbx = pVBInfo->HDE;
4226 } else {
4227 tempax = pVBInfo->VGAVDE;
4228 tempbx = pVBInfo->VDE;
4229 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004230
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004231 if (tempax <= tempbx)
4232 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304233 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004234 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004235
Peter Huewe599801f2012-02-09 21:11:45 +01004236 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304237 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004238
Peter Huewe599801f2012-02-09 21:11:45 +01004239 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4240 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4241 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004242 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004243 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304244 Tap4TimingPtr = YPbPr750pTap4Timing;
4245 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004246
Peter Huewe599801f2012-02-09 21:11:45 +01004247 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004248 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004249
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304250 i = 0;
4251 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4252 if (Tap4TimingPtr[i].DE == tempax)
4253 break;
4254 i++;
4255 }
4256 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004257}
4258
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004259static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004260{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304261 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004262
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304263 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004264
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304265 if (!(pVBInfo->VBType & VB_XGI301C))
4266 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004267
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304268 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4269 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004270 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004271
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004272 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004273 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004274 /* Set Vertical Scaling */
4275 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304276 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004277 xgifb_reg_set(pVBInfo->Part2Port,
4278 i,
4279 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304280 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004281
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004282 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004283 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004284 /* Enable V.Scaling */
4285 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304286 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004287 /* Enable H.Scaling */
4288 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004289}
4290
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004291static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004293{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304294 unsigned short i;
Aaro Koskinend21222d2012-09-11 00:15:29 +03004295 unsigned char const *tempdi;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304296 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004297
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004298 /* si+Ext_ResInfo */
4299 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004300
Aaro Koskinen8104e322011-03-13 12:26:22 +02004301 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004302 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004303 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4304 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304305 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004306 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4307 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304308 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004309
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304310 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4311 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004312
Peter Huewe599801f2012-02-09 21:11:45 +01004313 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004314 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4315 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4316 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304317 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004318
Peter Huewe599801f2012-02-09 21:11:45 +01004319 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4320 & SetCRT2ToYPbPr525750)) {
4321 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304322 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004323
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004324 tempdi = XGI330_HiTVGroup3Data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304325 if (pVBInfo->SetFlag & TVSimuMode) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004326 tempdi = XGI330_HiTVGroup3Simu;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304327 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004328 tempdi = XGI330_HiTVGroup3Text;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004330
Peter Huewe599801f2012-02-09 21:11:45 +01004331 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004332 tempdi = XGI330_Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004333
Peter Huewe599801f2012-02-09 21:11:45 +01004334 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004335 tempdi = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304337 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004338 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304340 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004341 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004342 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304343 }
4344 }
4345 return;
4346} /* {end of XGI_SetGroup3} */
4347
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004348static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349 unsigned short RefreshRateTableIndex,
4350 struct xgi_hw_device_info *HwDeviceExtension,
4351 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004352{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304353 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004356
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004357 /* si+Ext_ResInfo */
4358 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304359 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004360 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304362 tempbx = pVBInfo->RVBHCMAX;
4363 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004364 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304365 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4366 tempcx = pVBInfo->VGAHT - 1;
4367 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004368 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004369
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304370 temp = ((tempcx & 0xFF00) >> 8) << 3;
4371 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304373 tempcx = pVBInfo->VGAVT - 1;
4374 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4375 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304377 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004378 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304379 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004380 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004381 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304382 tempcx = pVBInfo->VBInfo;
4383 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004384
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304385 if (modeflag & HalfDCLK)
4386 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004387
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304388 if (XGI_IsLCDDualLink(pVBInfo))
4389 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004390
Peter Huewe599801f2012-02-09 21:11:45 +01004391 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304392 temp = 0;
4393 if (tempbx <= 1024)
4394 temp = 0xA0;
4395 if (tempbx == 1280)
4396 temp = 0xC0;
4397 } else if (tempcx & SetCRT2ToTV) {
4398 temp = 0xA0;
4399 if (tempbx <= 800)
4400 temp = 0x80;
4401 } else {
4402 temp = 0x80;
4403 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4404 temp = 0;
4405 if (tempbx > 800)
4406 temp = 0x60;
4407 }
4408 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004409
Peter Huewe599801f2012-02-09 21:11:45 +01004410 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304411 temp = 0x00;
4412 if (pVBInfo->VGAHDE == 1280)
4413 temp = 0x40;
4414 if (pVBInfo->VGAHDE == 1024)
4415 temp = 0x20;
4416 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004417 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004418
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304419 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004420
Peter Huewe599801f2012-02-09 21:11:45 +01004421 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304422 if (!(temp & 0xE000))
4423 tempbx = tempbx >> 1;
4424 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004425
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304426 tempcx = pVBInfo->RVBHRS;
4427 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004428 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004429
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304430 tempeax = pVBInfo->VGAVDE;
4431 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004432
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304433 if (tempeax <= tempebx) {
4434 tempcx = (tempcx & (~0x4000));
4435 tempeax = pVBInfo->VGAVDE;
4436 } else {
4437 tempeax -= tempebx;
4438 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004439
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304440 templong = (tempeax * 256 * 1024) % tempebx;
4441 tempeax = (tempeax * 256 * 1024) / tempebx;
4442 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004443
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304444 if (templong != 0)
4445 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004446
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304447 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004448 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004449
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304450 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004451 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304452 tempbx = (unsigned short) (tempebx >> 16);
4453 temp = tempbx & 0x00FF;
4454 temp = temp << 4;
4455 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004456 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304458 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004459 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4460 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304461 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004462 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304463 tempax = pVBInfo->VGAHDE;
4464 if (modeflag & HalfDCLK)
4465 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004466
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304467 if (XGI_IsLCDDualLink(pVBInfo))
4468 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004469
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304470 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4471 if (tempax > 800)
4472 tempax -= 800;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004473 } else if (pVBInfo->VGAHDE > 800) {
4474 if (pVBInfo->VGAHDE == 1024)
4475 tempax = (tempax * 25 / 32) - 1;
4476 else
4477 tempax = (tempax * 20 / 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304478 }
4479 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004480
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304481 temp = (tempax & 0xFF00) >> 8;
4482 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004483 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304484 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004485 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004486
Peter Huewe599801f2012-02-09 21:11:45 +01004487 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304488 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004489 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004490
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304491 }
4492 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004493
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304494 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4495 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004496 | TVSetYPbPr525p | TVSetYPbPr750p
4497 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304498 temp |= 0x0001;
4499 if ((pVBInfo->VBInfo & SetInSlaveMode)
4500 && (!(pVBInfo->TVInfo
4501 & TVSimuMode)))
4502 temp &= (~0x0001);
4503 }
4504 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004505
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004506 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304507 tempbx = pVBInfo->HT;
4508 if (XGI_IsLCDDualLink(pVBInfo))
4509 tempbx = tempbx >> 1;
4510 tempbx = (tempbx >> 1) - 2;
4511 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004512 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304513 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004514 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304515 }
4516 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004517
Aaro Koskinen8951dad2012-09-11 00:15:30 +03004518 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004519}
4520
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004521static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4522{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004523 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004524}
4525
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004526static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304527 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004528{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304529 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004530
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304531 Pindex = pVBInfo->Part5Port;
4532 Pdata = pVBInfo->Part5Port + 1;
4533 if (pVBInfo->ModeType == ModeVGA) {
4534 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01004535 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304536 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304537 }
4538 }
4539 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004540}
4541
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004542static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304543 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004544{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004545 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004546}
4547
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004548static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004550{
4551
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004552 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004553}
4554
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004555static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
4556 unsigned short ModeNo, unsigned short ModeIdIndex,
4557 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004558{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004559 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004560
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004561 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004562 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4563 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4564 /* si+St_ModeFlag */
4565 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004566
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304567 if (!(modeflag & Charx8Dot)) {
4568 xres /= 9;
4569 xres *= 8;
4570 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004571
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004572 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4573 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004574
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004575 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4576 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004577
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004578 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304579 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04004580
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004581 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304582 return 0;
4583
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004584 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4585 yres != xgifb_info->lvds_data.LVDSVDE) {
4586 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4587 if (colordepth > 2)
4588 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304589 }
4590 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004591}
4592
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004593static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4594 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004595 unsigned short ModeNo,
4596 unsigned short ModeIdIndex,
4597 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004598{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304599 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004600 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304601 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4602 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4603 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004604
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004605 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004606 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304607 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004608 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004609
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004610 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004611
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004612 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004613 /* SR35[7] FP VSync polarity */
4614 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4615 /* SR30[5] FP HSync polarity */
4616 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004617
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004618 if (chip_id == XG27)
4619 XGI_SetXG27FPBits(pVBInfo);
4620 else
4621 XGI_SetXG21FPBits(pVBInfo);
4622
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004623 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004624 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4625 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4626 /* si+St_ModeFlag */
4627 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004628
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304629 if (!(modeflag & Charx8Dot))
4630 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004631
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004632 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004633
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004634 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004635
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304636 if (LVDSHBS > LVDSHT)
4637 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004638
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004639 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304640 if (LVDSHRS > LVDSHT)
4641 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004642
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004643 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304644 if (LVDSHRE > LVDSHT)
4645 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004646
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004647 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004648
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004649 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004650
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004651 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004652 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304653 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004654
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304655 if (LVDSVBS > LVDSVT)
4656 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004657
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004658 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304659 if (LVDSVRS > LVDSVT)
4660 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004661
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004662 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304663 if (LVDSVRE > LVDSVT)
4664 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004665
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004666 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004667
Aaro Koskinen58839b02011-03-13 12:26:23 +02004668 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004669 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004670
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304671 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004672 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004673
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304674 /* HT SR0B[1:0] CR00 */
4675 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004676 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004677 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004678
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304679 /* HBS SR0B[5:4] CR02 */
4680 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004681 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004682 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004683
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304684 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
4685 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004686 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
4687 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
4688 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004689
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304690 /* HRS SR0B[7:6] CR04 */
4691 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004692 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004693 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304695 /* Panel HRS SR2F[1:0] SR2E[7:0] */
4696 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004697 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004698 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004699
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304700 /* HRE SR0C[2] CR05[4:0] */
4701 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004702 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
4703 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004704
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304705 /* Panel HRE SR2F[7:2] */
4706 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004707 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004708
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304709 /* VT SR0A[0] CR07[5][0] CR06 */
4710 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004711 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
4712 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
4713 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004714 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004715
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304716 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
4717 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004718 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
4719 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
4720 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004721 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004722
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304723 /* VBE SR0A[4] CR16 */
4724 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004725 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004726 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004727
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304728 /* VRS SR0A[3] CR7[7][2] CR10 */
4729 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004730 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
4731 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
4732 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004733 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004734
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004735 if (chip_id == XG27) {
4736 /* Panel VRS SR35[2:0] SR34[7:0] */
4737 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
4738 (value & 0x700) >> 8);
4739 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
4740 } else {
4741 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
4742 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
4743 (value & 0x600) >> 9);
4744 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
4745 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
4746 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004747
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304748 /* VRE SR0A[5] CR11[3:0] */
4749 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004750 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
4751 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004752
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304753 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004754 if (chip_id == XG27)
4755 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4756 (value << 2) & 0xFC);
4757 else
4758 /* SR3F[7] has to be 0, h/w bug */
4759 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4760 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004761
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304762 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004763
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004764 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004765 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004766 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004767 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004768 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304769 value += 0x10;
4770 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004771
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304772 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004773 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004774 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004775 /* set data, panning = 0, shift left 1 dot*/
4776 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004777
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004778 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004779 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304780
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004781 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304782 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004783
4784}
4785
4786/* --------------------------------------------------------------------- */
4787/* Function : XGI_IsLCDON */
4788/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04004789/* Output : 0 : Skip PSC Control */
4790/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004791/* Description : */
4792/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004793static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004794{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304795 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 tempax = pVBInfo->VBInfo;
4798 if (tempax & SetCRT2ToDualEdge)
4799 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01004800 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304801 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004802
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304803 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004804}
4805
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004806/* --------------------------------------------------------------------- */
4807/* Function : XGI_DisableChISLCD */
4808/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04004809/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004810/* Description : */
4811/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004812static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004813{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304814 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004815
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304816 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004817 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004818
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304819 if (tempbx & (EnableChA | DisableChA)) {
4820 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4821 return 0;
4822 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 if (!(tempbx & (EnableChB | DisableChB)))
4825 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004826
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304827 if (tempah & 0x01) /* Chk LCDB Mode */
4828 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004829
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304830 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004831}
4832
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004833/* --------------------------------------------------------------------- */
4834/* Function : XGI_EnableChISLCD */
4835/* Input : */
4836/* Output : 0 -> Not LCD mode */
4837/* Description : */
4838/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004839static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004840{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304841 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004842
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304843 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004844 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304846 if (tempbx & (EnableChA | DisableChA)) {
4847 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4848 return 0;
4849 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004850
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304851 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04004852 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004853
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304854 if (tempah & 0x01) /* Chk LCDB Mode */
4855 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004856
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304857 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004858}
4859
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004860static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
4861 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304862 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004863{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02004864 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004865
Peter Huewe6896b942012-02-09 21:11:46 +01004866 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4867 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304868 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004869 if (!(pVBInfo->VBInfo &
4870 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004871 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304872 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
4873 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004874 if (!(pVBInfo->VBInfo &
4875 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004876 /* Disable Channel B */
4877 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004878
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304879 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004880 /* force to disable Cahnnel */
4881 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004882
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304883 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004884 /* Force to disable Channel B */
4885 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304886 }
4887 }
4888 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004889
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004890 /* disable part4_1f */
4891 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004892
Peter Huewe6896b942012-02-09 21:11:46 +01004893 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004894 if (((pVBInfo->VBInfo &
4895 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
4896 || (XGI_DisableChISLCD(pVBInfo))
4897 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004898 /* LVDS Driver power down */
4899 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304900 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004901
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304902 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01004903 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304904 | SetSimuScanMode))) {
4905 if (pVBInfo->SetFlag & GatingCRT)
4906 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004907 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304908 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004909
Peter Huewea3d675c2012-02-09 21:11:47 +01004910 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304911 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01004912 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004913 /* Power down */
4914 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304915 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004916
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004917 /* disable TV as primary VGA swap */
4918 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004919
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304920 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02004921 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004922
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004923 if ((pVBInfo->SetFlag & DisableChB) ||
4924 (pVBInfo->VBInfo &
4925 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004926 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004927 (pVBInfo->VBInfo &
4928 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004929 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004930
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004931 if ((pVBInfo->SetFlag & DisableChB) ||
4932 (pVBInfo->VBInfo &
4933 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004934 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004935 (pVBInfo->VBInfo &
4936 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
4937 /* save Part1 index 0 */
4938 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
4939 /* BTDAC = 1, avoid VB reset */
4940 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
4941 /* disable CRT2 */
4942 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4943 /* restore Part1 index 0 */
4944 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304945 }
4946 } else { /* {301} */
4947 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004948 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
4949 /* Disable CRT2 */
4950 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4951 /* Disable TV asPrimary VGA swap */
4952 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304953 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004954
Peter Huewea3d675c2012-02-09 21:11:47 +01004955 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304956 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004957 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004959}
4960
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004961/* --------------------------------------------------------------------- */
4962/* Function : XGI_GetTVPtrIndex */
4963/* Input : */
4964/* Output : */
4965/* Description : bx 0 : ExtNTSC */
4966/* 1 : StNTSC */
4967/* 2 : ExtPAL */
4968/* 3 : StPAL */
4969/* 4 : ExtHiTV */
4970/* 5 : StHiTV */
4971/* 6 : Ext525i */
4972/* 7 : St525i */
4973/* 8 : Ext525p */
4974/* 9 : St525p */
4975/* A : Ext750p */
4976/* B : St750p */
4977/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004978static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004979{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304980 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004981
Peter Huewe599801f2012-02-09 21:11:45 +01004982 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304983 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01004984 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304985 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01004986 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304987 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01004988 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304989 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004990 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304991 tempbx = 10;
4992 if (pVBInfo->TVInfo & TVSimuMode)
4993 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004994
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304995 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996}
4997
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004998/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004999/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005000/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005001/* Output : bx 0 : NTSC */
5002/* 1 : PAL */
5003/* 2 : PALM */
5004/* 3 : PALN */
5005/* 4 : NTSC1024x768 */
5006/* 5 : PAL-M 1024x768 */
5007/* 6-7: reserved */
5008/* cl 0 : YFilter1 */
5009/* 1 : YFilter2 */
5010/* ch 0 : 301A */
5011/* 1 : 301B/302B/301LV/302LV */
5012/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005013/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005014static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
5015 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005016{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005017 *tempbx = 0;
5018 *tempcl = 0;
5019 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005020
Peter Huewe599801f2012-02-09 21:11:45 +01005021 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005022 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005023
Peter Huewe599801f2012-02-09 21:11:45 +01005024 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005025 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005026
Peter Huewe599801f2012-02-09 21:11:45 +01005027 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005028 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005029
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005030 if (pVBInfo->TVInfo & NTSC1024x768) {
5031 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01005032 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005033 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305034 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005035
Peter Huewe6896b942012-02-09 21:11:46 +01005036 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5037 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005038 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5039 & TVSimuMode)) {
5040 *tempbx += 8;
5041 *tempcl += 1;
5042 }
5043 }
5044
Peter Huewe6896b942012-02-09 21:11:46 +01005045 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5046 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005047 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005048}
5049
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005050static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005051{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305052 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005053
Peter Huewe6896b942012-02-09 21:11:46 +01005054 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5055 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005056 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305057 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305058 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005059 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005060
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305061 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5062 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005063 if (pVBInfo->VBInfo &
5064 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005065 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005066
Peter Huewea3d675c2012-02-09 21:11:47 +01005067 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305068 tempbl = tempbh;
5069 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005070
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305071 tempbl &= 0x0F;
5072 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005073 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305075 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5076 | SetCRT2ToTV)) { /* Channel B */
5077 tempah &= 0xF0;
5078 tempah |= tempbl;
5079 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005080
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005081 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5082 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305083 tempah &= 0x0F;
5084 tempah |= tempbh;
5085 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005086 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305087 }
5088 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5089 tempbl = 0;
5090 tempbh = 0;
5091 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005092 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305093 tempah &= 0x0f;
5094 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005095 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305096 tempah);
5097 }
5098 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005099}
5100
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005101static void XGI_SetLCDCap_A(unsigned short tempcx,
5102 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005103{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305104 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005105
Aaro Koskinen58839b02011-03-13 12:26:23 +02005106 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005107
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305108 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005109 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005110 /* Enable Dither */
5111 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005112 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305113 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005114 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305115 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005116 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305117 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005118}
5119
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005120/* --------------------------------------------------------------------- */
5121/* Function : XGI_SetLCDCap_B */
5122/* Input : cx -> LCD Capability */
5123/* Output : */
5124/* Description : */
5125/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005126static void XGI_SetLCDCap_B(unsigned short tempcx,
5127 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005128{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005130 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305131 (unsigned short) (((tempcx & 0x00ff) >> 6)
5132 | 0x0c));
5133 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005134 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305135 (unsigned short) (((tempcx & 0x00ff) >> 6)
5136 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005137}
5138
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005139static void XGI_LongWait(struct vb_device_info *pVBInfo)
5140{
5141 unsigned short i;
5142
5143 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5144
5145 if (!(i & 0xC0)) {
5146 for (i = 0; i < 0xFFFF; i++) {
5147 if (!(inb(pVBInfo->P3da) & 0x08))
5148 break;
5149 }
5150
5151 for (i = 0; i < 0xFFFF; i++) {
5152 if ((inb(pVBInfo->P3da) & 0x08))
5153 break;
5154 }
5155 }
5156}
5157
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005158static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005159{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305160 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005161
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305162 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005163
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005164 /* disable down spectrum D[4] */
5165 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305166 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005167 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305168 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005169
Aaro Koskinen8104e322011-03-13 12:26:22 +02005170 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305171 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005172 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305173 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005174 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305175 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005176 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305177 pVBInfo->LCDCapList[index].Spectrum_34);
5178 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005179 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005180}
5181
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005182static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5183{
5184 unsigned short tempcx;
5185
5186 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5187
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005188 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005189 (VB_SIS301B |
5190 VB_SIS302B |
5191 VB_SIS301LV |
5192 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005193 VB_XGI301C)) { /* 301LV/302LV only */
5194 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005195 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005196 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005197 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005198 (unsigned char) (tempcx & 0x1F));
5199 }
5200 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005201 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005202 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5203 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5204 | EnablePLLSPLOW)) >> 8));
5205 }
5206
Peter Huewe6896b942012-02-09 21:11:46 +01005207 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5208 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005209 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5210 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005211 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005212 XGI_SetLCDCap_A(tempcx, pVBInfo);
5213
Peter Huewe6896b942012-02-09 21:11:46 +01005214 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005215 if (tempcx & EnableSpectrum)
5216 SetSpectrum(pVBInfo);
5217 }
5218 } else {
5219 /* LVDS,CH7017 */
5220 XGI_SetLCDCap_A(tempcx, pVBInfo);
5221 }
5222}
5223
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005224/* --------------------------------------------------------------------- */
5225/* Function : XGI_SetAntiFlicker */
5226/* Input : */
5227/* Output : */
5228/* Description : Set TV Customized Param. */
5229/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005230static void XGI_SetAntiFlicker(unsigned short ModeNo,
5231 unsigned short ModeIdIndex,
5232 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005233{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005234 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305236 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005237
Peter Huewe599801f2012-02-09 21:11:45 +01005238 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305239 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005240
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305241 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5242 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305243 tempah = TVAntiFlickList[tempbx];
5244 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005245
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005246 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005247}
5248
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005249static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5250 unsigned short ModeIdIndex,
5251 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005252{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005253 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005254
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305255 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305257 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5258 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305259 tempah = TVEdgeList[tempbx];
5260 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005261
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005262 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005263}
5264
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005265static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005266{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305267 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305269 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305271 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005272
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305273 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5274 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005275
Aaro Koskinen8104e322011-03-13 12:26:22 +02005276 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305277 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005278 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305279 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005280 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305281 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005282 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305283 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005284}
5285
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005286static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305287 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005288{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305289 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305291 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005292
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305293 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005294
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305295 switch (tempbx) {
5296 case 0x00:
5297 case 0x04:
5298 filterPtr = NTSCYFilter1;
5299 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305301 case 0x01:
5302 filterPtr = PALYFilter1;
5303 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005304
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305305 case 0x02:
5306 case 0x05:
5307 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305308 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005309 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305310 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005311
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305312 case 0x08:
5313 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305314 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305315 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305316 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005317 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305318 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005319
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305320 default:
5321 return;
5322 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005323
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005324 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305325 if (tempcl == 0)
5326 index = tempal * 4;
5327 else
5328 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005329
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305330 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005331 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5332 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5333 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5334 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305335 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005336 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5337 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5338 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5339 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305340 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005341
Peter Huewe6896b942012-02-09 21:11:46 +01005342 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5343 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005344 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5345 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5346 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305347 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005348}
5349
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005350/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005351/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005352/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005353/* Output : */
5354/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005355/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005356static void XGI_OEM310Setting(unsigned short ModeNo,
5357 unsigned short ModeIdIndex,
5358 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005359{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005360 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005361
Peter Huewea3d675c2012-02-09 21:11:47 +01005362 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005363 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005364
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005365 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005366 XGI_SetPhaseIncr(pVBInfo);
5367 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5368 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005369
Peter Huewe6896b942012-02-09 21:11:46 +01005370 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005371 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305372 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005373}
5374
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005375/* --------------------------------------------------------------------- */
5376/* Function : XGI_SetCRT2ModeRegs */
5377/* Input : */
5378/* Output : */
5379/* Description : Origin code for crt2group */
5380/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005381static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305382 struct xgi_hw_device_info *HwDeviceExtension,
5383 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005384{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305385 unsigned short tempbl;
5386 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005387
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305388 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005389
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305390 tempah = 0;
5391 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005392 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305393 tempah &= ~0x10; /* BTRAMDAC */
5394 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005395
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305396 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5397 | SetCRT2ToLCD)) {
5398 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005399 tempcl = pVBInfo->ModeType;
5400 tempcl -= ModeVGA;
5401 if (tempcl >= 0) {
5402 /* BT Color */
5403 tempah = (0x008 >> tempcl);
5404 if (tempah == 0)
5405 tempah = 1;
5406 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305407 }
5408 if (pVBInfo->VBInfo & SetInSlaveMode)
5409 tempah ^= 0x50; /* BTDAC */
5410 }
5411 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005412
Aaro Koskinen8104e322011-03-13 12:26:22 +02005413 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305414 tempah = 0x08;
5415 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005416
Miguel Gómeze123e462012-07-06 12:40:52 +02005417 if (pVBInfo->VBInfo & DisableCRT2Display)
5418 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005419
Miguel Gómeze123e462012-07-06 12:40:52 +02005420 tempah = 0x00;
5421 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005422
Miguel Gómeze123e462012-07-06 12:40:52 +02005423 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5424 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5425 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005426
Miguel Gómeze123e462012-07-06 12:40:52 +02005427 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5428 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5429 tempbl &= 0xf7;
5430 tempah |= 0x01;
5431 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305432 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005433
Miguel Gómeze123e462012-07-06 12:40:52 +02005434 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5435 tempbl &= 0xf7;
5436 tempah |= 0x01;
5437 }
5438
5439 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5440 goto reg_and_or;
5441
5442 tempbl &= 0xf8;
5443 tempah = 0x01;
5444
5445 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5446 tempah |= 0x02;
5447
5448 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5449 tempah = tempah ^ 0x05;
5450 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5451 tempah = tempah ^ 0x01;
5452 }
5453
5454 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5455 tempah |= 0x08;
5456
5457reg_and_or:
5458 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5459
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305460 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005461 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305462 tempah &= (~0x08);
5463 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5464 & SetInSlaveMode))) {
5465 tempah |= 0x010;
5466 }
5467 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005468
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305469 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305470 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005471 if (pVBInfo->VBInfo & DriverMode)
5472 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305473 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005474
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005475 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305476 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005477
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305478 if (pVBInfo->LCDInfo & SetLCDDualLink)
5479 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005480
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305481 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305482 if (pVBInfo->TVInfo & RPLLDIV2XO)
5483 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305484 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005485
Peter Huewe255aabd2012-02-09 21:11:44 +01005486 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5487 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305488 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005489
Peter Huewe255aabd2012-02-09 21:11:44 +01005490 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305491 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005492
Aaro Koskinen8104e322011-03-13 12:26:22 +02005493 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305494 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005495
Peter Huewe6896b942012-02-09 21:11:46 +01005496 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5497 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305498 tempah = 0;
5499 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005500
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305501 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5502 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005503 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305504 tempah |= 0x04; /* shampoo 0129 */
5505 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005506
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005507 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305508 tempah = 0x00;
5509 tempbl = 0xcf;
5510 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5511 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5512 tempah |= 0x30;
5513 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005514
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005515 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305516 tempah = 0;
5517 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005518
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305519 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5520 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5521 tempah |= 0xc0;
5522 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005523 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305524 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005525
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305526 tempah = 0;
5527 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005528 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305529 tempbl = 0xff;
5530 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5531 tempah |= 0x80;
5532 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005533
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005534 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005535
Peter Huewe6896b942012-02-09 21:11:46 +01005536 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305537 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005538 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5539 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305540 }
5541 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005542}
5543
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005544
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305545void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5546 struct vb_device_info *pVBInfo)
5547{
5548
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005549 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005550
5551}
5552
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305553void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5554 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005555{
5556
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005557 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005558
5559}
5560
Bill Pemberton80adad82010-06-17 13:10:51 -04005561unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005562{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305563 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005564
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305565 if (pVBInfo->IF_DEF_LVDS == 1) {
5566 return 1;
5567 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005568 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305569 if ((flag == 1) || (flag == 2))
5570 return 1; /* 301b */
5571 else
5572 return 0;
5573 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005574}
5575
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005576unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5577 unsigned short ModeNo, unsigned short ModeIdIndex,
5578 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005579{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005580 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
5581 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
5582 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005583
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005584 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005585
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005586 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005587
Aaro Koskinen58839b02011-03-13 12:26:23 +02005588 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005589 index = index >> pVBInfo->SelectCRT2Rate;
5590 index &= 0x0F;
5591
5592 if (pVBInfo->LCDInfo & LCDNonExpanding)
5593 index = 0;
5594
5595 if (index > 0)
5596 index--;
5597
5598 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005599 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005600 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01005601 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5602 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005603 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005604 /* 301b */
5605 temp = LCDARefreshIndex[
5606 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005607 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005608 temp = LCDRefreshIndex[
5609 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005610
5611 if (index > temp)
5612 index = temp;
5613 } else {
5614 index = 0;
5615 }
5616 }
5617 }
5618
5619 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
5620 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
5621 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005622 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
5623 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005624 index++;
5625 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005626 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005627 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5628 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005629 index++;
5630 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005631 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5632 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005633 index++;
5634 }
5635 }
5636
5637 i = 0;
5638 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005639 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
5640 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005641 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005642 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
5643 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01005644 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005645 if (temp < pVBInfo->ModeType)
5646 break;
5647 i++;
5648 index--;
5649
5650 } while (index != 0xFFFF);
5651 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5652 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005653 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
5654 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005655 if (temp & InterlaceMode)
5656 i++;
5657 }
5658 }
5659 i--;
5660 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
5661 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
5662 RefreshRateTableIndex, &i, pVBInfo);
5663 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02005664 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005665}
5666
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005667static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305668 struct xgi_hw_device_info *HwDeviceExtension,
5669 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005670{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005671 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005672
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005673 pVBInfo->SetFlag |= ProgrammingCRT2;
5674 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5675 ModeIdIndex, pVBInfo);
5676 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
5677 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5678 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5679 HwDeviceExtension, pVBInfo);
5680 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5681 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005682}
5683
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005684static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005685 struct xgi_hw_device_info *HwDeviceExtension,
5686 struct vb_device_info *pVBInfo)
5687{
5688 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
5689
5690 tempbx = pVBInfo->VBInfo;
5691 pVBInfo->SetFlag |= ProgrammingCRT2;
5692 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
5693 pVBInfo->SelectCRT2Rate = 4;
5694 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5695 ModeIdIndex, pVBInfo);
5696 XGI_SaveCRT2Info(ModeNo, pVBInfo);
5697 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
5698 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5699 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5700 RefreshRateTableIndex, pVBInfo);
5701 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5702 RefreshRateTableIndex, pVBInfo);
5703 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5704 RefreshRateTableIndex, pVBInfo);
5705 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5706 HwDeviceExtension, pVBInfo);
5707 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5708 RefreshRateTableIndex, pVBInfo);
5709 XGI_SetTap4Regs(pVBInfo);
5710 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
5711 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5712 HwDeviceExtension, pVBInfo);
5713 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5714 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
5715 XGI_AutoThreshold(pVBInfo);
5716 return 1;
5717}
5718
5719void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
5720{
5721 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
5722 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
5723 0x05, 0x00 };
5724
5725 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
5726
5727 unsigned char CR17, CR63, SR31;
5728 unsigned short temp;
5729 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
5730
5731 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005732 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005733
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005734 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005735 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005736 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005737 pVBInfo->P3d4, 0x53) | 0x02));
5738
Aaro Koskinen58839b02011-03-13 12:26:23 +02005739 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
5740 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
5741 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005742
Aaro Koskinen8104e322011-03-13 12:26:22 +02005743 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
5744 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005745
Aaro Koskinen58839b02011-03-13 12:26:23 +02005746 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005747 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005748
Aaro Koskinen58839b02011-03-13 12:26:23 +02005749 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005750 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005751
Aaro Koskinen58839b02011-03-13 12:26:23 +02005752 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005753 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02005754 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005755 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005756
Aaro Koskinen8104e322011-03-13 12:26:22 +02005757 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005758
5759 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005760 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005761
5762 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005763 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005764 CRTCData[i]);
5765
5766 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005767 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005768 CRTCData[i]);
5769
5770 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005771 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005772 CRTCData[i]);
5773
Aaro Koskinen8104e322011-03-13 12:26:22 +02005774 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005775 & 0xE0));
5776
Aaro Koskinen8104e322011-03-13 12:26:22 +02005777 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
5778 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
5779 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005780
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005781 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005782
5783 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005784 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
5785 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
5786 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005787 }
5788
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005789 mdelay(1);
5790
5791 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005792 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005793
5794 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005795 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005796 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005797 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005798
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005799 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005800 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005801
5802 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005803 outb(0, (pVBInfo->P3c8 + 1));
5804 outb(0, (pVBInfo->P3c8 + 1));
5805 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005806 }
5807
Aaro Koskinen8104e322011-03-13 12:26:22 +02005808 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
5809 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
5810 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005811
Aaro Koskinen58839b02011-03-13 12:26:23 +02005812 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005813 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005814 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005815}
5816
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005817static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
5818 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005819 struct vb_device_info *pVBInfo)
5820{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005821 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005822
Peter Huewe6896b942012-02-09 21:11:46 +01005823 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5824 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005825 if (!(pVBInfo->SetFlag & DisableChA)) {
5826 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005827 /* Power on */
5828 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03005829 } else if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5830 /* Power on */
5831 xgifb_reg_set(pVBInfo->Part1Port,
5832 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005833 }
5834 }
5835
5836 if (!(pVBInfo->SetFlag & DisableChB)) {
5837 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
5838 & (SetCRT2ToLCD | SetCRT2ToTV
5839 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005840 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005841 pVBInfo->P3c4, 0x32);
5842 tempah &= 0xDF;
5843 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005844 if (!(pVBInfo->VBInfo &
5845 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005846 tempah |= 0x20;
5847 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005848 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005849 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005850
Aaro Koskinen58839b02011-03-13 12:26:23 +02005851 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005852 pVBInfo->Part1Port, 0x2E);
5853
5854 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005855 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005856 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005857 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005858 }
5859 }
5860
5861 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
5862 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005863 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005864 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01005865 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005866 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005867 if (XGI_EnableChISLCD(pVBInfo) ||
5868 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01005869 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005870 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02005871 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005872 pVBInfo->Part4Port,
5873 0x2A,
5874 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005875 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005876 /* LVDS Driver power on */
5877 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005878 }
5879 }
5880
5881 tempah = 0x00;
5882
5883 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5884 tempah = 0xc0;
5885
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005886 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
5887 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5888 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
5889 tempah = tempah & 0x40;
5890 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5891 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005892
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005893 if (pVBInfo->SetFlag & DisableChB)
5894 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005895
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005896 if (pVBInfo->SetFlag & DisableChA)
5897 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005898
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005899 if (pVBInfo->SetFlag & EnableChB)
5900 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005901
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005902 if (pVBInfo->SetFlag & EnableChA)
5903 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005904 }
5905 }
5906
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005907 /* EnablePart4_1F */
5908 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005909
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005910 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005911 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005912 XGI_DisableGatingCRT(HwDeviceExtension,
5913 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005914 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
5915 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005916 }
5917 }
5918 } /* 301 */
5919 else { /* LVDS */
5920 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005921 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005922 /* enable CRT2 */
5923 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005924
Aaro Koskinen58839b02011-03-13 12:26:23 +02005925 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005926 0x2E);
5927 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005928 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005929
Aaro Koskinendc505562011-03-13 12:26:26 +02005930 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005931 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005932 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005933}
5934
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005935static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
5936 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005937 unsigned short ModeNo, unsigned short ModeIdIndex,
5938 struct vb_device_info *pVBInfo)
5939{
Aaro Koskinena1579612012-04-07 01:14:05 +03005940 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005941
Aaro Koskinena1579612012-04-07 01:14:05 +03005942 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03005943 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03005944 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
5945 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
5946 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005947 XGI_ClearExt1Regs(pVBInfo);
5948
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005949 if (HwDeviceExtension->jChipType == XG27) {
5950 if (pVBInfo->IF_DEF_LVDS == 0)
5951 XGI_SetDefaultVCLK(pVBInfo);
5952 }
5953
5954 temp = ~ProgrammingCRT2;
5955 pVBInfo->SetFlag &= temp;
5956 pVBInfo->SelectCRT2Rate = 0;
5957
Peter Huewe6896b942012-02-09 21:11:46 +01005958 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5959 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005960 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005961 | SetInSlaveMode)) {
5962 pVBInfo->SetFlag |= ProgrammingCRT2;
5963 }
5964 }
5965
5966 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5967 ModeIdIndex, pVBInfo);
5968 if (RefreshRateTableIndex != 0xFFFF) {
5969 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
5970 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5971 pVBInfo, HwDeviceExtension);
5972 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
5973 RefreshRateTableIndex, pVBInfo);
5974 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5975 HwDeviceExtension, pVBInfo);
5976 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
5977 RefreshRateTableIndex, pVBInfo);
5978 }
5979
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005980 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005981 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005982 if (temp & 0xA0) {
5983
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005984 if (HwDeviceExtension->jChipType == XG27)
5985 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
5986 RefreshRateTableIndex, pVBInfo);
5987 else
5988 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
5989 RefreshRateTableIndex, pVBInfo);
5990
5991 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
5992 RefreshRateTableIndex);
5993
Aaro Koskinen105d8d02011-08-31 21:46:00 +03005994 xgifb_set_lcd(HwDeviceExtension->jChipType,
5995 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005996
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005997 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005998 xgifb_set_lvds(xgifb_info,
5999 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03006000 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006001 }
6002 }
6003
6004 pVBInfo->SetFlag &= (~ProgrammingCRT2);
6005 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
6006 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
6007 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006008 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006009}
6010
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006011unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
6012 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006013 unsigned short ModeNo)
6014{
6015 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006016 struct vb_device_info VBINF;
6017 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04006018 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006019 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006020
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006021 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006022 pVBInfo->IF_DEF_YPbPr = 0;
6023 pVBInfo->IF_DEF_HiVision = 0;
6024 pVBInfo->IF_DEF_CRT2Monitor = 0;
6025 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006026 } else {
6027 pVBInfo->IF_DEF_YPbPr = 1;
6028 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02006029 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006030 }
6031
6032 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6033 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6034 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6035 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6036 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6037 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6038 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6039 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6040 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6041 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6042 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6043 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6044 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006045 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6046 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6047 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6048 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6049 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006050
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006051 /* for x86 Linux, XG21 LVDS */
6052 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006053 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006054 pVBInfo->IF_DEF_LVDS = 1;
6055 }
6056 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006057 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6058 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006059 pVBInfo->IF_DEF_LVDS = 1;
6060 }
6061 }
6062
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006063 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006064 XGI_GetVBType(pVBInfo);
6065
6066 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006067 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006068 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006069 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006070
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006071 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006072 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6073
6074 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6075
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006076 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006077 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6078 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6079 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006080 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006081
Peter Huewea3d675c2012-02-09 21:11:47 +01006082 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006083 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006084 ModeIdIndex, pVBInfo);
6085
Peter Huewea3d675c2012-02-09 21:11:47 +01006086 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006087 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6088 HwDeviceExtension, pVBInfo);
6089 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006090 } else if (!(pVBInfo->VBInfo & SwitchCRT2)) {
6091 XGI_SetCRT1Group(xgifb_info,
6092 HwDeviceExtension, ModeNo,
6093 ModeIdIndex, pVBInfo);
6094 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6095 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6096 HwDeviceExtension,
6097 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006098 }
6099 }
6100
Peter Huewe6896b942012-02-09 21:11:46 +01006101 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006102 switch (HwDeviceExtension->ujVBChipID) {
6103 case VB_CHIP_301:
6104 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6105 pVBInfo); /*add for CRT2 */
6106 break;
6107
6108 case VB_CHIP_302:
6109 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6110 pVBInfo); /*add for CRT2 */
6111 break;
6112
6113 default:
6114 break;
6115 }
6116 }
6117
6118 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6119 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006120 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006121 } /* !XG20 */
6122 else {
6123 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006124 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006125 ModeIdIndex,
6126 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006127 return 0;
6128
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006129 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006130 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006131
6132 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006133 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006134
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006135 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006136
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006137 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6138 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006139
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006140 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006141 }
6142
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006143 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6144
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006145 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006146 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006147
6148 return 1;
6149}