blob: 3a99a92316fde486617bfbb71b113ccd35db71c8 [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 Koskinen9d1c6292012-11-04 21:14:46 +02001308static void *XGI_GetLcdPtr(struct XGI330_LCDDataTablStruct const *table,
1309 unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001310 unsigned short ModeIdIndex,
1311 unsigned short RefreshRateTableIndex,
1312 struct vb_device_info *pVBInfo)
1313{
Aaro Koskinen6c27b372012-11-04 21:14:45 +02001314 unsigned short i, tempdx, tempbx, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001315
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001316 tempbx = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001317
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001318 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001319
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001320 i = 0;
1321
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001322 while (table[i].PANELID != 0xff) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001323 tempdx = pVBInfo->LCDResInfo;
1324 if (tempbx & 0x0080) { /* OEMUtil */
1325 tempbx &= (~0x0080);
1326 tempdx = pVBInfo->LCDTypeInfo;
1327 }
1328
1329 if (pVBInfo->LCDInfo & EnableScalingLCD)
1330 tempdx &= (~PanelResInfo);
1331
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001332 if (table[i].PANELID == tempdx) {
1333 tempbx = table[i].MASK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001334 tempdx = pVBInfo->LCDInfo;
1335
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001336 if (modeflag & HalfDCLK)
1337 tempdx |= SetLCDLowResolution;
1338
1339 tempbx &= tempdx;
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001340 if (tempbx == table[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001341 break;
1342 }
1343 i++;
1344 }
1345
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001346 return table[i].DATAPTR;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001347}
1348
Aaro Koskinen24572542012-09-11 00:15:21 +03001349static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001350 unsigned short ModeIdIndex,
1351 unsigned short RefreshRateTableIndex,
1352 struct vb_device_info *pVBInfo)
1353{
Aaro Koskinen56d276c2012-09-11 00:15:19 +03001354 unsigned short i, tempdx, tempal, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001355
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001356 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1357 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001358 tempal = tempal & 0x3f;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001359 tempdx = pVBInfo->TVInfo;
1360
1361 if (pVBInfo->VBInfo & SetInSlaveMode)
1362 tempdx = tempdx | SetTVLockMode;
1363
1364 if (modeflag & HalfDCLK)
1365 tempdx = tempdx | SetTVLowResolution;
1366
1367 i = 0;
1368
Aaro Koskinen6265ee42012-09-11 00:15:20 +03001369 while (XGI_TVDataTable[i].MASK != 0xffff) {
1370 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1371 XGI_TVDataTable[i].CAP)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001372 break;
1373 i++;
1374 }
1375
Aaro Koskinen18ba8662012-09-11 00:15:22 +03001376 return &XGI_TVDataTable[i].DATAPTR[tempal];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001377}
1378
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001379static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301380 unsigned short RefreshRateTableIndex,
1381 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001382{
Peter Huewe51f984b2012-06-14 00:21:51 +02001383 struct SiS_LVDSData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001384
Peter Huewea3d675c2012-02-09 21:11:47 +01001385 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001386 LCDPtr = XGI_GetLcdPtr(XGI_EPLLCDDataPtr, ModeNo, ModeIdIndex,
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001387 RefreshRateTableIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301388 pVBInfo->VGAHT = LCDPtr->VGAHT;
1389 pVBInfo->VGAVT = LCDPtr->VGAVT;
1390 pVBInfo->HT = LCDPtr->LCDHT;
1391 pVBInfo->VT = LCDPtr->LCDVT;
1392 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001393
Peter Huewea3d675c2012-02-09 21:11:47 +01001394 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301395 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
1396 | EnableScalingLCD))) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001397 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1398 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301399 pVBInfo->HDE = 1024;
1400 pVBInfo->VDE = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001401 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001402 (pVBInfo->LCDResInfo ==
1403 Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301404 pVBInfo->HDE = 1280;
1405 pVBInfo->VDE = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001406 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301407 pVBInfo->HDE = 1400;
1408 pVBInfo->VDE = 1050;
1409 } else {
1410 pVBInfo->HDE = 1600;
1411 pVBInfo->VDE = 1200;
1412 }
1413 }
1414 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001415}
1416
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001417static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301418 unsigned short RefreshRateTableIndex,
1419 struct xgi_hw_device_info *HwDeviceExtension,
1420 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001421{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301422 unsigned char index;
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001423 unsigned short i;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301424 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
1425 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001426
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001427 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301428 index = index & IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001429
Peter Huewea3d675c2012-02-09 21:11:47 +01001430 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001431 LCDPtr = XGI_GetLcdPtr(xgifb_epllcd_crt1_h, ModeNo, ModeIdIndex,
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001432 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001433
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001434 for (i = 0; i < 8; i++)
1435 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301436 }
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001437
1438 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1439
Peter Huewea3d675c2012-02-09 21:11:47 +01001440 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001441 LCDPtr1 = XGI_GetLcdPtr(xgifb_epllcd_crt1_v, ModeNo,
1442 ModeIdIndex, RefreshRateTableIndex,
1443 pVBInfo);
Aaro Koskinenaef6bc72011-08-31 21:46:15 +03001444 for (i = 0; i < 7; i++)
1445 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
1446 }
1447
1448 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001449}
1450
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001451static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1452{
1453 unsigned char tempal, tempah, tempbl, i;
1454
Aaro Koskinen58839b02011-03-13 12:26:23 +02001455 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001456 tempal = tempah & 0x0F;
1457 tempah = tempah & 0xF0;
1458 i = 0;
1459 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1460
1461 while (tempbl != 0xFF) {
1462 if (tempbl & 0x80) { /* OEMUtil */
1463 tempal = tempah;
1464 tempbl = tempbl & ~(0x80);
1465 }
1466
1467 if (tempal == tempbl)
1468 break;
1469
1470 i++;
1471
1472 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1473 }
1474
1475 return i;
1476}
1477
1478static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1479{
1480 unsigned short tempah, tempal, tempbl, i;
1481
1482 tempal = pVBInfo->LCDResInfo;
1483 tempah = pVBInfo->LCDTypeInfo;
1484
1485 i = 0;
1486 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1487
1488 while (tempbl != 0xFF) {
1489 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1490 tempal = tempah;
1491 tempbl &= ~0x80;
1492 }
1493
1494 if (tempal == tempbl)
1495 break;
1496
1497 i++;
1498 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1499 }
1500
1501 if (tempbl == 0xFF) {
Peter Huewe255aabd2012-02-09 21:11:44 +01001502 pVBInfo->LCDResInfo = Panel_1024x768;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001503 pVBInfo->LCDTypeInfo = 0;
1504 i = 0;
1505 }
1506
1507 return i;
1508}
1509
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001510static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1511 unsigned short *VSyncWidth,
1512 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001513{
1514 unsigned short Index;
1515
1516 Index = XGI_GetLCDCapPtr(pVBInfo);
1517 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1518 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1519
1520 return;
1521}
1522
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001523static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301524 unsigned short RefreshRateTableIndex,
1525 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001526{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301527 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1528 unsigned long temp, temp1, temp2, temp3, push3;
Aaro Koskinend00d12f2012-04-07 01:14:10 +03001529 struct XGI_LCDDesStruct *LCDPtr = NULL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301530 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001531
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001532 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinen66cface2011-08-31 21:46:13 +03001533 if (pVBInfo->LCDInfo & EnableScalingLCD)
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001534 LCDPtr1 = XGI_GetLcdPtr(XGI_EPLLCDDesDataPtr, ModeNo,
1535 ModeIdIndex, RefreshRateTableIndex,
1536 pVBInfo);
Aaro Koskinen66cface2011-08-31 21:46:13 +03001537 else
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02001538 LCDPtr = XGI_GetLcdPtr(XGI_EPLLCDDesDataPtr, ModeNo,
1539 ModeIdIndex, RefreshRateTableIndex,
1540 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001541
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001542 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1543 push1 = tempbx;
1544 push2 = tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001545
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001546 /* GetLCDResInfo */
Peter Huewe255aabd2012-02-09 21:11:44 +01001547 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1548 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001549 tempax = 1024;
1550 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01001551 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1552 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001553 tempax = 1280;
1554 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01001555 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001556 tempax = 1400;
1557 tempbx = 1050;
1558 } else {
1559 tempax = 1600;
1560 tempbx = 1200;
1561 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001562
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001563 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1564 pVBInfo->HDE = tempax;
1565 pVBInfo->VDE = tempbx;
1566 pVBInfo->VGAHDE = tempax;
1567 pVBInfo->VGAVDE = tempbx;
1568 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001569
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001570 tempax = pVBInfo->HT;
1571
1572 if (pVBInfo->LCDInfo & EnableScalingLCD)
1573 tempbx = LCDPtr1->LCDHDES;
1574 else
1575 tempbx = LCDPtr->LCDHDES;
1576
1577 tempcx = pVBInfo->HDE;
1578 tempbx = tempbx & 0x0fff;
1579 tempcx += tempbx;
1580
1581 if (tempcx >= tempax)
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001582 tempcx -= tempax;
1583
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001584 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001585
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001586 tempcx = tempcx >> 3;
1587 tempbx = tempbx >> 3;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001588
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001589 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1590 (unsigned short) (tempbx & 0xff));
1591 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1592 (unsigned short) (tempcx & 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001593
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001594 tempax = pVBInfo->HT;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001595
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001596 if (pVBInfo->LCDInfo & EnableScalingLCD)
1597 tempbx = LCDPtr1->LCDHRS;
1598 else
1599 tempbx = LCDPtr->LCDHRS;
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001600
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001601 tempcx = push2;
1602
1603 if (pVBInfo->LCDInfo & EnableScalingLCD)
1604 tempcx = LCDPtr1->LCDHSync;
1605
1606 tempcx += tempbx;
1607
1608 if (tempcx >= tempax)
1609 tempcx -= tempax;
1610
1611 tempax = tempbx & 0x07;
1612 tempax = tempax >> 5;
1613 tempcx = tempcx >> 3;
1614 tempbx = tempbx >> 3;
1615
1616 tempcx &= 0x1f;
1617 tempax |= tempcx;
1618
1619 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
1620 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
1621 (unsigned short) (tempbx & 0xff));
1622
1623 tempax = pVBInfo->VT;
1624 if (pVBInfo->LCDInfo & EnableScalingLCD)
1625 tempbx = LCDPtr1->LCDVDES;
1626 else
1627 tempbx = LCDPtr->LCDVDES;
1628 tempcx = pVBInfo->VDE;
1629
1630 tempbx = tempbx & 0x0fff;
1631 tempcx += tempbx;
1632 if (tempcx >= tempax)
1633 tempcx -= tempax;
1634
1635 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
1636 (unsigned short) (tempbx & 0xff));
1637 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
1638 (unsigned short) (tempcx & 0xff));
1639
1640 tempbx = (tempbx >> 8) & 0x07;
1641 tempcx = (tempcx >> 8) & 0x07;
1642
1643 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
1644 (unsigned short) ((tempcx << 3)
1645 | tempbx));
1646
1647 tempax = pVBInfo->VT;
1648 if (pVBInfo->LCDInfo & EnableScalingLCD)
1649 tempbx = LCDPtr1->LCDVRS;
1650 else
1651 tempbx = LCDPtr->LCDVRS;
1652
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001653 tempcx = push1;
1654
1655 if (pVBInfo->LCDInfo & EnableScalingLCD)
1656 tempcx = LCDPtr1->LCDVSync;
1657
1658 tempcx += tempbx;
1659 if (tempcx >= tempax)
1660 tempcx -= tempax;
1661
1662 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
1663 (unsigned short) (tempbx & 0xff));
1664 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
1665 (unsigned short) (tempcx & 0x0f));
1666
1667 tempax = ((tempbx >> 8) & 0x07) << 3;
1668
1669 tempbx = pVBInfo->VGAVDE;
1670 if (tempbx != pVBInfo->VDE)
1671 tempax |= 0x40;
1672
Peter Huewea3d675c2012-02-09 21:11:47 +01001673 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001674 tempax |= 0x40;
1675
1676 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
1677 tempax);
1678
1679 tempcx = pVBInfo->VGAVT;
1680 tempbx = pVBInfo->VDE;
1681 tempax = pVBInfo->VGAVDE;
1682 tempcx -= tempax;
1683
1684 temp = tempax; /* 0430 ylshieh */
1685 temp1 = (temp << 18) / tempbx;
1686
1687 tempdx = (unsigned short) ((temp << 18) % tempbx);
1688
1689 if (tempdx != 0)
1690 temp1 += 1;
1691
1692 temp2 = temp1;
1693 push3 = temp2;
1694
1695 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
1696 (unsigned short) (temp2 & 0xff));
1697 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
1698 (unsigned short) ((temp2 >> 8) & 0xff));
1699
1700 tempbx = (unsigned short) (temp2 >> 16);
1701 tempax = tempbx & 0x03;
1702
1703 tempbx = pVBInfo->VGAVDE;
1704 if (tempbx == pVBInfo->VDE)
1705 tempax |= 0x04;
1706
1707 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
1708
1709 if (pVBInfo->VBType & VB_XGI301C) {
1710 temp2 = push3;
1711 xgifb_reg_set(pVBInfo->Part4Port,
1712 0x3c,
1713 (unsigned short) (temp2 & 0xff));
1714 xgifb_reg_set(pVBInfo->Part4Port,
1715 0x3b,
1716 (unsigned short) ((temp2 >> 8) &
1717 0xff));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001718 tempbx = (unsigned short) (temp2 >> 16);
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001719 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
1720 ~0xc0,
1721 (unsigned short) ((tempbx &
1722 0xff) << 6));
Aaro Koskinena35cd0b2011-08-31 21:45:56 +03001723
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001724 tempcx = pVBInfo->VGAVDE;
1725 if (tempcx == pVBInfo->VDE)
1726 xgifb_reg_and_or(pVBInfo->Part4Port,
1727 0x30, ~0x0c, 0x00);
1728 else
1729 xgifb_reg_and_or(pVBInfo->Part4Port,
1730 0x30, ~0x0c, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301731 }
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001732
1733 tempcx = pVBInfo->VGAHDE;
1734 tempbx = pVBInfo->HDE;
1735
1736 temp1 = tempcx << 16;
1737
1738 tempax = (unsigned short) (temp1 / tempbx);
1739
1740 if ((tempbx & 0xffff) == (tempcx & 0xffff))
1741 tempax = 65535;
1742
1743 temp3 = tempax;
1744 temp1 = pVBInfo->VGAHDE << 16;
1745
1746 temp1 /= temp3;
1747 temp3 = temp3 << 16;
1748 temp1 -= 1;
1749
1750 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
1751
1752 tempax = (unsigned short) (temp3 & 0xff);
1753 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
1754
1755 temp1 = pVBInfo->VGAVDE << 18;
1756 temp1 = temp1 / push3;
1757 tempbx = (unsigned short) (temp1 & 0xffff);
1758
Peter Huewe255aabd2012-02-09 21:11:44 +01001759 if (pVBInfo->LCDResInfo == Panel_1024x768)
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03001760 tempbx -= 1;
1761
1762 tempax = ((tempbx >> 8) & 0xff) << 3;
1763 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
1764 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
1765 (unsigned short) (tempax & 0xff));
1766 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
1767 (unsigned short) (tempbx & 0xff));
1768
1769 temp3 = temp3 >> 16;
1770
1771 if (modeflag & HalfDCLK)
1772 temp3 = temp3 >> 1;
1773
1774 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
1775 (unsigned short) ((temp3 >> 8) & 0xff));
1776 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
1777 (unsigned short) (temp3 & 0xff));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001778}
1779
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001780/* --------------------------------------------------------------------- */
1781/* Function : XGI_GETLCDVCLKPtr */
1782/* Input : */
1783/* Output : al -> VCLK Index */
1784/* Description : */
1785/* --------------------------------------------------------------------- */
1786static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
1787 struct vb_device_info *pVBInfo)
1788{
1789 unsigned short index;
1790
Peter Huewea3d675c2012-02-09 21:11:47 +01001791 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001792 index = XGI_GetLCDCapPtr1(pVBInfo);
1793
1794 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
1795 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
1796 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
1797 } else { /* LCDA */
1798 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
1799 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
1800 }
1801 }
1802 return;
1803}
1804
1805static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
1806 unsigned short ModeNo, unsigned short ModeIdIndex,
1807 struct vb_device_info *pVBInfo)
1808{
1809
1810 unsigned short index, modeflag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001811 unsigned char tempal;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001812
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03001813 /* si+Ext_ResInfo */
1814 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001815
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001816 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
1817 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001818 index = XGI_GetLCDCapPtr(pVBInfo);
1819 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
1820
Peter Huewea3d675c2012-02-09 21:11:47 +01001821 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001822 return tempal;
1823
1824 /* {TV} */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001825 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01001826 (VB_SIS301B |
1827 VB_SIS302B |
1828 VB_SIS301LV |
1829 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001830 VB_XGI301C)) {
Peter Huewe599801f2012-02-09 21:11:45 +01001831 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001832 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001833 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001834 tempal = TVCLKBASE_315 + HiTVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001835 if (pVBInfo->TVInfo & TVSimuMode) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001836 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001837 if (!(modeflag & Charx8Dot))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001838 tempal = TVCLKBASE_315 +
1839 HiTVTextVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001840
1841 }
1842 return tempal;
1843 }
1844
Peter Huewe599801f2012-02-09 21:11:45 +01001845 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Peter Huewea3d675c2012-02-09 21:11:47 +01001846 tempal = XGI_YPbPr750pVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001847 return tempal;
1848 }
1849
Peter Huewe599801f2012-02-09 21:11:45 +01001850 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001851 tempal = YPbPr525pVCLK;
1852 return tempal;
1853 }
1854
1855 tempal = NTSC1024VCLK;
1856
1857 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
Peter Hueweccc8cb22012-02-09 21:11:48 +01001858 tempal = TVCLKBASE_315 + TVVCLKDIV2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001859 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
Peter Hueweccc8cb22012-02-09 21:11:48 +01001860 tempal = TVCLKBASE_315 + TVVCLK;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001861 }
1862
1863 if (pVBInfo->VBInfo & SetCRT2ToTV)
1864 return tempal;
1865 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001866 } /* {End of VB} */
1867
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02001868 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001869 tempal = tempal >> 2;
1870 tempal &= 0x03;
1871
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001872 /* for Dot8 Scaling LCD */
1873 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001874 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
1875
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001876 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1877 return tempal;
1878}
1879
1880static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
1881 unsigned char *di_1, struct vb_device_info *pVBInfo)
1882{
Peter Huewe6896b942012-02-09 21:11:46 +01001883 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
1884 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001885 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
1886 (pVBInfo->SetFlag & ProgrammingCRT2)) {
Aaro Koskinene8cb03d2012-09-11 00:15:31 +03001887 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03001888 *di_1 = XGI_VBVCLKData[tempal].Part4_B;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02001889 }
1890 } else {
1891 *di_0 = XGI_VCLKData[tempal].SR2B;
1892 *di_1 = XGI_VCLKData[tempal].SR2C;
1893 }
1894}
1895
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001896static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301897 unsigned short RefreshRateTableIndex,
1898 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001899{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301900 unsigned char di_0, di_1, tempal;
1901 int i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001902
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301903 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
1904 pVBInfo);
1905 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
1906 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001907
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301908 for (i = 0; i < 4; i++) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001909 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301910 (unsigned short) (0x10 * i));
Peter Huewea3d675c2012-02-09 21:11:47 +01001911 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301912 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001913 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
1914 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301915 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001916 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
1917 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301918 }
1919 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001920}
1921
Aaro Koskinen063b9c42011-03-08 22:16:13 +02001922static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301923 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001924{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301925 unsigned short tempcl, tempch, temp, tempbl, tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001926
Peter Huewe6896b942012-02-09 21:11:46 +01001927 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1928 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301929 tempcl = 0;
1930 tempch = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001931 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001932
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301933 if (!(temp & 0x20)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001934 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301935 if (temp & 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001936 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301937 if (!(temp & 0x40))
1938 tempcl |= ActiveCRT1;
1939 }
1940 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001941
Aaro Koskinen58839b02011-03-13 12:26:23 +02001942 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301943 temp &= 0x0f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001944
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301945 if (!(temp == 0x08)) {
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001946 /* Check ChannelA */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08001947 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301948 if (tempax & 0x04)
1949 tempcl = tempcl | ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001950
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301951 temp &= 0x05;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001952
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301953 if (!(tempcl & ActiveLCD))
1954 if (temp == 0x01)
1955 tempcl |= ActiveCRT2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001956
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301957 if (temp == 0x04)
1958 tempcl |= ActiveLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001959
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301960 if (temp == 0x05) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001961 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001962
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301963 if (!(temp & 0x08))
1964 tempch |= ActiveAVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001965
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301966 if (!(temp & 0x04))
1967 tempch |= ActiveSVideo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001968
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301969 if (temp & 0x02)
1970 tempch |= ActiveSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001971
Peter Huewe599801f2012-02-09 21:11:45 +01001972 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301973 if (temp & 0x01)
1974 tempch |= ActiveHiTV;
1975 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001976
Peter Huewe599801f2012-02-09 21:11:45 +01001977 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001978 temp = xgifb_reg_get(
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301979 pVBInfo->Part2Port,
1980 0x4d);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001981
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301982 if (temp & 0x10)
1983 tempch |= ActiveYPbPr;
1984 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001985
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301986 if (tempch != 0)
1987 tempcl |= ActiveTV;
1988 }
1989 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001990
Aaro Koskinen58839b02011-03-13 12:26:23 +02001991 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05301992 if (tempcl & ActiveLCD) {
1993 if ((pVBInfo->SetFlag & ReserveTVOption)) {
1994 if (temp & ActiveTV)
1995 tempcl |= ActiveTV;
1996 }
1997 }
1998 temp = tempcl;
Peter Huewea3d675c2012-02-09 21:11:47 +01001999 tempbl = ~XGI_ModeSwitchStatus;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002000 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002001
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302002 if (!(pVBInfo->SetFlag & ReserveTVOption))
Aaro Koskinen8104e322011-03-13 12:26:22 +02002003 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302004 } else {
2005 return;
2006 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002007}
2008
Bill Pemberton80adad82010-06-17 13:10:51 -04002009void XGI_GetVBType(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002010{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302011 unsigned short flag, tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002012
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002013 if (pVBInfo->IF_DEF_LVDS != 0)
2014 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002015
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002016 tempbx = VB_SIS302B;
2017 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
2018 if (flag == 0x02)
2019 goto finish;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002020
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002021 tempbx = VB_SIS301;
2022 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
2023 if (flag < 0xB0)
2024 goto finish;
2025
2026 tempbx = VB_SIS301B;
2027 if (flag < 0xC0)
2028 goto bigger_than_0xB0;
2029
2030 tempbx = VB_XGI301C;
2031 if (flag < 0xD0)
2032 goto bigger_than_0xB0;
2033
2034 tempbx = VB_SIS301LV;
2035 if (flag < 0xE0)
2036 goto bigger_than_0xB0;
2037
2038 tempbx = VB_SIS302LV;
2039 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2040 if (tempah != 0xFF)
2041 tempbx = VB_XGI301C;
2042
2043bigger_than_0xB0:
2044 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2045 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2046 if (!(flag & 0x02))
2047 tempbx = tempbx | VB_NoLCD;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302048 }
Miguel Gómez7eec23a2012-07-06 12:40:47 +02002049
2050finish:
2051 pVBInfo->VBType = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002052}
2053
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002054static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302055 struct xgi_hw_device_info *HwDeviceExtension,
2056 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002057{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302058 unsigned short tempax, push, tempbx, temp, modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002059
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002060 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302061 pVBInfo->SetFlag = 0;
Peter Huewe6896b942012-02-09 21:11:46 +01002062 pVBInfo->ModeType = modeflag & ModeTypeMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302063 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002064
Miguel Gómezf9317352012-07-06 12:40:48 +02002065 if (!(pVBInfo->VBType & 0xFFFF))
2066 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002067
Miguel Gómezf9317352012-07-06 12:40:48 +02002068 /* Check Display Device */
2069 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2070 tempbx = tempbx | temp;
2071 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2072 push = temp;
2073 push = push << 8;
2074 tempax = temp << 8;
2075 tempbx = tempbx | tempax;
2076 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2077 | SetInSlaveMode | DisableCRT2Display);
2078 temp = 0xFFFF ^ temp;
2079 tempbx &= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002080
Miguel Gómezf9317352012-07-06 12:40:48 +02002081 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002082
Aaro Koskinen4d8f5ca2012-09-11 00:15:17 +03002083 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002084 if (pVBInfo->VBType &
2085 (VB_SIS302B |
2086 VB_SIS301LV |
2087 VB_SIS302LV |
2088 VB_XGI301C)) {
2089 if (temp & EnableDualEdge) {
2090 tempbx |= SetCRT2ToDualEdge;
2091 if (temp & SetToLCDA)
2092 tempbx |= XGI_SetCRT2ToLCDA;
Miguel Gómezf9317352012-07-06 12:40:48 +02002093 }
2094 }
2095 }
2096
2097 if (pVBInfo->IF_DEF_YPbPr == 1) {
2098 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2099 ((pVBInfo->VBType & VB_SIS301LV) ||
2100 (pVBInfo->VBType & VB_SIS302LV) ||
2101 (pVBInfo->VBType & VB_XGI301C)))) {
2102 if (temp & SetYPbPr) {
2103 if (pVBInfo->IF_DEF_HiVision == 1) {
2104 /* shampoo add for new
2105 * scratch */
2106 temp = xgifb_reg_get(
2107 pVBInfo->P3d4,
2108 0x35);
2109 temp &= YPbPrMode;
2110 tempbx |= SetCRT2ToHiVision;
2111
2112 if (temp != YPbPrMode1080i) {
2113 tempbx &=
2114 (~SetCRT2ToHiVision);
2115 tempbx |=
2116 SetCRT2ToYPbPr525750;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302117 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302118 }
2119 }
2120 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002121 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002122
Miguel Gómezf9317352012-07-06 12:40:48 +02002123 tempax = push; /* restore CR31 */
2124
2125 if (pVBInfo->IF_DEF_LVDS == 0) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302126 if (pVBInfo->IF_DEF_YPbPr == 1) {
Miguel Gómezf9317352012-07-06 12:40:48 +02002127 if (pVBInfo->IF_DEF_HiVision == 1)
2128 temp = 0x09FC;
2129 else
2130 temp = 0x097C;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002131 } else if (pVBInfo->IF_DEF_HiVision == 1) {
2132 temp = 0x01FC;
Miguel Gómezf9317352012-07-06 12:40:48 +02002133 } else {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002134 temp = 0x017C;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302135 }
Justin P. Mattock558f7582012-10-02 21:17:11 -07002136 } else { /* 3rd party chip */
Miguel Gómezf9317352012-07-06 12:40:48 +02002137 temp = SetCRT2ToLCD;
2138 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002139
Miguel Gómezf9317352012-07-06 12:40:48 +02002140 if (!(tempbx & temp)) {
2141 tempax |= DisableCRT2Display;
2142 tempbx = 0;
2143 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002144
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002145 if (!(pVBInfo->VBType & VB_NoLCD)) {
2146 if (tempbx & XGI_SetCRT2ToLCDA) {
2147 if (tempbx & SetSimuScanMode)
2148 tempbx &= (~(SetCRT2ToLCD |
2149 SetCRT2ToRAMDAC |
2150 SwitchCRT2));
2151 else
2152 tempbx &= (~(SetCRT2ToLCD |
2153 SetCRT2ToRAMDAC |
2154 SetCRT2ToTV |
2155 SwitchCRT2));
Miguel Gómezf9317352012-07-06 12:40:48 +02002156 }
2157 }
2158
2159 /* shampoo add */
2160 /* for driver abnormal */
2161 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2162 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2163 if (tempbx & SetCRT2ToRAMDAC) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002164 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002165 SetCRT2ToRAMDAC |
Peter Huewe6896b942012-02-09 21:11:46 +01002166 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002167 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002168 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302169 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002170 } else {
2171 tempbx &= (~(SetCRT2ToRAMDAC |
2172 SetCRT2ToLCD |
2173 SetCRT2ToTV));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302174 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002175 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002176
Miguel Gómezf9317352012-07-06 12:40:48 +02002177 if (!(pVBInfo->VBType & VB_NoLCD)) {
2178 if (tempbx & SetCRT2ToLCD) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002179 tempbx &= (0xFF00 |
Miguel Gómezf9317352012-07-06 12:40:48 +02002180 SetCRT2ToLCD |
Peter Huewe6896b942012-02-09 21:11:46 +01002181 SwitchCRT2 |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002182 SetSimuScanMode);
Peter Huewe599801f2012-02-09 21:11:45 +01002183 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302184 }
Miguel Gómezf9317352012-07-06 12:40:48 +02002185 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002186
Miguel Gómezf9317352012-07-06 12:40:48 +02002187 if (tempbx & SetCRT2ToSCART) {
2188 tempbx &= (0xFF00 |
2189 SetCRT2ToSCART |
2190 SwitchCRT2 |
2191 SetSimuScanMode);
2192 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2193 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002194
Miguel Gómezf9317352012-07-06 12:40:48 +02002195 if (pVBInfo->IF_DEF_YPbPr == 1) {
2196 if (tempbx & SetCRT2ToYPbPr525750)
2197 tempbx &= (0xFF00 |
2198 SwitchCRT2 |
2199 SetSimuScanMode);
2200 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002201
Miguel Gómezf9317352012-07-06 12:40:48 +02002202 if (pVBInfo->IF_DEF_HiVision == 1) {
2203 if (tempbx & SetCRT2ToHiVision)
2204 tempbx &= (0xFF00 |
2205 SetCRT2ToHiVision |
2206 SwitchCRT2 |
2207 SetSimuScanMode);
2208 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002209
Miguel Gómezf9317352012-07-06 12:40:48 +02002210 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2211 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2212 tempbx = DisableCRT2Display;
2213 }
2214
2215 if (!(tempbx & DisableCRT2Display)) {
2216 if ((!(tempbx & DriverMode)) ||
2217 (!(modeflag & CRT2Mode))) {
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03002218 if (!(tempbx & XGI_SetCRT2ToLCDA))
2219 tempbx |= (SetInSlaveMode |
2220 SetSimuScanMode);
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 /* LCD+TV can't support in slave mode
2224 * (Force LCDA+TV->LCDB) */
2225 if ((tempbx & SetInSlaveMode) &&
2226 (tempbx & XGI_SetCRT2ToLCDA)) {
2227 tempbx ^= (SetCRT2ToLCD |
2228 XGI_SetCRT2ToLCDA |
2229 SetCRT2ToDualEdge);
2230 pVBInfo->SetFlag |= ReserveTVOption;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302231 }
2232 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002233
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302234 pVBInfo->VBInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002235}
2236
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002237static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302238 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002239{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302240 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002241
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302242 tempbx = 0;
2243 resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002244
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302245 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002246 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2247 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002248
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302249 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002250 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302251 tempbx = temp;
Peter Huewe599801f2012-02-09 21:11:45 +01002252 if (tempbx & TVSetPAL) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002253 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002254 TVSetPALM |
2255 TVSetPALN |
2256 TVSetPAL);
2257 if (tempbx & TVSetPALM)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002258 /* set to NTSC if PAL-M */
Peter Huewe599801f2012-02-09 21:11:45 +01002259 tempbx &= ~TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302260 } else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002261 tempbx &= (SetCHTVOverScan |
Peter Huewe599801f2012-02-09 21:11:45 +01002262 TVSetNTSCJ |
2263 TVSetPAL);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302264 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002265
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302266 if (pVBInfo->IF_DEF_LVDS == 0) {
2267 if (pVBInfo->VBInfo & SetCRT2ToSCART)
Peter Huewe599801f2012-02-09 21:11:45 +01002268 tempbx |= TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302269 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002270
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302271 if (pVBInfo->IF_DEF_YPbPr == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002272 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002273 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302274 index1 &= YPbPrMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002275
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302276 if (index1 == YPbPrMode525i)
Peter Huewe599801f2012-02-09 21:11:45 +01002277 tempbx |= TVSetYPbPr525i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302279 if (index1 == YPbPrMode525p)
Peter Huewe599801f2012-02-09 21:11:45 +01002280 tempbx = tempbx | TVSetYPbPr525p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302281 if (index1 == YPbPrMode750p)
Peter Huewe599801f2012-02-09 21:11:45 +01002282 tempbx = tempbx | TVSetYPbPr750p;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302283 }
2284 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002285
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302286 if (pVBInfo->IF_DEF_HiVision == 1) {
Peter Huewe599801f2012-02-09 21:11:45 +01002287 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2288 tempbx = tempbx | TVSetHiVision | TVSetPAL;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302291 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002292 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2293 (!(pVBInfo->VBInfo & SetNotSimuMode)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302294 tempbx |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002295
Peter Huewe599801f2012-02-09 21:11:45 +01002296 if (!(tempbx & TVSetPAL) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002297 (modeflag > 13) &&
2298 (resinfo == 8)) /* NTSC 1024x768, */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302299 tempbx |= NTSC1024x768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002300
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302301 tempbx |= RPLLDIV2XO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002302
Peter Huewe599801f2012-02-09 21:11:45 +01002303 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302304 if (pVBInfo->VBInfo & SetInSlaveMode)
2305 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002306 } else if (tempbx &
2307 (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302308 tempbx &= (~RPLLDIV2XO);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002309 } else if (!(pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01002310 (VB_SIS301B |
2311 VB_SIS302B |
2312 VB_SIS301LV |
2313 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002314 VB_XGI301C))) {
Aaro Koskinend3ae5762012-09-11 00:15:27 +03002315 if (tempbx & TVSimuMode)
2316 tempbx &= (~RPLLDIV2XO);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302317 }
2318 }
2319 }
2320 pVBInfo->TVInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002321}
2322
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02002323static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2324 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002325{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302326 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002327
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302328 pVBInfo->LCDResInfo = 0;
2329 pVBInfo->LCDTypeInfo = 0;
2330 pVBInfo->LCDInfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002331
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002332 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2333 /* si+Ext_ResInfo // */
2334 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen58839b02011-03-13 12:26:23 +02002335 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302336 tempbx = temp & 0x0F;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002337
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302338 if (tempbx == 0)
Peter Huewe255aabd2012-02-09 21:11:44 +01002339 tempbx = Panel_1024x768; /* default */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002340
Miguel Gómez949eb0a2012-07-06 12:40:36 +02002341 /* LCD75 */
Peter Huewe255aabd2012-02-09 21:11:44 +01002342 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302343 if (pVBInfo->VBInfo & DriverMode) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02002344 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Peter Huewea3d675c2012-02-09 21:11:47 +01002345 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302346 tempax &= 0x0F;
2347 else
2348 tempax = tempax >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002349
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302350 if ((resinfo == 6) || (resinfo == 9)) {
2351 if (tempax >= 3)
2352 tempbx |= PanelRef75Hz;
2353 } else if ((resinfo == 7) || (resinfo == 8)) {
2354 if (tempax >= 4)
2355 tempbx |= PanelRef75Hz;
2356 }
2357 }
2358 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002359
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302360 pVBInfo->LCDResInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302362 /* End of LCD75 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002363
Peter Huewea3d675c2012-02-09 21:11:47 +01002364 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302365 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002366
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302367 tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002368
Aaro Koskinen58839b02011-03-13 12:26:23 +02002369 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002370
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302371 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002372
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302373 tempbx |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002374
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302375 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002376
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302377 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002378
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302379 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
Peter Huewe6896b942012-02-09 21:11:46 +01002380 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
Peter Huewea3d675c2012-02-09 21:11:47 +01002381 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302382 tempbx |= SetLCDDualLink;
2383 }
2384 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302386 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe255aabd2012-02-09 21:11:44 +01002387 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002388 & SetCRT2ToLCD) && (resinfo == 9) &&
2389 (!(tempbx & EnableScalingLCD)))
Miguel Gómez3bcc2462012-07-06 12:40:53 +02002390 /*
2391 * set to center in 1280x1024 LCDB
2392 * for Panel_1400x1050
2393 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002394 tempbx |= SetLCDtoNonExpanding;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302395 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302397 if (pVBInfo->VBInfo & SetInSlaveMode) {
2398 if (pVBInfo->VBInfo & SetNotSimuMode)
Peter Huewea3d675c2012-02-09 21:11:47 +01002399 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302400 } else {
Peter Huewea3d675c2012-02-09 21:11:47 +01002401 tempbx |= XGI_LCDVESATiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302404 pVBInfo->LCDInfo = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302406 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002407}
2408
Bill Pemberton108afbf2010-06-17 13:10:47 -04002409unsigned char XGI_SearchModeID(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302410 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002411{
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002412 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2413 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2414 break;
2415 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2416 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302417 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002418
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302419 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002420}
2421
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002422static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2423{
2424 unsigned char ujRet = 0;
2425 unsigned char i = 0;
2426
2427 for (i = 0; i < 8; i++) {
2428 ujRet = ujRet << 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002429 ujRet |= (ujDate >> i) & 1;
2430 }
2431
2432 return ujRet;
2433}
2434
2435/*----------------------------------------------------------------------------*/
2436/* output */
2437/* bl[5] : LVDS signal */
2438/* bl[1] : LVDS backlight */
2439/* bl[0] : LVDS VDD */
2440/*----------------------------------------------------------------------------*/
2441static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2442{
2443 unsigned char CR4A, temp;
2444
Aaro Koskinen58839b02011-03-13 12:26:23 +02002445 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002446 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002447
Aaro Koskinen58839b02011-03-13 12:26:23 +02002448 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002449
2450 temp = XG21GPIODataTransfer(temp);
2451 temp &= 0x23;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002452 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002453 return temp;
2454}
2455
2456/*----------------------------------------------------------------------------*/
2457/* output */
2458/* bl[5] : LVDS signal */
2459/* bl[1] : LVDS backlight */
2460/* bl[0] : LVDS VDD */
2461/*----------------------------------------------------------------------------*/
2462static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2463{
2464 unsigned char CR4A, CRB4, temp;
2465
Aaro Koskinen58839b02011-03-13 12:26:23 +02002466 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Aaro Koskinendc505562011-03-13 12:26:26 +02002467 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002468
Aaro Koskinen58839b02011-03-13 12:26:23 +02002469 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002470
2471 temp &= 0x0C;
2472 temp >>= 2;
Aaro Koskinen8104e322011-03-13 12:26:22 +02002473 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02002474 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002475 temp |= ((CRB4 & 0x04) << 3);
2476 return temp;
2477}
2478
Aaro Koskinen0ebf5382011-11-27 23:03:09 +02002479/*----------------------------------------------------------------------------*/
2480/* input */
2481/* bl[5] : 1;LVDS signal on */
2482/* bl[1] : 1;LVDS backlight on */
2483/* bl[0] : 1:LVDS VDD on */
2484/* bh: 100000b : clear bit 5, to set bit5 */
2485/* 000010b : clear bit 1, to set bit1 */
2486/* 000001b : clear bit 0, to set bit0 */
2487/*----------------------------------------------------------------------------*/
2488static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2489 struct vb_device_info *pVBInfo)
2490{
2491 unsigned char CR4A, temp;
2492
2493 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2494 tempbh &= 0x23;
2495 tempbl &= 0x23;
2496 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2497
2498 if (tempbh & 0x20) {
2499 temp = (tempbl >> 4) & 0x02;
2500
2501 /* CR B4[1] */
2502 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2503
2504 }
2505
2506 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2507
2508 temp = XG21GPIODataTransfer(temp);
2509 temp &= ~tempbh;
2510 temp |= tempbl;
2511 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2512}
2513
Aaro Koskinen776115a2011-11-27 23:03:10 +02002514static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2515 struct vb_device_info *pVBInfo)
2516{
2517 unsigned char CR4A, temp;
2518 unsigned short tempbh0, tempbl0;
2519
2520 tempbh0 = tempbh;
2521 tempbl0 = tempbl;
2522 tempbh0 &= 0x20;
2523 tempbl0 &= 0x20;
2524 tempbh0 >>= 3;
2525 tempbl0 >>= 3;
2526
2527 if (tempbh & 0x20) {
2528 temp = (tempbl >> 4) & 0x02;
2529
2530 /* CR B4[1] */
2531 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2532
2533 }
2534 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2535
2536 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2537 tempbh &= 0x03;
2538 tempbl &= 0x03;
2539 tempbh <<= 2;
2540 tempbl <<= 2; /* GPIOC,GPIOD */
2541 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2542 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2543}
2544
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002545static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2546 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302547 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002548{
2549
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002550 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302551 if (pXGIHWDE->jChipType == XG21) {
2552 if (pVBInfo->IF_DEF_LVDS == 1) {
2553 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002554 /* LVDS VDD on */
2555 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002556 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302557 }
2558 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002559 /* LVDS signal on */
2560 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002561 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002562 /* LVDS backlight on */
2563 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302564 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002565 /* DVO/DVI signal on */
2566 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302567 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002568
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302569 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002570
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302571 if (pXGIHWDE->jChipType == XG27) {
2572 if (pVBInfo->IF_DEF_LVDS == 1) {
2573 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002574 /* LVDS VDD on */
2575 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002576 mdelay(xgifb_info->lvds_data.PSC_S2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302577 }
2578 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002579 /* LVDS signal on */
2580 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002581 mdelay(xgifb_info->lvds_data.PSC_S3);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002582 /* LVDS backlight on */
2583 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302584 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002585 /* DVO/DVI signal on */
2586 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302587 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002588
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302589 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002590}
2591
Aaro Koskinenfab04b92011-12-06 00:10:45 +02002592void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2593 struct xgi_hw_device_info *pXGIHWDE,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302594 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002595{
2596
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302597 if (pXGIHWDE->jChipType == XG21) {
2598 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002599 /* LVDS backlight off */
2600 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002601 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302602 } else {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002603 /* DVO/DVI signal off */
2604 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302605 }
2606 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002607
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302608 if (pXGIHWDE->jChipType == XG27) {
2609 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002610 /* LVDS backlight off */
2611 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
Aaro Koskinen886230c2012-09-11 00:15:13 +03002612 mdelay(xgifb_info->lvds_data.PSC_S3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302613 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002614
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302615 if (pVBInfo->IF_DEF_LVDS == 0)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002616 /* DVO/DVI signal off */
2617 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302618 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002619
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002620 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002621}
2622
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002623static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002624{
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002625 while ((inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302626 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002627
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02002628 while (!(inb(pVBInfo->P3da) & 0x01))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302629 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002630}
2631
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002632static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002633{
Aaro Koskinen09cb8e52011-08-31 21:46:12 +03002634 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002635}
2636
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002637static void XGI_SaveCRT2Info(unsigned short ModeNo,
2638 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002639{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302640 unsigned short temp1, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002641
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002642 /* reserve CR34 for CRT1 Mode No */
2643 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302644 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
2645 temp2 = ~(SetInSlaveMode >> 8);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02002646 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002647}
2648
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002649static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
2650 unsigned short ModeIdIndex,
2651 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002652{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302653 unsigned short xres, yres, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002654
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03002655 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002656 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
2657 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
2658 /* si+St_ModeFlag */
2659 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002660
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002661 if (modeflag & HalfDCLK)
2662 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002663
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002664 if (modeflag & DoubleScanMode)
2665 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002666
Miguel Gómez3339db82012-07-06 12:40:49 +02002667 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
2668 goto exit;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002669
Miguel Gómez3339db82012-07-06 12:40:49 +02002670 if (pVBInfo->IF_DEF_LVDS == 0) {
2671 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
2672 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2673 if (yres == 1024)
2674 yres = 1056;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302675 }
2676 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002677
Miguel Gómez3339db82012-07-06 12:40:49 +02002678 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
2679 if (yres == 400)
2680 yres = 405;
2681 else if (yres == 350)
2682 yres = 360;
2683
2684 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
2685 if (yres == 360)
2686 yres = 375;
2687 }
2688 }
2689
2690 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2691 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2692 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
2693 if (yres == 350)
2694 yres = 357;
2695 else if (yres == 400)
2696 yres = 420;
2697 else if (yres == 480)
2698 yres = 525;
2699 }
2700 }
2701 }
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302702 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002703
Miguel Gómez3339db82012-07-06 12:40:49 +02002704 if (xres == 720)
2705 xres = 640;
2706
2707exit:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302708 pVBInfo->VGAHDE = xres;
2709 pVBInfo->HDE = xres;
2710 pVBInfo->VGAVDE = yres;
2711 pVBInfo->VDE = yres;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002712}
2713
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002714static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002715{
2716
Peter Huewea3d675c2012-02-09 21:11:47 +01002717 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
Dan Carpentera65fd092011-01-04 09:02:27 +03002718 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302719 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002720
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302721 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002722}
2723
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002724static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
2725 unsigned short ModeIdIndex,
2726 unsigned short RefreshRateTableIndex,
2727 struct vb_device_info *pVBInfo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002728{
2729 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002730 CRT1Index;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002731
2732 pVBInfo->RVBHCMAX = 1;
2733 pVBInfo->RVBHCFACT = 1;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002734 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2735 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
2736 CRT1Index &= IndexMask;
2737 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
2738 temp2 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
2739 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
2740 tempbx = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
2741 tempcx = (unsigned short)
2742 pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
2743 tempcx &= 0x0100;
2744 tempcx = tempcx << 2;
2745 tempbx |= tempcx;
2746 temp1 = (unsigned short) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002747
2748 if (temp1 & 0x01)
2749 tempbx |= 0x0100;
2750
2751 if (temp1 & 0x20)
2752 tempbx |= 0x0200;
2753 tempax += 5;
2754
2755 if (modeflag & Charx8Dot)
2756 tempax *= 8;
2757 else
2758 tempax *= 9;
2759
2760 pVBInfo->VGAHT = tempax;
2761 pVBInfo->HT = tempax;
2762 tempbx++;
2763 pVBInfo->VGAVT = tempbx;
2764 pVBInfo->VT = tempbx;
2765}
2766
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002767static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302768 unsigned short RefreshRateTableIndex,
2769 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002770{
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02002771 unsigned short tempax = 0, tempbx = 0, modeflag, resinfo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002772
Peter Huewefc39dcb2012-01-15 19:22:12 +01002773 struct SiS_LCDData *LCDPtr = NULL;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002774
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002775 /* si+Ext_ResInfo */
2776 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2777 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302778 pVBInfo->NewFlickerMode = 0;
2779 pVBInfo->RVBHRS = 50;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002780
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302781 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
2782 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2783 pVBInfo);
2784 return;
2785 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002786
Peter Huewea3d675c2012-02-09 21:11:47 +01002787 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02002788 LCDPtr = XGI_GetLcdPtr(XGI_LCDDataTable, ModeNo, ModeIdIndex,
Aaro Koskinena7e46d8b2012-09-11 00:15:32 +03002789 RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302791 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
2792 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
2793 pVBInfo->VGAHT = LCDPtr->VGAHT;
2794 pVBInfo->VGAVT = LCDPtr->VGAVT;
2795 pVBInfo->HT = LCDPtr->LCDHT;
2796 pVBInfo->VT = LCDPtr->LCDVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002797
Peter Huewe255aabd2012-02-09 21:11:44 +01002798 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302799 tempax = 1024;
2800 tempbx = 768;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002801
Peter Huewea3d675c2012-02-09 21:11:47 +01002802 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302803 if (pVBInfo->VGAVDE == 357)
2804 tempbx = 527;
2805 else if (pVBInfo->VGAVDE == 420)
2806 tempbx = 620;
2807 else if (pVBInfo->VGAVDE == 525)
2808 tempbx = 775;
2809 else if (pVBInfo->VGAVDE == 600)
2810 tempbx = 775;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302811 else
2812 tempbx = 768;
2813 } else
2814 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002815 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302816 tempax = 1024;
2817 tempbx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01002818 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302819 tempax = 1280;
2820 if (pVBInfo->VGAVDE == 360)
2821 tempbx = 768;
2822 else if (pVBInfo->VGAVDE == 375)
2823 tempbx = 800;
2824 else if (pVBInfo->VGAVDE == 405)
2825 tempbx = 864;
2826 else
2827 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002828 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302829 tempax = 1280;
2830 tempbx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01002831 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302832 tempax = 1280;
2833 if (pVBInfo->VGAVDE == 350)
2834 tempbx = 700;
2835 else if (pVBInfo->VGAVDE == 400)
2836 tempbx = 800;
2837 else if (pVBInfo->VGAVDE == 1024)
2838 tempbx = 960;
2839 else
2840 tempbx = 960;
Peter Huewe255aabd2012-02-09 21:11:44 +01002841 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302842 tempax = 1400;
2843 tempbx = 1050;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002844
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302845 if (pVBInfo->VGAVDE == 1024) {
2846 tempax = 1280;
2847 tempbx = 1024;
2848 }
Peter Huewe255aabd2012-02-09 21:11:44 +01002849 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302850 tempax = 1600;
2851 tempbx = 1200; /* alan 10/14/2003 */
Peter Huewea3d675c2012-02-09 21:11:47 +01002852 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302853 if (pVBInfo->VGAVDE == 350)
2854 tempbx = 875;
2855 else if (pVBInfo->VGAVDE == 400)
2856 tempbx = 1000;
2857 }
2858 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002859
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302860 if (pVBInfo->LCDInfo & LCDNonExpanding) {
2861 tempax = pVBInfo->VGAHDE;
2862 tempbx = pVBInfo->VGAVDE;
2863 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002864
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302865 pVBInfo->HDE = tempax;
2866 pVBInfo->VDE = tempbx;
2867 return;
2868 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002869
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302870 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
Aaro Koskinen24572542012-09-11 00:15:21 +03002871 struct SiS_TVData const *TVPtr;
2872
2873 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2874 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002875
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302876 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
2877 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
2878 pVBInfo->VGAHT = TVPtr->VGAHT;
2879 pVBInfo->VGAVT = TVPtr->VGAVT;
2880 pVBInfo->HDE = TVPtr->TVHDE;
2881 pVBInfo->VDE = TVPtr->TVVDE;
2882 pVBInfo->RVBHRS = TVPtr->RVBHRS;
2883 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002884
Peter Huewe599801f2012-02-09 21:11:45 +01002885 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302886 if (resinfo == 0x08)
2887 pVBInfo->NewFlickerMode = 0x40;
2888 else if (resinfo == 0x09)
2889 pVBInfo->NewFlickerMode = 0x40;
2890 else if (resinfo == 0x12)
2891 pVBInfo->NewFlickerMode = 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002892
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302893 if (pVBInfo->VGAVDE == 350)
2894 pVBInfo->TVInfo |= TVSimuMode;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002895
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302896 tempax = ExtHiTVHT;
2897 tempbx = ExtHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002898
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302899 if (pVBInfo->VBInfo & SetInSlaveMode) {
2900 if (pVBInfo->TVInfo & TVSimuMode) {
2901 tempax = StHiTVHT;
2902 tempbx = StHiTVVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002903
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302904 if (!(modeflag & Charx8Dot)) {
2905 tempax = StHiTextTVHT;
2906 tempbx = StHiTextTVVT;
2907 }
2908 }
2909 }
Peter Huewe599801f2012-02-09 21:11:45 +01002910 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2911 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302912 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
2913 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
2914 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002915
Peter Huewe599801f2012-02-09 21:11:45 +01002916 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302917 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
2918 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
Peter Huewe599801f2012-02-09 21:11:45 +01002919 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302920 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
2921 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
2922 if (pVBInfo->TVInfo & NTSC1024x768)
2923 tempax = NTSC1024x768HT;
2924 }
2925 } else {
2926 tempax = PALHT;
2927 tempbx = PALVT;
Peter Huewe599801f2012-02-09 21:11:45 +01002928 if (!(pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302929 tempax = NTSCHT;
2930 tempbx = NTSCVT;
2931 if (pVBInfo->TVInfo & NTSC1024x768)
2932 tempax = NTSC1024x768HT;
2933 }
2934 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002935
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302936 pVBInfo->HT = tempax;
2937 pVBInfo->VT = tempbx;
2938 return;
2939 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002940}
2941
Aaro Koskinen063b9c42011-03-08 22:16:13 +02002942static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302943 unsigned short RefreshRateTableIndex,
2944 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002945{
Bill Pemberton108afbf2010-06-17 13:10:47 -04002946 unsigned char di_0, di_1, tempal;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002947
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302948 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2949 pVBInfo);
2950 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2951 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002952
Peter Huewe6896b942012-02-09 21:11:46 +01002953 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302954 /* 301 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002955 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
2956 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
2957 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302958 } else { /* 301b/302b/301lv/302lv */
Aaro Koskinen8104e322011-03-13 12:26:22 +02002959 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
2960 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302961 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002962
Aaro Koskinen8104e322011-03-13 12:26:22 +02002963 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002964
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302965 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02002966 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302967 else
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02002968 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002969}
2970
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002971static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
2972 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002973{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002974 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
2975 short index;
2976 unsigned short modeflag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302977
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002978 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01002979 index = (modeflag & ModeTypeMask) - ModeEGA;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302980
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002981 if (index < 0)
2982 index = 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302983
Aaro Koskinencc1e2392011-03-13 12:26:07 +02002984 return ColorDepth[index];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302985}
2986
Kenji Toyama1d7f6562011-04-23 19:36:49 +08002987static unsigned short XGI_GetOffset(unsigned short ModeNo,
2988 unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302989 unsigned short RefreshRateTableIndex,
2990 struct xgi_hw_device_info *HwDeviceExtension,
2991 struct vb_device_info *pVBInfo)
2992{
2993 unsigned short temp, colordepth, modeinfo, index, infoflag,
2994 ColorDepth[] = { 0x01, 0x02, 0x04 };
2995
2996 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03002997 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05302998
2999 index = (modeinfo >> 8) & 0xFF;
3000
3001 temp = pVBInfo->ScreenOffset[index];
3002
3003 if (infoflag & InterlaceMode)
3004 temp = temp << 1;
3005
3006 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
3007
3008 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
3009 temp = ModeNo - 0x7C;
3010 colordepth = ColorDepth[temp];
3011 temp = 0x6B;
3012 if (infoflag & InterlaceMode)
3013 temp = temp << 1;
3014 return temp * colordepth;
3015 } else {
3016 return temp * colordepth;
3017 }
3018}
3019
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003020static void XGI_SetCRT2Offset(unsigned short ModeNo,
3021 unsigned short ModeIdIndex,
3022 unsigned short RefreshRateTableIndex,
3023 struct xgi_hw_device_info *HwDeviceExtension,
3024 struct vb_device_info *pVBInfo)
3025{
3026 unsigned short offset;
3027 unsigned char temp;
3028
3029 if (pVBInfo->VBInfo & SetInSlaveMode)
3030 return;
3031
3032 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3033 HwDeviceExtension, pVBInfo);
3034 temp = (unsigned char) (offset & 0xFF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003035 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003036 temp = (unsigned char) ((offset & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003037 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003038 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003039 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003040}
3041
Randy Dunlap89229672010-08-10 08:46:44 -07003042static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003043{
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003044 /* threshold high ,disable auto threshold */
3045 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3046 /* threshold low default 04h */
3047 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003048}
3049
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003050static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303051 struct xgi_hw_device_info *HwDeviceExtension,
3052 unsigned short RefreshRateTableIndex,
3053 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003054{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303055 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003056
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003057 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3058 CRT1Index &= IndexMask;
3059 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003060
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303061 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3062 HwDeviceExtension, pVBInfo);
3063 XGI_SetCRT2FIFO(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003064
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303065 for (tempcx = 4; tempcx < 7; tempcx++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003066 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003067
Aaro Koskinen8104e322011-03-13 12:26:22 +02003068 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3069 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003070}
3071
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003072static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303073 struct xgi_hw_device_info *HwDeviceExtension,
3074 unsigned short RefreshRateTableIndex,
3075 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003076{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303077 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3078 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003079
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003080 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3081 CRT1Index &= IndexMask;
3082 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3083 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003084
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303085 /* bainy change table name */
3086 if (modeflag & HalfDCLK) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003087 /* BTVGA2HT 0x08,0x09 */
3088 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003089 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303090 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003091 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003092 /* BTVGA2HDEE 0x0A,0x0C */
3093 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003094 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303095 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3096 pushbx = pVBInfo->VGAHDE / 2 + 16;
3097 tempcx = tempcx >> 1;
3098 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3099 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003100
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303101 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3102 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003103 tempbx |= ((pVBInfo->
3104 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
3105 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303106 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3107 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
3108 tempcx &= 0x1F;
3109 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
3110 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3111 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3112 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003113
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303114 tempbx += 4;
3115 tempcx += 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003116
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303117 if (tempcx > (pVBInfo->VGAHT / 2))
3118 tempcx = pVBInfo->VGAHT / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003119
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303120 temp = tempbx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003121
Aaro Koskinen8104e322011-03-13 12:26:22 +02003122 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303123 } else {
3124 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003125 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303126 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003127 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003128 /* BTVGA2HDEE 0x0A,0x0C */
3129 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003130 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303131 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3132 pushbx = pVBInfo->VGAHDE + 16;
3133 tempcx = tempcx >> 1;
3134 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3135 tempcx += tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003136
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303137 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3138 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003139 tempbx |= ((pVBInfo->
3140 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
3141 0xC0) << 2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303142 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3143 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
3144 tempcx &= 0x1F;
3145 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
3146 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3147 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3148 tempbx += 16;
3149 tempcx += 16;
3150 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003151
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303152 if (tempcx > pVBInfo->VGAHT)
3153 tempcx = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003154
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303155 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003156 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003158
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303159 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3160 tempbx = pushbx;
3161 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3162 tempax |= (tempbx & 0xFF00);
3163 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003164 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303165 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003166 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303167 tempcx = (pVBInfo->VGAVT - 1);
3168 temp = tempcx & 0x00FF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003169
Aaro Koskinen8104e322011-03-13 12:26:22 +02003170 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303171 tempbx = pVBInfo->VGAVDE - 1;
3172 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003173 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303174 temp = ((tempbx & 0xFF00) << 3) >> 8;
3175 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003176 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003177
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303178 tempax = pVBInfo->VGAVDE;
3179 tempbx = pVBInfo->VGAVDE;
3180 tempcx = pVBInfo->VGAVT;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003181 /* BTVGA2VRS 0x10,0x11 */
3182 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3183 /* BTVGA2VRE 0x11 */
3184 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003185
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303186 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3187 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
3188 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303190 if (temp & 0x04)
3191 tempbx |= 0x0100;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003192
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303193 if (temp & 0x080)
3194 tempbx |= 0x0200;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003195
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303196 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003197
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303198 if (temp & 0x08)
3199 tempbx |= 0x0400;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003200
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303201 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
3202 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3203 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003204
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303205 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003206 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303207 temp = ((tempbx & 0xFF00) >> 8) << 4;
3208 temp = ((tempcx & 0x000F) | (temp));
Aaro Koskinen8104e322011-03-13 12:26:22 +02003209 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303210 tempax = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003211
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303212 if (modeflag & DoubleScanMode)
3213 tempax |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003214
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303215 if (modeflag & HalfDCLK)
3216 tempax |= 0x40;
3217
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003218 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003219}
3220
Aaro Koskinencc1e2392011-03-13 12:26:07 +02003221static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3222{
3223 unsigned long tempax, tempbx;
3224
3225 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3226 & 0xFFFF;
3227 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3228 tempax = (tempax * pVBInfo->HT) / tempbx;
3229
3230 return (unsigned short) tempax;
3231}
3232
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003233static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303234 struct xgi_hw_device_info *HwDeviceExtension,
3235 unsigned short RefreshRateTableIndex,
3236 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003237{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303238 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3239 modeflag, CRT1Index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003240
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003241 /* si+Ext_ResInfo */
3242 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3243 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3244 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3245 CRT1Index &= IndexMask;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003246
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303247 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3248 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003249
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303250 temp = 0xFF; /* set MAX HT */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003251 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303252 tempcx = 0x08;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003253
Peter Huewe6896b942012-02-09 21:11:46 +01003254 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303255 modeflag |= Charx8Dot;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003256
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303257 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003258
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303259 if (modeflag & HalfDCLK)
3260 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303262 tempax = (tempax / tempcx) - 1;
3263 tempbx |= ((tempax & 0x00FF) << 8);
3264 temp = tempax & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003265 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003266
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303267 temp = (tempbx & 0xFF00) >> 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003268
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303269 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe6896b942012-02-09 21:11:46 +01003270 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3271 | VB_SIS302LV | VB_XGI301C)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303272 temp += 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003273
Aaro Koskinen31fb40f2012-09-11 00:15:15 +03003274 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3275 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303276 temp -= 2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303277 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003278
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003279 /* 0x05 Horizontal Display Start */
3280 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3281 /* 0x06 Horizontal Blank end */
3282 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003283
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303284 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3285 if (pVBInfo->VBInfo & SetCRT2ToTV)
3286 tempax = pVBInfo->VGAHT;
3287 else
3288 tempax = XGI_GetVGAHT2(pVBInfo);
3289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003290
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303291 if (tempax >= pVBInfo->VGAHT)
3292 tempax = pVBInfo->VGAHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003293
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303294 if (modeflag & HalfDCLK)
3295 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303297 tempax = (tempax / tempcx) - 5;
3298 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
Peter Huewe599801f2012-02-09 21:11:45 +01003299 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303300 temp = (tempbx & 0x00FF) - 1;
3301 if (!(modeflag & HalfDCLK)) {
3302 temp -= 6;
3303 if (pVBInfo->TVInfo & TVSimuMode) {
3304 temp -= 4;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003305 temp -= 10;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303306 }
3307 }
3308 } else {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303309 tempbx = (tempbx & 0xFF00) >> 8;
3310 tempcx = (tempcx + tempbx) >> 1;
3311 temp = (tempcx & 0x00FF) + 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003312
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303313 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3314 temp -= 1;
3315 if (!(modeflag & HalfDCLK)) {
3316 if ((modeflag & Charx8Dot)) {
3317 temp += 4;
3318 if (pVBInfo->VGAHDE >= 800)
3319 temp -= 6;
3320 }
3321 }
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003322 } else if (!(modeflag & HalfDCLK)) {
3323 temp -= 4;
Peter Huewe255aabd2012-02-09 21:11:44 +01003324 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003325 pVBInfo->VGAHDE >= 800) {
3326 temp -= 7;
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003327 if (pVBInfo->VGAHDE >= 1280 &&
Peter Huewe255aabd2012-02-09 21:11:44 +01003328 pVBInfo->LCDResInfo != Panel_1280x960 &&
Aaro Koskinen6596fc02011-11-27 23:03:19 +02003329 (pVBInfo->LCDInfo & LCDNonExpanding))
3330 temp += 28;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303331 }
3332 }
3333 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003334
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003335 /* 0x07 Horizontal Retrace Start */
3336 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3337 /* 0x08 Horizontal Retrace End */
3338 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303340 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3341 if (pVBInfo->TVInfo & TVSimuMode) {
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003342 if (ModeNo == 0x50) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303343 if (pVBInfo->TVInfo & SetNTSCTV) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003344 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303345 0x07, 0x30);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003346 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303347 0x08, 0x03);
3348 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003349 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303350 0x07, 0x2f);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003351 xgifb_reg_set(pVBInfo->Part1Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303352 0x08, 0x02);
3353 }
3354 }
3355 }
3356 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003357
Aaro Koskinen8104e322011-03-13 12:26:22 +02003358 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003359 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02003360 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003361
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303362 tempbx = pVBInfo->VGAVT;
3363 push1 = tempbx;
3364 tempcx = 0x121;
3365 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003366
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303367 if (tempbx == 357)
3368 tempbx = 350;
3369 if (tempbx == 360)
3370 tempbx = 350;
3371 if (tempbx == 375)
3372 tempbx = 350;
3373 if (tempbx == 405)
3374 tempbx = 400;
3375 if (tempbx == 525)
3376 tempbx = 480;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003377
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303378 push2 = tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003379
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303380 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe255aabd2012-02-09 21:11:44 +01003381 if (pVBInfo->LCDResInfo == Panel_1024x768) {
Peter Huewea3d675c2012-02-09 21:11:47 +01003382 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303383 if (tempbx == 350)
3384 tempbx += 5;
3385 if (tempbx == 480)
3386 tempbx += 5;
3387 }
3388 }
3389 }
3390 tempbx--;
3391 temp = tempbx & 0x00FF;
3392 tempbx--;
3393 temp = tempbx & 0x00FF;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003394 /* 0x10 vertical Blank Start */
3395 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303396 tempbx = push2;
3397 tempbx--;
3398 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003399 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003400
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303401 if (tempbx & 0x0100)
3402 tempcx |= 0x0002;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003403
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303404 tempax = 0x000B;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003405
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303406 if (modeflag & DoubleScanMode)
3407 tempax |= 0x08000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003408
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303409 if (tempbx & 0x0200)
3410 tempcx |= 0x0040;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003411
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303412 temp = (tempax & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003413 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003414
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303415 if (tempbx & 0x0400)
3416 tempcx |= 0x0600;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003417
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003418 /* 0x11 Vertival Blank End */
3419 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303420
3421 tempax = push1;
3422 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3423 tempax = tempax >> 2;
3424 push1 = tempax; /* push ax */
3425
3426 if (resinfo != 0x09) {
3427 tempax = tempax << 1;
3428 tempbx += tempax;
3429 }
3430
Peter Huewe599801f2012-02-09 21:11:45 +01003431 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Miguel Gómez470c5332012-07-06 12:40:50 +02003432 if ((pVBInfo->VBType & VB_SIS301LV) &&
3433 !(pVBInfo->TVInfo & TVSetHiVision)) {
3434 if ((pVBInfo->TVInfo & TVSimuMode) &&
3435 (pVBInfo->TVInfo & TVSetPAL)) {
3436 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3437 !(pVBInfo->TVInfo &
3438 (TVSetYPbPr525p |
3439 TVSetYPbPr750p |
3440 TVSetHiVision)))
3441 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303442 }
3443 } else {
3444 tempbx -= 10;
3445 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003446 } else if (pVBInfo->TVInfo & TVSimuMode) {
3447 if (pVBInfo->TVInfo & TVSetPAL) {
3448 if (pVBInfo->VBType & VB_SIS301LV) {
3449 if (!(pVBInfo->TVInfo &
3450 (TVSetYPbPr525p |
3451 TVSetYPbPr750p |
3452 TVSetHiVision)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303453 tempbx += 40;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003454 } else {
3455 tempbx += 40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303456 }
3457 }
3458 }
3459 tempax = push1;
3460 tempax = tempax >> 2;
3461 tempax++;
3462 tempax += tempbx;
3463 push1 = tempax; /* push ax */
3464
Peter Huewe599801f2012-02-09 21:11:45 +01003465 if ((pVBInfo->TVInfo & TVSetPAL)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303466 if (tempbx <= 513) {
3467 if (tempax >= 513)
3468 tempbx = 513;
3469 }
3470 }
3471
3472 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003473 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303474 tempbx--;
3475 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003476 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303477
3478 if (tempbx & 0x0100)
3479 tempcx |= 0x0008;
3480
3481 if (tempbx & 0x0200)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003482 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303483
3484 tempbx++;
3485
3486 if (tempbx & 0x0100)
3487 tempcx |= 0x0004;
3488
3489 if (tempbx & 0x0200)
3490 tempcx |= 0x0080;
3491
3492 if (tempbx & 0x0400)
3493 tempcx |= 0x0C00;
3494
3495 tempbx = push1; /* pop ax */
3496 temp = tempbx & 0x00FF;
3497 temp &= 0x0F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003498 /* 0x0D vertical Retrace End */
3499 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303500
3501 if (tempbx & 0x0010)
3502 tempcx |= 0x2000;
3503
3504 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003505 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303506 temp = (tempcx & 0x0FF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003507 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303508 tempax = modeflag;
3509 temp = (tempax & 0xFF00) >> 8;
3510
3511 temp = (temp >> 1) & 0x09;
3512
Peter Huewe6896b942012-02-09 21:11:46 +01003513 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303514 temp |= 0x01;
3515
Aaro Koskinen8104e322011-03-13 12:26:22 +02003516 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3517 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3518 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303519
3520 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3521 temp = 0x80;
3522 else
3523 temp = 0x00;
3524
Aaro Koskinen8104e322011-03-13 12:26:22 +02003525 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303526
3527 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02003528}
3529
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003530static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303531 unsigned short RefreshRateTableIndex,
3532 struct xgi_hw_device_info *HwDeviceExtension,
3533 struct vb_device_info *pVBInfo)
3534{
3535 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
3536 modeflag, resinfo, crt2crtc;
Aaro Koskinend21222d2012-09-11 00:15:29 +03003537 unsigned char const *TimingPoint;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303538
3539 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3540
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003541 /* si+Ext_ResInfo */
3542 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3543 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3544 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303545
3546 tempax = 0;
3547
3548 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3549 tempax |= 0x0800;
3550
3551 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3552 tempax |= 0x0400;
3553
3554 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3555 tempax |= 0x0200;
3556
Peter Huewe599801f2012-02-09 21:11:45 +01003557 if (!(pVBInfo->TVInfo & TVSetPAL))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303558 tempax |= 0x1000;
3559
Peter Huewe599801f2012-02-09 21:11:45 +01003560 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303561 tempax |= 0x0100;
3562
Peter Huewe599801f2012-02-09 21:11:45 +01003563 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303564 tempax &= 0xfe00;
3565
3566 tempax = (tempax & 0xff00) >> 8;
3567
Aaro Koskinen8104e322011-03-13 12:26:22 +02003568 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003569 TimingPoint = XGI330_NTSCTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303570
Peter Huewe599801f2012-02-09 21:11:45 +01003571 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003572 TimingPoint = XGI330_PALTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303573
Peter Huewe599801f2012-02-09 21:11:45 +01003574 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003575 TimingPoint = XGI330_HiTVExtTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303576
3577 if (pVBInfo->VBInfo & SetInSlaveMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003578 TimingPoint = XGI330_HiTVSt2Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303579
3580 if (pVBInfo->SetFlag & TVSimuMode)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003581 TimingPoint = XGI330_HiTVSt1Timing;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303582
3583 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003584 TimingPoint = XGI330_HiTVTextTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303585 }
3586
Peter Huewe599801f2012-02-09 21:11:45 +01003587 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3588 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003589 TimingPoint = XGI330_YPbPr525iTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303590
Peter Huewe599801f2012-02-09 21:11:45 +01003591 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003592 TimingPoint = XGI330_YPbPr525pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303593
Peter Huewe599801f2012-02-09 21:11:45 +01003594 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03003595 TimingPoint = XGI330_YPbPr750pTiming;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303596 }
3597
3598 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02003599 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303600
3601 for (i = 0x39; i <= 0x45; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003602 /* di->temp2[j] */
3603 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303604
3605 if (pVBInfo->VBInfo & SetCRT2ToTV)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003606 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303607
3608 temp = pVBInfo->NewFlickerMode;
3609 temp &= 0x80;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003610 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303611
Peter Huewe599801f2012-02-09 21:11:45 +01003612 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303613 tempax = 950;
3614
Peter Huewe599801f2012-02-09 21:11:45 +01003615 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303616 tempax = 520;
3617 else
3618 tempax = 440;
3619
3620 if (pVBInfo->VDE <= tempax) {
3621 tempax -= pVBInfo->VDE;
3622 tempax = tempax >> 2;
3623 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
3624 push1 = tempax;
3625 temp = (tempax & 0xFF00) >> 8;
3626 temp += (unsigned short) TimingPoint[0];
3627
Peter Huewe6896b942012-02-09 21:11:46 +01003628 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3629 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303630 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3631 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003632 | SetCRT2ToYPbPr525750)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303633 tempcx = pVBInfo->VGAHDE;
3634 if (tempcx >= 1024) {
3635 temp = 0x17; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003636 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303637 temp = 0x19; /* PAL */
3638 }
3639 }
3640 }
3641
Aaro Koskinen8104e322011-03-13 12:26:22 +02003642 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303643 tempax = push1;
3644 temp = (tempax & 0xFF00) >> 8;
3645 temp += TimingPoint[1];
3646
Peter Huewe6896b942012-02-09 21:11:46 +01003647 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3648 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303649 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3650 | SetCRT2ToSVIDEO | SetCRT2ToSCART
Peter Huewe599801f2012-02-09 21:11:45 +01003651 | SetCRT2ToYPbPr525750))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303652 tempcx = pVBInfo->VGAHDE;
3653 if (tempcx >= 1024) {
3654 temp = 0x1D; /* NTSC */
Peter Huewe599801f2012-02-09 21:11:45 +01003655 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303656 temp = 0x52; /* PAL */
3657 }
3658 }
3659 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003660 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303661 }
3662
3663 /* 301b */
3664 tempcx = pVBInfo->HT;
3665
3666 if (XGI_IsLCDDualLink(pVBInfo))
3667 tempcx = tempcx >> 1;
3668
3669 tempcx -= 2;
3670 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003671 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303672
3673 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003674 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303675
3676 tempcx = pVBInfo->HT >> 1;
3677 push1 = tempcx; /* push cx */
3678 tempcx += 7;
3679
Peter Huewe599801f2012-02-09 21:11:45 +01003680 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303681 tempcx -= 4;
3682
3683 temp = tempcx & 0x00FF;
3684 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003685 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303686
3687 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3688 tempbx += tempcx;
3689 push2 = tempbx;
3690 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003691 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303692 temp = (tempbx & 0xFF00) >> 8;
3693 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003694 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303695
3696 tempbx = push2;
3697 tempbx = tempbx + 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003698 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303699 tempbx = tempbx - 4;
3700 tempcx = tempbx;
3701 }
3702
3703 temp = (tempbx & 0x00FF) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003704 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303705
3706 j += 2;
3707 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
3708 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003709 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303710 temp = ((tempcx & 0xFF00) >> 8) << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003711 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303712
3713 tempcx += 8;
Peter Huewe599801f2012-02-09 21:11:45 +01003714 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303715 tempcx -= 4;
3716
3717 temp = tempcx & 0xFF;
3718 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003719 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303720
3721 tempcx = push1; /* pop cx */
3722 j += 2;
3723 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3724 tempcx -= temp;
3725 temp = tempcx & 0x00FF;
3726 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003727 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303728
3729 tempcx -= 11;
3730
3731 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
3732 tempax = XGI_GetVGAHT2(pVBInfo);
3733 tempcx = tempax - 1;
3734 }
3735 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003736 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303737
3738 tempbx = pVBInfo->VDE;
3739
3740 if (pVBInfo->VGAVDE == 360)
3741 tempbx = 746;
3742 if (pVBInfo->VGAVDE == 375)
3743 tempbx = 746;
3744 if (pVBInfo->VGAVDE == 405)
3745 tempbx = 853;
3746
3747 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003748 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01003749 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08003750 if (!(pVBInfo->TVInfo &
Peter Huewe599801f2012-02-09 21:11:45 +01003751 (TVSetYPbPr525p | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303752 tempbx = tempbx >> 1;
3753 } else
3754 tempbx = tempbx >> 1;
3755 }
3756
3757 tempbx -= 2;
3758 temp = tempbx & 0x00FF;
3759
Peter Huewe599801f2012-02-09 21:11:45 +01003760 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Peter Huewe6896b942012-02-09 21:11:46 +01003761 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003762 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303763 if (pVBInfo->VBInfo & SetInSlaveMode) {
3764 if (ModeNo == 0x2f)
3765 temp += 1;
3766 }
3767 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03003768 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
3769 if (ModeNo == 0x2f)
3770 temp += 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303771 }
3772 }
3773
Aaro Koskinen8104e322011-03-13 12:26:22 +02003774 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303775
3776 temp = (tempcx & 0xFF00) >> 8;
3777 temp |= ((tempbx & 0xFF00) >> 8) << 6;
3778
Peter Huewe599801f2012-02-09 21:11:45 +01003779 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
Peter Huewe6896b942012-02-09 21:11:46 +01003780 if (pVBInfo->VBType & VB_SIS301LV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003781 if (pVBInfo->TVInfo & TVSetHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303782 temp |= 0x10;
3783
3784 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3785 temp |= 0x20;
3786 }
3787 } else {
3788 temp |= 0x10;
3789 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3790 temp |= 0x20;
3791 }
3792 }
3793
Aaro Koskinen8104e322011-03-13 12:26:22 +02003794 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303795
Peter Huewe6896b942012-02-09 21:11:46 +01003796 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3797 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303798 tempbx = pVBInfo->VDE;
3799 tempcx = tempbx - 2;
3800
3801 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Peter Huewe599801f2012-02-09 21:11:45 +01003802 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
3803 | TVSetYPbPr750p)))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303804 tempbx = tempbx >> 1;
3805 }
3806
Peter Huewe6896b942012-02-09 21:11:46 +01003807 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303808 temp = 0;
3809 if (tempcx & 0x0400)
3810 temp |= 0x20;
3811
3812 if (tempbx & 0x0400)
3813 temp |= 0x40;
3814
Aaro Koskinen8104e322011-03-13 12:26:22 +02003815 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303816 }
3817
3818 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003819 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303820 temp = (tempbx - 3) & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003821 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303822 }
3823
3824 tempbx = tempbx & 0x00FF;
3825
3826 if (!(modeflag & HalfDCLK)) {
3827 tempcx = pVBInfo->VGAHDE;
3828 if (tempcx >= pVBInfo->HDE) {
3829 tempbx |= 0x2000;
3830 tempax &= 0x00FF;
3831 }
3832 }
3833
3834 tempcx = 0x0101;
3835
3836 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
3837 if (pVBInfo->VGAHDE >= 1024) {
3838 tempcx = 0x1920;
3839 if (pVBInfo->VGAHDE >= 1280) {
3840 tempcx = 0x1420;
3841 tempbx = tempbx & 0xDFFF;
3842 }
3843 }
3844 }
3845
3846 if (!(tempbx & 0x2000)) {
3847 if (modeflag & HalfDCLK)
3848 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
3849
3850 push1 = tempbx;
3851 tempeax = pVBInfo->VGAHDE;
3852 tempebx = (tempcx & 0xFF00) >> 8;
3853 longtemp = tempeax * tempebx;
3854 tempecx = tempcx & 0x00FF;
3855 longtemp = longtemp / tempecx;
3856
3857 /* 301b */
3858 tempecx = 8 * 1024;
3859
Peter Huewe6896b942012-02-09 21:11:46 +01003860 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3861 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303862 tempecx = tempecx * 8;
3863 }
3864
3865 longtemp = longtemp * tempecx;
3866 tempecx = pVBInfo->HDE;
3867 temp2 = longtemp % tempecx;
3868 tempeax = longtemp / tempecx;
3869 if (temp2 != 0)
3870 tempeax += 1;
3871
3872 tempax = (unsigned short) tempeax;
3873
3874 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01003875 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3876 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303877 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
3878 }
3879 /* end 301b */
3880
3881 tempbx = push1;
3882 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
3883 | (tempbx & 0x00FF));
3884 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
3885 | (tempax & 0x00FF));
3886 temp = (tempax & 0xFF00) >> 8;
3887 } else {
3888 temp = (tempax & 0x00FF) >> 8;
3889 }
3890
Aaro Koskinen8104e322011-03-13 12:26:22 +02003891 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303892 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003893 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303894 temp = tempcx & 0x00FF;
3895
3896 if (tempbx & 0x2000)
3897 temp = 0;
3898
3899 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3900 temp |= 0x18;
3901
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003902 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
Peter Huewe599801f2012-02-09 21:11:45 +01003903 if (pVBInfo->TVInfo & TVSetPAL) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303904 tempbx = 0x0382;
3905 tempcx = 0x007e;
3906 } else {
3907 tempbx = 0x0369;
3908 tempcx = 0x0061;
3909 }
3910
3911 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003912 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303913 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003914 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303915
3916 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
3917 temp = temp << 2;
3918 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
3919
Peter Huewe599801f2012-02-09 21:11:45 +01003920 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303921 temp |= 0x10;
3922
Peter Huewe599801f2012-02-09 21:11:45 +01003923 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303924 temp |= 0x20;
3925
Peter Huewe599801f2012-02-09 21:11:45 +01003926 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303927 temp |= 0x60;
3928 }
3929
Aaro Koskinen8104e322011-03-13 12:26:22 +02003930 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
Aaro Koskinen58839b02011-03-13 12:26:23 +02003931 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
Aaro Koskinen8104e322011-03-13 12:26:22 +02003932 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303933
Peter Huewe599801f2012-02-09 21:11:45 +01003934 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303935 if (pVBInfo->TVInfo & NTSC1024x768) {
3936 TimingPoint = XGI_NTSC1024AdjTime;
3937 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02003938 xgifb_reg_set(pVBInfo->Part2Port, i,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303939 TimingPoint[j]);
3940 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02003941 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303942 }
3943 }
3944
Miguel Gómez949eb0a2012-07-06 12:40:36 +02003945 /* Modify for 301C PALM Support */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303946 if (pVBInfo->VBType & VB_XGI301C) {
Peter Huewe599801f2012-02-09 21:11:45 +01003947 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003948 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303949 0x08); /* PALM Mode */
3950 }
3951
Peter Huewe599801f2012-02-09 21:11:45 +01003952 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02003953 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303954 0x01);
3955 tempax--;
Aaro Koskinendc505562011-03-13 12:26:26 +02003956 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303957
Aaro Koskinendc505562011-03-13 12:26:26 +02003958 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303959 }
3960
Peter Huewe599801f2012-02-09 21:11:45 +01003961 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303962 if (!(pVBInfo->VBInfo & SetInSlaveMode))
Aaro Koskinen8104e322011-03-13 12:26:22 +02003963 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303964 }
3965
3966 if (pVBInfo->VBInfo & SetCRT2ToTV)
3967 return;
3968}
3969
Aaro Koskinen063b9c42011-03-08 22:16:13 +02003970static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303971 struct xgi_hw_device_info *HwDeviceExtension,
3972 unsigned short RefreshRateTableIndex,
3973 struct vb_device_info *pVBInfo)
3974{
3975 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
3976 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
3977
3978 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
3979
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03003980 /* si+Ext_ResInfo */
3981 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3982 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3983 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3984 CRT1Index &= IndexMask;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303985
3986 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3987 return;
3988
3989 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
3990
3991 if (XGI_IsLCDDualLink(pVBInfo))
3992 tempbx = tempbx >> 1;
3993
3994 tempbx -= 1;
3995 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02003996 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05303997 temp = (tempbx & 0xFF00) >> 8;
3998 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02003999 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304000 temp = 0x01;
4001
Aaro Koskinen8104e322011-03-13 12:26:22 +02004002 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304003 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
4004 push1 = tempbx;
4005 tempbx--;
4006 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004007 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304008 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004009 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304010
4011 tempcx = pVBInfo->VT - 1;
4012 push2 = tempcx + 1;
4013 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004014 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304015 temp = (tempcx & 0xFF00) >> 8;
4016 temp = temp << 5;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004017 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004018 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
4019 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
4020 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
4021 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304022
Justin P. Mattock558f7582012-10-02 21:17:11 -07004023 /* Customized LCDB Does not add */
Aaro Koskinen9d1c6292012-11-04 21:14:46 +02004024 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
4025 LCDBDesPtr = XGI_GetLcdPtr(xgifb_lcddldes, ModeNo, ModeIdIndex,
4026 RefreshRateTableIndex, pVBInfo);
4027 else
4028 LCDBDesPtr = XGI_GetLcdPtr(XGI_LCDDesDataTable, ModeNo,
4029 ModeIdIndex, RefreshRateTableIndex,
4030 pVBInfo);
4031
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304032 tempah = pVBInfo->LCDResInfo;
4033 tempah &= PanelResInfo;
4034
Peter Huewe255aabd2012-02-09 21:11:44 +01004035 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304036 tempbx = 1024;
4037 tempcx = 768;
Peter Huewe255aabd2012-02-09 21:11:44 +01004038 } else if ((tempah == Panel_1280x1024) ||
4039 (tempah == Panel_1280x1024x75)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304040 tempbx = 1280;
4041 tempcx = 1024;
Peter Huewe255aabd2012-02-09 21:11:44 +01004042 } else if (tempah == Panel_1400x1050) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304043 tempbx = 1400;
4044 tempcx = 1050;
4045 } else {
4046 tempbx = 1600;
4047 tempcx = 1200;
4048 }
4049
4050 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4051 tempbx = pVBInfo->HDE;
4052 tempcx = pVBInfo->VDE;
4053 }
4054
4055 pushbx = tempbx;
4056 tempax = pVBInfo->VT;
4057 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4058 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4059 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4060 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4061 tempbx = pVBInfo->LCDVDES;
4062 tempcx += tempbx;
4063
4064 if (tempcx >= tempax)
4065 tempcx -= tempax; /* lcdvdes */
4066
4067 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004068 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304069 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004070 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304071 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4072 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4073 tempah = tempch;
4074 tempah = tempah << 3;
4075 tempah |= tempbh;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004076 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304077
4078 /* getlcdsync() */
4079 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4080 tempcx = tempbx;
4081 tempax = pVBInfo->VT;
4082 tempbx = pVBInfo->LCDVRS;
4083
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304084 tempcx += tempbx;
4085 if (tempcx >= tempax)
4086 tempcx -= tempax;
4087
4088 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004089 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304090 temp = (tempbx & 0xFF00) >> 8;
4091 temp = temp << 4;
4092 temp |= (tempcx & 0x000F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004093 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304094 tempcx = pushbx;
4095 tempax = pVBInfo->HT;
4096 tempbx = pVBInfo->LCDHDES;
4097 tempbx &= 0x0FFF;
4098
4099 if (XGI_IsLCDDualLink(pVBInfo)) {
4100 tempax = tempax >> 1;
4101 tempbx = tempbx >> 1;
4102 tempcx = tempcx >> 1;
4103 }
4104
Peter Huewe6896b942012-02-09 21:11:46 +01004105 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304106 tempbx += 1;
4107
4108 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4109 tempbx += 1;
4110
4111 tempcx += tempbx;
4112
4113 if (tempcx >= tempax)
4114 tempcx -= tempax;
4115
4116 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004117 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304118 temp = ((tempbx & 0xFF00) >> 8) << 4;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004119 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304120 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004121 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304122 temp = (tempcx & 0xFF00) >> 8;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004123 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304124
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304125 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4126 tempcx = tempax;
4127 tempax = pVBInfo->HT;
4128 tempbx = pVBInfo->LCDHRS;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304129 if (XGI_IsLCDDualLink(pVBInfo)) {
4130 tempax = tempax >> 1;
4131 tempbx = tempbx >> 1;
4132 tempcx = tempcx >> 1;
4133 }
4134
Peter Huewe6896b942012-02-09 21:11:46 +01004135 if (pVBInfo->VBType & VB_SIS302LV)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304136 tempbx += 1;
4137
4138 tempcx += tempbx;
4139
4140 if (tempcx >= tempax)
4141 tempcx -= tempax;
4142
4143 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004144 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304145
4146 temp = (tempbx & 0xFF00) >> 8;
4147 temp = temp << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004148 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304149 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
Aaro Koskinen8104e322011-03-13 12:26:22 +02004150 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304151
Peter Huewea3d675c2012-02-09 21:11:47 +01004152 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304153 if (pVBInfo->VGAVDE == 525) {
Peter Huewe6896b942012-02-09 21:11:46 +01004154 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4155 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304156 | VB_XGI301C)) {
4157 temp = 0xC6;
4158 } else
4159 temp = 0xC4;
4160
Aaro Koskinen8104e322011-03-13 12:26:22 +02004161 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4162 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304163 }
4164
4165 if (pVBInfo->VGAVDE == 420) {
Peter Huewe6896b942012-02-09 21:11:46 +01004166 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4167 | VB_SIS301LV | VB_SIS302LV
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304168 | VB_XGI301C)) {
4169 temp = 0x4F;
4170 } else
4171 temp = 0x4E;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004172 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304173 }
4174 }
4175}
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004176
4177/* --------------------------------------------------------------------- */
4178/* Function : XGI_GetTap4Ptr */
4179/* Input : */
4180/* Output : di -> Tap4 Reg. Setting Pointer */
4181/* Description : */
4182/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004183static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304184 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004185{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304186 unsigned short tempax, tempbx, i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004187
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304188 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004189
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304190 if (tempcx == 0) {
4191 tempax = pVBInfo->VGAHDE;
4192 tempbx = pVBInfo->HDE;
4193 } else {
4194 tempax = pVBInfo->VGAVDE;
4195 tempbx = pVBInfo->VDE;
4196 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004197
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004198 if (tempax <= tempbx)
4199 return &xgifb_tap4_timing[0];
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304200 else
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004201 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004202
Peter Huewe599801f2012-02-09 21:11:45 +01004203 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304204 Tap4TimingPtr = PALTap4Timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004205
Peter Huewe599801f2012-02-09 21:11:45 +01004206 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4207 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4208 (pVBInfo->TVInfo & TVSetYPbPr525p))
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004209 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
Peter Huewe599801f2012-02-09 21:11:45 +01004210 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304211 Tap4TimingPtr = YPbPr750pTap4Timing;
4212 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004213
Peter Huewe599801f2012-02-09 21:11:45 +01004214 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
Aaro Koskinen11fbdcd2011-08-31 21:46:10 +03004215 Tap4TimingPtr = xgifb_tap4_timing;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004216
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304217 i = 0;
4218 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4219 if (Tap4TimingPtr[i].DE == tempax)
4220 break;
4221 i++;
4222 }
4223 return &Tap4TimingPtr[i];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004224}
4225
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004226static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004227{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304228 unsigned short i, j;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004229
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304230 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004231
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304232 if (!(pVBInfo->VBType & VB_XGI301C))
4233 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004234
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304235 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4236 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004237 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004238
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004239 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004240 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004241 /* Set Vertical Scaling */
4242 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304243 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004244 xgifb_reg_set(pVBInfo->Part2Port,
4245 i,
4246 Tap4TimingPtr->Reg[j]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304247 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004248
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004249 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
Peter Huewe599801f2012-02-09 21:11:45 +01004250 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004251 /* Enable V.Scaling */
4252 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304253 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004254 /* Enable H.Scaling */
4255 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004256}
4257
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004258static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304259 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;
Aaro Koskinend21222d2012-09-11 00:15:29 +03004262 unsigned char const *tempdi;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304263 unsigned short modeflag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004264
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004265 /* si+Ext_ResInfo */
4266 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004267
Aaro Koskinen8104e322011-03-13 12:26:22 +02004268 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
Peter Huewe599801f2012-02-09 21:11:45 +01004269 if (pVBInfo->TVInfo & TVSetPAL) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004270 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4271 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304272 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004273 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4274 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304275 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004276
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304277 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4278 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004279
Peter Huewe599801f2012-02-09 21:11:45 +01004280 if (pVBInfo->TVInfo & TVSetPALM) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02004281 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4282 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4283 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304284 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004285
Peter Huewe599801f2012-02-09 21:11:45 +01004286 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4287 & SetCRT2ToYPbPr525750)) {
4288 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304289 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004290
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004291 tempdi = XGI330_HiTVGroup3Data;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304292 if (pVBInfo->SetFlag & TVSimuMode) {
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004293 tempdi = XGI330_HiTVGroup3Simu;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304294 if (!(modeflag & Charx8Dot))
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004295 tempdi = XGI330_HiTVGroup3Text;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304296 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004297
Peter Huewe599801f2012-02-09 21:11:45 +01004298 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004299 tempdi = XGI330_Ren525pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004300
Peter Huewe599801f2012-02-09 21:11:45 +01004301 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Aaro Koskinen073b61e2012-09-11 00:15:28 +03004302 tempdi = XGI330_Ren750pGroup3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004303
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304304 for (i = 0; i <= 0x3E; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004305 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004306
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304307 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
Peter Huewe599801f2012-02-09 21:11:45 +01004308 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Aaro Koskinen8104e322011-03-13 12:26:22 +02004309 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304310 }
4311 }
4312 return;
4313} /* {end of XGI_SetGroup3} */
4314
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004315static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304316 unsigned short RefreshRateTableIndex,
4317 struct xgi_hw_device_info *HwDeviceExtension,
4318 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004319{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304320 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004321
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304322 unsigned long tempebx, tempeax, templong;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004323
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004324 /* si+Ext_ResInfo */
4325 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304326 temp = pVBInfo->RVBHCFACT;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004327 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004328
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304329 tempbx = pVBInfo->RVBHCMAX;
4330 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004331 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304332 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4333 tempcx = pVBInfo->VGAHT - 1;
4334 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004335 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004336
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304337 temp = ((tempcx & 0xFF00) >> 8) << 3;
4338 temp2 |= temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004339
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304340 tempcx = pVBInfo->VGAVT - 1;
4341 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4342 tempcx -= 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004343
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304344 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004345 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304346 temp = temp2 | ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004347 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004348 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304349 tempcx = pVBInfo->VBInfo;
4350 tempbx = pVBInfo->VGAHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004351
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304352 if (modeflag & HalfDCLK)
4353 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304355 if (XGI_IsLCDDualLink(pVBInfo))
4356 tempbx = tempbx >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004357
Peter Huewe599801f2012-02-09 21:11:45 +01004358 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304359 temp = 0;
4360 if (tempbx <= 1024)
4361 temp = 0xA0;
4362 if (tempbx == 1280)
4363 temp = 0xC0;
4364 } else if (tempcx & SetCRT2ToTV) {
4365 temp = 0xA0;
4366 if (tempbx <= 800)
4367 temp = 0x80;
4368 } else {
4369 temp = 0x80;
4370 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4371 temp = 0;
4372 if (tempbx > 800)
4373 temp = 0x60;
4374 }
4375 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004376
Peter Huewe599801f2012-02-09 21:11:45 +01004377 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304378 temp = 0x00;
4379 if (pVBInfo->VGAHDE == 1280)
4380 temp = 0x40;
4381 if (pVBInfo->VGAHDE == 1024)
4382 temp = 0x20;
4383 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004384 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004385
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304386 tempebx = pVBInfo->VDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004387
Peter Huewe599801f2012-02-09 21:11:45 +01004388 if (tempcx & SetCRT2ToHiVision) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304389 if (!(temp & 0xE000))
4390 tempbx = tempbx >> 1;
4391 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004392
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304393 tempcx = pVBInfo->RVBHRS;
4394 temp = tempcx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004395 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004396
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304397 tempeax = pVBInfo->VGAVDE;
4398 tempcx |= 0x04000;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004399
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304400 if (tempeax <= tempebx) {
4401 tempcx = (tempcx & (~0x4000));
4402 tempeax = pVBInfo->VGAVDE;
4403 } else {
4404 tempeax -= tempebx;
4405 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004406
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304407 templong = (tempeax * 256 * 1024) % tempebx;
4408 tempeax = (tempeax * 256 * 1024) / tempebx;
4409 tempebx = tempeax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004410
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304411 if (templong != 0)
4412 tempebx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004413
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304414 temp = (unsigned short) (tempebx & 0x000000FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004415 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004416
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304417 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004418 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304419 tempbx = (unsigned short) (tempebx >> 16);
4420 temp = tempbx & 0x00FF;
4421 temp = temp << 4;
4422 temp |= ((tempcx & 0xFF00) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004423 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004424
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304425 /* 301b */
Peter Huewe6896b942012-02-09 21:11:46 +01004426 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4427 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304428 temp = 0x0028;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004429 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304430 tempax = pVBInfo->VGAHDE;
4431 if (modeflag & HalfDCLK)
4432 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004433
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304434 if (XGI_IsLCDDualLink(pVBInfo))
4435 tempax = tempax >> 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004436
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304437 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4438 if (tempax > 800)
4439 tempax -= 800;
Aaro Koskinend3ae5762012-09-11 00:15:27 +03004440 } else if (pVBInfo->VGAHDE > 800) {
4441 if (pVBInfo->VGAHDE == 1024)
4442 tempax = (tempax * 25 / 32) - 1;
4443 else
4444 tempax = (tempax * 20 / 32) - 1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304445 }
4446 tempax -= 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304448 temp = (tempax & 0xFF00) >> 8;
4449 temp = ((temp & 0x0003) << 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004450 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304451 temp = (tempax & 0x00FF);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004452 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004453
Peter Huewe599801f2012-02-09 21:11:45 +01004454 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304455 if (pVBInfo->VGAHDE > 800)
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004456 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004457
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304458 }
4459 temp = 0x0036;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004460
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304461 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4462 if (!(pVBInfo->TVInfo & (NTSC1024x768
Peter Huewe599801f2012-02-09 21:11:45 +01004463 | TVSetYPbPr525p | TVSetYPbPr750p
4464 | TVSetHiVision))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304465 temp |= 0x0001;
4466 if ((pVBInfo->VBInfo & SetInSlaveMode)
4467 && (!(pVBInfo->TVInfo
4468 & TVSimuMode)))
4469 temp &= (~0x0001);
4470 }
4471 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004472
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004473 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304474 tempbx = pVBInfo->HT;
4475 if (XGI_IsLCDDualLink(pVBInfo))
4476 tempbx = tempbx >> 1;
4477 tempbx = (tempbx >> 1) - 2;
4478 temp = ((tempbx & 0x0700) >> 8) << 3;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004479 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304480 temp = tempbx & 0x00FF;
Aaro Koskinen8104e322011-03-13 12:26:22 +02004481 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304482 }
4483 /* end 301b */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004484
Aaro Koskinen8951dad2012-09-11 00:15:30 +03004485 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004486}
4487
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004488static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4489{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004490 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004491}
4492
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004493static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304494 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004495{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304496 unsigned short Pindex, Pdata;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004497
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304498 Pindex = pVBInfo->Part5Port;
4499 Pdata = pVBInfo->Part5Port + 1;
4500 if (pVBInfo->ModeType == ModeVGA) {
4501 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
Peter Huewe6896b942012-02-09 21:11:46 +01004502 | DisableCRT2Display))) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304503 XGINew_EnableCRT2(pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304504 }
4505 }
4506 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004507}
4508
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004509static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304510 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004511{
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004512 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004513}
4514
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004515static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304516 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004517{
4518
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004519 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004520}
4521
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004522static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
4523 unsigned short ModeNo, unsigned short ModeIdIndex,
4524 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004525{
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004526 unsigned short xres, yres, colordepth, modeflag, resindex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004527
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004528 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004529 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4530 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4531 /* si+St_ModeFlag */
4532 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004533
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304534 if (!(modeflag & Charx8Dot)) {
4535 xres /= 9;
4536 xres *= 8;
4537 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004538
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004539 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4540 xres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004541
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004542 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4543 yres *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004544
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004545 if (xres > xgifb_info->lvds_data.LVDSHDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304546 return 0;
Bill Pembertondda08c52010-06-17 13:10:42 -04004547
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004548 if (yres > xgifb_info->lvds_data.LVDSVDE)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304549 return 0;
4550
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004551 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4552 yres != xgifb_info->lvds_data.LVDSVDE) {
4553 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4554 if (colordepth > 2)
4555 return 0;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304556 }
4557 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004558}
4559
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004560static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4561 int chip_id,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004562 unsigned short ModeNo,
4563 unsigned short ModeIdIndex,
4564 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004565{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304566 unsigned char temp, Miscdata;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004567 unsigned short xres, yres, modeflag, resindex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304568 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4569 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4570 unsigned short value;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004571
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004572 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004573 (LCDPolarity << 8)) >> 8);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304574 temp &= LCDPolarity;
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004575 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004576
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004577 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004578
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004579 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004580 /* SR35[7] FP VSync polarity */
4581 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4582 /* SR30[5] FP HSync polarity */
4583 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004584
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004585 if (chip_id == XG27)
4586 XGI_SetXG27FPBits(pVBInfo);
4587 else
4588 XGI_SetXG21FPBits(pVBInfo);
4589
Aaro Koskinen6c0965f2012-04-07 01:14:11 +03004590 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004591 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4592 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4593 /* si+St_ModeFlag */
4594 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004595
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304596 if (!(modeflag & Charx8Dot))
4597 xres = xres * 8 / 9;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004598
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004599 LVDSHT = xgifb_info->lvds_data.LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004600
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004601 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004602
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304603 if (LVDSHBS > LVDSHT)
4604 LVDSHBS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004605
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004606 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304607 if (LVDSHRS > LVDSHT)
4608 LVDSHRS -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004609
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004610 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304611 if (LVDSHRE > LVDSHT)
4612 LVDSHRE -= LVDSHT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004613
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004614 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004615
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004616 LVDSVT = xgifb_info->lvds_data.LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004617
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004618 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03004619 if (modeflag & DoubleScanMode)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304620 LVDSVBS += yres / 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004621
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304622 if (LVDSVBS > LVDSVT)
4623 LVDSVBS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004624
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004625 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304626 if (LVDSVRS > LVDSVT)
4627 LVDSVRS -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004628
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004629 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304630 if (LVDSVRE > LVDSVT)
4631 LVDSVRE -= LVDSVT;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004632
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004633 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004634
Aaro Koskinen58839b02011-03-13 12:26:23 +02004635 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004636 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004637
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304638 if (!(modeflag & Charx8Dot))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02004639 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004640
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304641 /* HT SR0B[1:0] CR00 */
4642 value = (LVDSHT >> 3) - 5;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004643 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004644 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004645
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304646 /* HBS SR0B[5:4] CR02 */
4647 value = (LVDSHBS >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004648 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004649 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004650
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304651 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
4652 value = (LVDSHBE >> 3) - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004653 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
4654 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
4655 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004656
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304657 /* HRS SR0B[7:6] CR04 */
4658 value = (LVDSHRS >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004659 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004660 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004661
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304662 /* Panel HRS SR2F[1:0] SR2E[7:0] */
4663 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004664 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004665 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004666
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304667 /* HRE SR0C[2] CR05[4:0] */
4668 value = (LVDSHRE >> 3) + 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004669 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
4670 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004671
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304672 /* Panel HRE SR2F[7:2] */
4673 value--;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004674 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004675
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304676 /* VT SR0A[0] CR07[5][0] CR06 */
4677 value = LVDSVT - 2;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004678 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
4679 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
4680 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004681 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004682
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304683 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
4684 value = LVDSVBS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004685 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
4686 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
4687 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004688 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004689
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304690 /* VBE SR0A[4] CR16 */
4691 value = LVDSVBE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004692 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004693 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004694
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304695 /* VRS SR0A[3] CR7[7][2] CR10 */
4696 value = LVDSVRS - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004697 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
4698 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
4699 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004700 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004701
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004702 if (chip_id == XG27) {
4703 /* Panel VRS SR35[2:0] SR34[7:0] */
4704 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
4705 (value & 0x700) >> 8);
4706 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
4707 } else {
4708 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
4709 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
4710 (value & 0x600) >> 9);
4711 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
4712 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
4713 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004714
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304715 /* VRE SR0A[5] CR11[3:0] */
4716 value = LVDSVRE - 1;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004717 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
4718 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004719
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304720 /* Panel VRE SR3F[7:2] */
Aaro Koskinen64db29f2011-08-31 21:46:01 +03004721 if (chip_id == XG27)
4722 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4723 (value << 2) & 0xFC);
4724 else
4725 /* SR3F[7] has to be 0, h/w bug */
4726 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4727 (value << 2) & 0x7C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004728
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304729 for (temp = 0, value = 0; temp < 3; temp++) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004730
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02004731 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004732 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004733 0x2B, xgifb_info->lvds_data.VCLKData1);
Aaro Koskinen8104e322011-03-13 12:26:22 +02004734 xgifb_reg_set(pVBInfo->P3c4,
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004735 0x2C, xgifb_info->lvds_data.VCLKData2);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304736 value += 0x10;
4737 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004738
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304739 if (!(modeflag & Charx8Dot)) {
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004740 inb(pVBInfo->P3da); /* reset 3da */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004741 outb(0x13, pVBInfo->P3c0); /* set index */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004742 /* set data, panning = 0, shift left 1 dot*/
4743 outb(0x00, pVBInfo->P3c0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004744
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004745 inb(pVBInfo->P3da); /* Enable Attribute */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02004746 outb(0x20, pVBInfo->P3c0);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304747
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02004748 inb(pVBInfo->P3da); /* reset 3da */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304749 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004750
4751}
4752
4753/* --------------------------------------------------------------------- */
4754/* Function : XGI_IsLCDON */
4755/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04004756/* Output : 0 : Skip PSC Control */
4757/* 1: Disable PSC */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004758/* Description : */
4759/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004760static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004761{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304762 unsigned short tempax;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004763
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304764 tempax = pVBInfo->VBInfo;
4765 if (tempax & SetCRT2ToDualEdge)
4766 return 0;
Peter Huewe6896b942012-02-09 21:11:46 +01004767 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304768 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004769
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304770 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004771}
4772
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004773/* --------------------------------------------------------------------- */
4774/* Function : XGI_DisableChISLCD */
4775/* Input : */
Bill Pembertondda08c52010-06-17 13:10:42 -04004776/* Output : 0 -> Not LCD Mode */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004777/* Description : */
4778/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004779static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004780{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304781 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004782
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304783 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004784 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004785
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304786 if (tempbx & (EnableChA | DisableChA)) {
4787 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4788 return 0;
4789 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004790
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304791 if (!(tempbx & (EnableChB | DisableChB)))
4792 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004793
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304794 if (tempah & 0x01) /* Chk LCDB Mode */
4795 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004796
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304797 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004798}
4799
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004800/* --------------------------------------------------------------------- */
4801/* Function : XGI_EnableChISLCD */
4802/* Input : */
4803/* Output : 0 -> Not LCD mode */
4804/* Description : */
4805/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004806static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004807{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304808 unsigned short tempbx, tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004809
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304810 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
Aaro Koskinen58839b02011-03-13 12:26:23 +02004811 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004812
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304813 if (tempbx & (EnableChA | DisableChA)) {
4814 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4815 return 0;
4816 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004817
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304818 if (!(tempbx & (EnableChB | DisableChB)))
Bill Pembertondda08c52010-06-17 13:10:42 -04004819 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004820
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304821 if (tempah & 0x01) /* Chk LCDB Mode */
4822 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004823
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304824 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004825}
4826
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004827static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
4828 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304829 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004830{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02004831 unsigned short tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004832
Peter Huewe6896b942012-02-09 21:11:46 +01004833 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4834 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304835 tempah = 0x3F;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004836 if (!(pVBInfo->VBInfo &
4837 (DisableCRT2Display | SetSimuScanMode))) {
Peter Huewea3d675c2012-02-09 21:11:47 +01004838 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304839 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
4840 tempah = 0x7F; /* Disable Channel A */
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004841 if (!(pVBInfo->VBInfo &
4842 XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004843 /* Disable Channel B */
4844 tempah = 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004845
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304846 if (pVBInfo->SetFlag & DisableChB)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004847 /* force to disable Cahnnel */
4848 tempah &= 0xBF;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004849
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304850 if (pVBInfo->SetFlag & DisableChA)
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004851 /* Force to disable Channel B */
4852 tempah &= 0x7F;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304853 }
4854 }
4855 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004856
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004857 /* disable part4_1f */
4858 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004859
Peter Huewe6896b942012-02-09 21:11:46 +01004860 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Miguel Gómez3bcc2462012-07-06 12:40:53 +02004861 if (((pVBInfo->VBInfo &
4862 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
4863 || (XGI_DisableChISLCD(pVBInfo))
4864 || (XGI_IsLCDON(pVBInfo)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004865 /* LVDS Driver power down */
4866 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304867 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004868
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304869 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01004870 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304871 | SetSimuScanMode))) {
4872 if (pVBInfo->SetFlag & GatingCRT)
4873 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004874 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304875 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004876
Peter Huewea3d675c2012-02-09 21:11:47 +01004877 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304878 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
Peter Huewea3d675c2012-02-09 21:11:47 +01004879 & XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004880 /* Power down */
4881 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304882 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004883
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004884 /* disable TV as primary VGA swap */
4885 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004886
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304887 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
Aaro Koskinendc505562011-03-13 12:26:26 +02004888 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004889
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004890 if ((pVBInfo->SetFlag & DisableChB) ||
4891 (pVBInfo->VBInfo &
4892 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004893 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004894 (pVBInfo->VBInfo &
4895 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004896 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004897
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004898 if ((pVBInfo->SetFlag & DisableChB) ||
4899 (pVBInfo->VBInfo &
4900 (DisableCRT2Display | SetSimuScanMode)) ||
Peter Huewea3d675c2012-02-09 21:11:47 +01004901 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004902 (pVBInfo->VBInfo &
4903 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
4904 /* save Part1 index 0 */
4905 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
4906 /* BTDAC = 1, avoid VB reset */
4907 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
4908 /* disable CRT2 */
4909 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4910 /* restore Part1 index 0 */
4911 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304912 }
4913 } else { /* {301} */
4914 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08004915 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
4916 /* Disable CRT2 */
4917 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4918 /* Disable TV asPrimary VGA swap */
4919 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304920 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004921
Peter Huewea3d675c2012-02-09 21:11:47 +01004922 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304923 | SetSimuScanMode))
Aaro Koskinenfab04b92011-12-06 00:10:45 +02004924 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304925 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004926}
4927
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004928/* --------------------------------------------------------------------- */
4929/* Function : XGI_GetTVPtrIndex */
4930/* Input : */
4931/* Output : */
4932/* Description : bx 0 : ExtNTSC */
4933/* 1 : StNTSC */
4934/* 2 : ExtPAL */
4935/* 3 : StPAL */
4936/* 4 : ExtHiTV */
4937/* 5 : StHiTV */
4938/* 6 : Ext525i */
4939/* 7 : St525i */
4940/* 8 : Ext525p */
4941/* 9 : St525p */
4942/* A : Ext750p */
4943/* B : St750p */
4944/* --------------------------------------------------------------------- */
Aaro Koskinen063b9c42011-03-08 22:16:13 +02004945static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004946{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304947 unsigned short tempbx = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004948
Peter Huewe599801f2012-02-09 21:11:45 +01004949 if (pVBInfo->TVInfo & TVSetPAL)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304950 tempbx = 2;
Peter Huewe599801f2012-02-09 21:11:45 +01004951 if (pVBInfo->TVInfo & TVSetHiVision)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304952 tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01004953 if (pVBInfo->TVInfo & TVSetYPbPr525i)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304954 tempbx = 6;
Peter Huewe599801f2012-02-09 21:11:45 +01004955 if (pVBInfo->TVInfo & TVSetYPbPr525p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304956 tempbx = 8;
Peter Huewe599801f2012-02-09 21:11:45 +01004957 if (pVBInfo->TVInfo & TVSetYPbPr750p)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304958 tempbx = 10;
4959 if (pVBInfo->TVInfo & TVSimuMode)
4960 tempbx++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004961
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05304962 return tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004963}
4964
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004965/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004966/* Function : XGI_GetTVPtrIndex2 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004967/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004968/* Output : bx 0 : NTSC */
4969/* 1 : PAL */
4970/* 2 : PALM */
4971/* 3 : PALN */
4972/* 4 : NTSC1024x768 */
4973/* 5 : PAL-M 1024x768 */
4974/* 6-7: reserved */
4975/* cl 0 : YFilter1 */
4976/* 1 : YFilter2 */
4977/* ch 0 : 301A */
4978/* 1 : 301B/302B/301LV/302LV */
4979/* Description : */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004980/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004981static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
4982 unsigned char *tempch, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004983{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004984 *tempbx = 0;
4985 *tempcl = 0;
4986 *tempch = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004987
Peter Huewe599801f2012-02-09 21:11:45 +01004988 if (pVBInfo->TVInfo & TVSetPAL)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004989 *tempbx = 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004990
Peter Huewe599801f2012-02-09 21:11:45 +01004991 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004992 *tempbx = 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004993
Peter Huewe599801f2012-02-09 21:11:45 +01004994 if (pVBInfo->TVInfo & TVSetPALN)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004995 *tempbx = 3;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004996
Aaro Koskinencc1e2392011-03-13 12:26:07 +02004997 if (pVBInfo->TVInfo & NTSC1024x768) {
4998 *tempbx = 4;
Peter Huewe599801f2012-02-09 21:11:45 +01004999 if (pVBInfo->TVInfo & TVSetPALM)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005000 *tempbx = 5;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305001 }
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005002
Peter Huewe6896b942012-02-09 21:11:46 +01005003 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5004 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005005 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
5006 & TVSimuMode)) {
5007 *tempbx += 8;
5008 *tempcl += 1;
5009 }
5010 }
5011
Peter Huewe6896b942012-02-09 21:11:46 +01005012 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5013 | VB_SIS302LV | VB_XGI301C))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005014 (*tempch)++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005015}
5016
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005017static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005018{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305019 unsigned char tempah, tempbl, tempbh;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005020
Peter Huewe6896b942012-02-09 21:11:46 +01005021 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5022 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005023 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305024 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305025 tempbh = 0;
Peter Huewe03f76fc2012-06-14 00:21:50 +02005026 tempbl = XGI301TVDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005027
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305028 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5029 tempbl = tempbl >> 4;
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005030 if (pVBInfo->VBInfo &
5031 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005032 tempbh = XGI301LCDDelay;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005033
Peter Huewea3d675c2012-02-09 21:11:47 +01005034 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305035 tempbl = tempbh;
5036 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005037
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305038 tempbl &= 0x0F;
5039 tempbh &= 0xF0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02005040 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005041
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305042 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5043 | SetCRT2ToTV)) { /* Channel B */
5044 tempah &= 0xF0;
5045 tempah |= tempbl;
5046 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005047
Miguel Gómez3bcc2462012-07-06 12:40:53 +02005048 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5049 /* Channel A */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305050 tempah &= 0x0F;
5051 tempah |= tempbh;
5052 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005053 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305054 }
5055 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5056 tempbl = 0;
5057 tempbh = 0;
5058 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
Peter Huewe03f76fc2012-06-14 00:21:50 +02005059 tempah = XGI301LCDDelay;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305060 tempah &= 0x0f;
5061 tempah = tempah << 4;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005062 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305063 tempah);
5064 }
5065 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005066}
5067
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005068static void XGI_SetLCDCap_A(unsigned short tempcx,
5069 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005070{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305071 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005072
Aaro Koskinen58839b02011-03-13 12:26:23 +02005073 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005074
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305075 if (temp & LCDRGB18Bit) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005076 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005077 /* Enable Dither */
5078 (unsigned short) (0x20 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005079 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305080 } else {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005081 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305082 (unsigned short) (0x30 | (tempcx & 0x00C0)));
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005083 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305084 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005085}
5086
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005087/* --------------------------------------------------------------------- */
5088/* Function : XGI_SetLCDCap_B */
5089/* Input : cx -> LCD Capability */
5090/* Output : */
5091/* Description : */
5092/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005093static void XGI_SetLCDCap_B(unsigned short tempcx,
5094 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005095{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305096 if (tempcx & EnableLCD24bpp) /* 24bits */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005097 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305098 (unsigned short) (((tempcx & 0x00ff) >> 6)
5099 | 0x0c));
5100 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005101 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305102 (unsigned short) (((tempcx & 0x00ff) >> 6)
5103 | 0x18)); /* Enable Dither */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005104}
5105
Aaro Koskinen7f04ec32011-11-27 23:03:05 +02005106static void XGI_LongWait(struct vb_device_info *pVBInfo)
5107{
5108 unsigned short i;
5109
5110 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5111
5112 if (!(i & 0xC0)) {
5113 for (i = 0; i < 0xFFFF; i++) {
5114 if (!(inb(pVBInfo->P3da) & 0x08))
5115 break;
5116 }
5117
5118 for (i = 0; i < 0xFFFF; i++) {
5119 if ((inb(pVBInfo->P3da) & 0x08))
5120 break;
5121 }
5122 }
5123}
5124
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005125static void SetSpectrum(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005126{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305127 unsigned short index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005128
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305129 index = XGI_GetLCDCapPtr(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005130
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005131 /* disable down spectrum D[4] */
5132 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305133 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005134 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305135 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005136
Aaro Koskinen8104e322011-03-13 12:26:22 +02005137 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305138 pVBInfo->LCDCapList[index].Spectrum_31);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005139 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305140 pVBInfo->LCDCapList[index].Spectrum_32);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005141 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305142 pVBInfo->LCDCapList[index].Spectrum_33);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005143 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305144 pVBInfo->LCDCapList[index].Spectrum_34);
5145 XGI_LongWait(pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005146 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005147}
5148
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005149static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5150{
5151 unsigned short tempcx;
5152
5153 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5154
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005155 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005156 (VB_SIS301B |
5157 VB_SIS302B |
5158 VB_SIS301LV |
5159 VB_SIS302LV |
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005160 VB_XGI301C)) { /* 301LV/302LV only */
5161 if (pVBInfo->VBType &
Peter Huewe6896b942012-02-09 21:11:46 +01005162 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005163 /* Set 301LV Capability */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005164 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005165 (unsigned char) (tempcx & 0x1F));
5166 }
5167 /* VB Driving */
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005168 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005169 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5170 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5171 | EnablePLLSPLOW)) >> 8));
5172 }
5173
Peter Huewe6896b942012-02-09 21:11:46 +01005174 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5175 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005176 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5177 XGI_SetLCDCap_B(tempcx, pVBInfo);
Peter Huewea3d675c2012-02-09 21:11:47 +01005178 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005179 XGI_SetLCDCap_A(tempcx, pVBInfo);
5180
Peter Huewe6896b942012-02-09 21:11:46 +01005181 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005182 if (tempcx & EnableSpectrum)
5183 SetSpectrum(pVBInfo);
5184 }
5185 } else {
5186 /* LVDS,CH7017 */
5187 XGI_SetLCDCap_A(tempcx, pVBInfo);
5188 }
5189}
5190
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005191/* --------------------------------------------------------------------- */
5192/* Function : XGI_SetAntiFlicker */
5193/* Input : */
5194/* Output : */
5195/* Description : Set TV Customized Param. */
5196/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005197static void XGI_SetAntiFlicker(unsigned short ModeNo,
5198 unsigned short ModeIdIndex,
5199 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005200{
Aaro Koskinen36ae0352012-04-07 01:14:08 +03005201 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005202
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305203 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005204
Peter Huewe599801f2012-02-09 21:11:45 +01005205 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305206 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005207
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305208 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5209 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305210 tempah = TVAntiFlickList[tempbx];
5211 tempah = tempah << 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005212
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005213 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005214}
5215
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005216static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5217 unsigned short ModeIdIndex,
5218 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005219{
Aaro Koskinen354f49f2012-04-07 01:14:09 +03005220 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005221
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305222 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005223
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305224 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5225 tempbx &= 0xFE;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305226 tempah = TVEdgeList[tempbx];
5227 tempah = tempah << 5;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005228
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005229 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005230}
5231
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005232static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005233{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305234 unsigned short tempbx;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005235
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305236 unsigned char tempcl, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005237
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305238 unsigned long tempData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005239
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305240 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5241 tempData = TVPhaseList[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005242
Aaro Koskinen8104e322011-03-13 12:26:22 +02005243 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305244 & 0x000000FF));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005245 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305246 & 0x0000FF00) >> 8));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005247 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305248 & 0x00FF0000) >> 16));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005249 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305250 & 0xFF000000) >> 24));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005251}
5252
Aaro Koskinen063b9c42011-03-08 22:16:13 +02005253static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305254 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005255{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305256 unsigned short tempbx, index;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005257
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305258 unsigned char tempcl, tempch, tempal, *filterPtr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005259
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305260 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005261
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305262 switch (tempbx) {
5263 case 0x00:
5264 case 0x04:
5265 filterPtr = NTSCYFilter1;
5266 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005267
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305268 case 0x01:
5269 filterPtr = PALYFilter1;
5270 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005271
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305272 case 0x02:
5273 case 0x05:
5274 case 0x0D:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305275 case 0x03:
Aaro Koskinen2555e942011-08-31 21:46:06 +03005276 filterPtr = xgifb_palmn_yfilter1;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305277 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005278
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305279 case 0x08:
5280 case 0x0C:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305281 case 0x0A:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305282 case 0x0B:
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305283 case 0x09:
Aaro Koskinen80f86f82011-08-31 21:46:05 +03005284 filterPtr = xgifb_yfilter2;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305285 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005286
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305287 default:
5288 return;
5289 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005290
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005291 tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305292 if (tempcl == 0)
5293 index = tempal * 4;
5294 else
5295 index = tempal * 7;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005296
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305297 if ((tempcl == 0) && (tempch == 1)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005298 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5299 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5300 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5301 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305302 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005303 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5304 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5305 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5306 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305307 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005308
Peter Huewe6896b942012-02-09 21:11:46 +01005309 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5310 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02005311 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5312 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5313 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305314 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005315}
5316
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005317/* --------------------------------------------------------------------- */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005318/* Function : XGI_OEM310Setting */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005319/* Input : */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005320/* Output : */
5321/* Description : Customized Param. for 301 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005322/* --------------------------------------------------------------------- */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005323static void XGI_OEM310Setting(unsigned short ModeNo,
5324 unsigned short ModeIdIndex,
5325 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005326{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005327 XGI_SetDelayComp(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005328
Peter Huewea3d675c2012-02-09 21:11:47 +01005329 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005330 XGI_SetLCDCap(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005331
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005332 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005333 XGI_SetPhaseIncr(pVBInfo);
5334 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5335 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005336
Peter Huewe6896b942012-02-09 21:11:46 +01005337 if (pVBInfo->VBType & VB_SIS301)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005338 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305339 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005340}
5341
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005342/* --------------------------------------------------------------------- */
5343/* Function : XGI_SetCRT2ModeRegs */
5344/* Input : */
5345/* Output : */
5346/* Description : Origin code for crt2group */
5347/* --------------------------------------------------------------------- */
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005348static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305349 struct xgi_hw_device_info *HwDeviceExtension,
5350 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005351{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305352 unsigned short tempbl;
5353 short tempcl;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005354
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305355 unsigned char tempah;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005356
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305357 tempah = 0;
5358 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005359 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305360 tempah &= ~0x10; /* BTRAMDAC */
5361 tempah |= 0x40; /* BTRAM */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005362
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305363 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5364 | SetCRT2ToLCD)) {
5365 tempah = 0x40; /* BTDRAM */
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005366 tempcl = pVBInfo->ModeType;
5367 tempcl -= ModeVGA;
5368 if (tempcl >= 0) {
5369 /* BT Color */
5370 tempah = (0x008 >> tempcl);
5371 if (tempah == 0)
5372 tempah = 1;
5373 tempah |= 0x040;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305374 }
5375 if (pVBInfo->VBInfo & SetInSlaveMode)
5376 tempah ^= 0x50; /* BTDAC */
5377 }
5378 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005379
Aaro Koskinen8104e322011-03-13 12:26:22 +02005380 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305381 tempah = 0x08;
5382 tempbl = 0xf0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005383
Miguel Gómeze123e462012-07-06 12:40:52 +02005384 if (pVBInfo->VBInfo & DisableCRT2Display)
5385 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005386
Miguel Gómeze123e462012-07-06 12:40:52 +02005387 tempah = 0x00;
5388 tempbl = 0xff;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005389
Miguel Gómeze123e462012-07-06 12:40:52 +02005390 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5391 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5392 goto reg_and_or;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005393
Miguel Gómeze123e462012-07-06 12:40:52 +02005394 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5395 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5396 tempbl &= 0xf7;
5397 tempah |= 0x01;
5398 goto reg_and_or;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305399 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005400
Miguel Gómeze123e462012-07-06 12:40:52 +02005401 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5402 tempbl &= 0xf7;
5403 tempah |= 0x01;
5404 }
5405
5406 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5407 goto reg_and_or;
5408
5409 tempbl &= 0xf8;
5410 tempah = 0x01;
5411
5412 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5413 tempah |= 0x02;
5414
5415 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5416 tempah = tempah ^ 0x05;
5417 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5418 tempah = tempah ^ 0x01;
5419 }
5420
5421 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5422 tempah |= 0x08;
5423
5424reg_and_or:
5425 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5426
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305427 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005428 | XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305429 tempah &= (~0x08);
5430 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5431 & SetInSlaveMode))) {
5432 tempah |= 0x010;
5433 }
5434 tempah |= 0x080;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005435
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305436 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305437 tempah |= 0x020;
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005438 if (pVBInfo->VBInfo & DriverMode)
5439 tempah = tempah ^ 0x20;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305440 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005441
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005442 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305443 tempah = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005444
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305445 if (pVBInfo->LCDInfo & SetLCDDualLink)
5446 tempah |= 0x40;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005447
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305448 if (pVBInfo->VBInfo & SetCRT2ToTV) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305449 if (pVBInfo->TVInfo & RPLLDIV2XO)
5450 tempah |= 0x40;
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305451 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005452
Peter Huewe255aabd2012-02-09 21:11:44 +01005453 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5454 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305455 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005456
Peter Huewe255aabd2012-02-09 21:11:44 +01005457 if (pVBInfo->LCDResInfo == Panel_1280x960)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305458 tempah |= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005459
Aaro Koskinen8104e322011-03-13 12:26:22 +02005460 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305461 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005462
Peter Huewe6896b942012-02-09 21:11:46 +01005463 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5464 | VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305465 tempah = 0;
5466 tempbl = 0xfb;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005467
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305468 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5469 tempbl = 0xff;
Peter Huewea3d675c2012-02-09 21:11:47 +01005470 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305471 tempah |= 0x04; /* shampoo 0129 */
5472 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005473
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005474 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305475 tempah = 0x00;
5476 tempbl = 0xcf;
5477 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5478 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5479 tempah |= 0x30;
5480 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005481
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005482 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305483 tempah = 0;
5484 tempbl = 0x3f;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005485
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305486 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5487 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5488 tempah |= 0xc0;
5489 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005490 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305491 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005492
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305493 tempah = 0;
5494 tempbl = 0x7f;
Peter Huewea3d675c2012-02-09 21:11:47 +01005495 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305496 tempbl = 0xff;
5497 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5498 tempah |= 0x80;
5499 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005500
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005501 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005502
Peter Huewe6896b942012-02-09 21:11:46 +01005503 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305504 if (pVBInfo->LCDInfo & SetLCDDualLink) {
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005505 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5506 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305507 }
5508 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005509}
5510
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005511
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305512void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5513 struct vb_device_info *pVBInfo)
5514{
5515
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005516 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005517
5518}
5519
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305520void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5521 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005522{
5523
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005524 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005525
5526}
5527
Bill Pemberton80adad82010-06-17 13:10:51 -04005528unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005529{
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305530 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005531
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305532 if (pVBInfo->IF_DEF_LVDS == 1) {
5533 return 1;
5534 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005535 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305536 if ((flag == 1) || (flag == 2))
5537 return 1; /* 301b */
5538 else
5539 return 0;
5540 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005541}
5542
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005543unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5544 unsigned short ModeNo, unsigned short ModeIdIndex,
5545 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005546{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005547 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
5548 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
5549 0x01, 0x01 };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005550
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005551 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005552
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03005553 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005554
Aaro Koskinen58839b02011-03-13 12:26:23 +02005555 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005556 index = index >> pVBInfo->SelectCRT2Rate;
5557 index &= 0x0F;
5558
5559 if (pVBInfo->LCDInfo & LCDNonExpanding)
5560 index = 0;
5561
5562 if (index > 0)
5563 index--;
5564
5565 if (pVBInfo->SetFlag & ProgrammingCRT2) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005566 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005567 if (pVBInfo->IF_DEF_LVDS == 0) {
Peter Huewe6896b942012-02-09 21:11:46 +01005568 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5569 | VB_SIS301LV | VB_SIS302LV
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005570 | VB_XGI301C))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005571 /* 301b */
5572 temp = LCDARefreshIndex[
5573 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005574 else
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005575 temp = LCDRefreshIndex[
5576 pVBInfo->LCDResInfo & 0x0F];
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005577
5578 if (index > temp)
5579 index = temp;
5580 } else {
5581 index = 0;
5582 }
5583 }
5584 }
5585
5586 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
5587 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
5588 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005589 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
5590 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005591 index++;
5592 }
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005593 /* do the similar adjustment like XGISearchCRT1Rate() */
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005594 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5595 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005596 index++;
5597 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005598 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5599 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005600 index++;
5601 }
5602 }
5603
5604 i = 0;
5605 do {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005606 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
5607 ModeID != ModeNo)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005608 break;
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005609 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
5610 Ext_InfoFlag;
Peter Huewe6896b942012-02-09 21:11:46 +01005611 temp &= ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005612 if (temp < pVBInfo->ModeType)
5613 break;
5614 i++;
5615 index--;
5616
5617 } while (index != 0xFFFF);
5618 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5619 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005620 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
5621 Ext_InfoFlag;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005622 if (temp & InterlaceMode)
5623 i++;
5624 }
5625 }
5626 i--;
5627 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
5628 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
5629 RefreshRateTableIndex, &i, pVBInfo);
5630 }
Aaro Koskinen9a0b2952011-11-27 23:03:16 +02005631 return RefreshRateTableIndex + i;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005632}
5633
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005634static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
Prashant P. Shah21df8fc2010-09-03 22:12:12 +05305635 struct xgi_hw_device_info *HwDeviceExtension,
5636 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005637{
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005638 unsigned short RefreshRateTableIndex;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005639
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005640 pVBInfo->SetFlag |= ProgrammingCRT2;
5641 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5642 ModeIdIndex, pVBInfo);
5643 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
5644 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5645 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5646 HwDeviceExtension, pVBInfo);
5647 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5648 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005649}
5650
Aaro Koskinenfac2cc92011-11-27 23:03:13 +02005651static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005652 struct xgi_hw_device_info *HwDeviceExtension,
5653 struct vb_device_info *pVBInfo)
5654{
5655 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
5656
5657 tempbx = pVBInfo->VBInfo;
5658 pVBInfo->SetFlag |= ProgrammingCRT2;
5659 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
5660 pVBInfo->SelectCRT2Rate = 4;
5661 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5662 ModeIdIndex, pVBInfo);
5663 XGI_SaveCRT2Info(ModeNo, pVBInfo);
5664 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
5665 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5666 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5667 RefreshRateTableIndex, pVBInfo);
5668 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5669 RefreshRateTableIndex, pVBInfo);
5670 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5671 RefreshRateTableIndex, pVBInfo);
5672 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5673 HwDeviceExtension, pVBInfo);
5674 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5675 RefreshRateTableIndex, pVBInfo);
5676 XGI_SetTap4Regs(pVBInfo);
5677 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
5678 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5679 HwDeviceExtension, pVBInfo);
5680 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5681 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
5682 XGI_AutoThreshold(pVBInfo);
5683 return 1;
5684}
5685
5686void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
5687{
5688 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
5689 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
5690 0x05, 0x00 };
5691
5692 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
5693
5694 unsigned char CR17, CR63, SR31;
5695 unsigned short temp;
5696 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
5697
5698 int i;
Aaro Koskinen8104e322011-03-13 12:26:22 +02005699 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005700
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005701 /* to fix XG42 single LCD sense to CRT+LCD */
Aaro Koskinen8104e322011-03-13 12:26:22 +02005702 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
Aaro Koskinen58839b02011-03-13 12:26:23 +02005703 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005704 pVBInfo->P3d4, 0x53) | 0x02));
5705
Aaro Koskinen58839b02011-03-13 12:26:23 +02005706 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
5707 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
5708 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005709
Aaro Koskinen8104e322011-03-13 12:26:22 +02005710 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
5711 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005712
Aaro Koskinen58839b02011-03-13 12:26:23 +02005713 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005714 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005715
Aaro Koskinen58839b02011-03-13 12:26:23 +02005716 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005717 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005718
Aaro Koskinen58839b02011-03-13 12:26:23 +02005719 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005720 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
Aaro Koskinen58839b02011-03-13 12:26:23 +02005721 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
Aaro Koskinen8104e322011-03-13 12:26:22 +02005722 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005723
Aaro Koskinen8104e322011-03-13 12:26:22 +02005724 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005725
5726 for (i = 0; i < 8; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005727 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005728
5729 for (i = 8; i < 11; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005730 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005731 CRTCData[i]);
5732
5733 for (i = 11; i < 13; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005734 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005735 CRTCData[i]);
5736
5737 for (i = 13; i < 16; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02005738 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005739 CRTCData[i]);
5740
Aaro Koskinen8104e322011-03-13 12:26:22 +02005741 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005742 & 0xE0));
5743
Aaro Koskinen8104e322011-03-13 12:26:22 +02005744 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
5745 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
5746 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005747
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005748 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005749
5750 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005751 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
5752 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
5753 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005754 }
5755
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005756 mdelay(1);
5757
5758 XGI_WaitDisply(pVBInfo);
Aaro Koskinend8ad0a62011-03-13 12:26:18 +02005759 temp = inb(pVBInfo->P3c2);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005760
5761 if (temp & 0x10)
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005762 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005763 else
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005764 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005765
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005766 /* avoid display something, set BLACK DAC if not restore DAC */
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005767 outb(0x00, pVBInfo->P3c8);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005768
5769 for (i = 0; i < 256; i++) {
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02005770 outb(0, (pVBInfo->P3c8 + 1));
5771 outb(0, (pVBInfo->P3c8 + 1));
5772 outb(0, (pVBInfo->P3c8 + 1));
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005773 }
5774
Aaro Koskinen8104e322011-03-13 12:26:22 +02005775 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
5776 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
5777 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005778
Aaro Koskinen58839b02011-03-13 12:26:23 +02005779 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005780 pVBInfo->P3d4, 0x53) & 0xFD));
Aaro Koskinen8104e322011-03-13 12:26:22 +02005781 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005782}
5783
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005784static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
5785 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005786 struct vb_device_info *pVBInfo)
5787{
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02005788 unsigned short tempah;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005789
Peter Huewe6896b942012-02-09 21:11:46 +01005790 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5791 | VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005792 if (!(pVBInfo->SetFlag & DisableChA)) {
5793 if (pVBInfo->SetFlag & EnableChA) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005794 /* Power on */
5795 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinend3ae5762012-09-11 00:15:27 +03005796 } else if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5797 /* Power on */
5798 xgifb_reg_set(pVBInfo->Part1Port,
5799 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005800 }
5801 }
5802
5803 if (!(pVBInfo->SetFlag & DisableChB)) {
5804 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
5805 & (SetCRT2ToLCD | SetCRT2ToTV
5806 | SetCRT2ToRAMDAC))) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005807 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005808 pVBInfo->P3c4, 0x32);
5809 tempah &= 0xDF;
5810 if (pVBInfo->VBInfo & SetInSlaveMode) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005811 if (!(pVBInfo->VBInfo &
5812 SetCRT2ToRAMDAC))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005813 tempah |= 0x20;
5814 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02005815 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005816 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005817
Aaro Koskinen58839b02011-03-13 12:26:23 +02005818 tempah = (unsigned char) xgifb_reg_get(
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005819 pVBInfo->Part1Port, 0x2E);
5820
5821 if (!(tempah & 0x80))
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02005822 xgifb_reg_or(pVBInfo->Part1Port,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005823 0x2E, 0x80);
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005824 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005825 }
5826 }
5827
5828 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
5829 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02005830 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005831 0x20); /* shampoo 0129 */
Peter Huewe6896b942012-02-09 21:11:46 +01005832 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005833 if (!XGI_DisableChISLCD(pVBInfo)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005834 if (XGI_EnableChISLCD(pVBInfo) ||
5835 (pVBInfo->VBInfo &
Peter Huewea3d675c2012-02-09 21:11:47 +01005836 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005837 /* LVDS PLL power on */
Aaro Koskinendc505562011-03-13 12:26:26 +02005838 xgifb_reg_and(
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005839 pVBInfo->Part4Port,
5840 0x2A,
5841 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005842 }
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005843 /* LVDS Driver power on */
5844 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005845 }
5846 }
5847
5848 tempah = 0x00;
5849
5850 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5851 tempah = 0xc0;
5852
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005853 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
5854 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5855 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
5856 tempah = tempah & 0x40;
5857 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5858 tempah = tempah ^ 0xC0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005859
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005860 if (pVBInfo->SetFlag & DisableChB)
5861 tempah &= 0xBF;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005862
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005863 if (pVBInfo->SetFlag & DisableChA)
5864 tempah &= 0x7F;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005865
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005866 if (pVBInfo->SetFlag & EnableChB)
5867 tempah |= 0x40;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005868
Miguel Gómezb1bf9982012-07-06 12:40:51 +02005869 if (pVBInfo->SetFlag & EnableChA)
5870 tempah |= 0x80;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005871 }
5872 }
5873
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005874 /* EnablePart4_1F */
5875 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005876
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005877 if (!(pVBInfo->SetFlag & DisableChA)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005878 if (!(pVBInfo->SetFlag & GatingCRT)) {
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005879 XGI_DisableGatingCRT(HwDeviceExtension,
5880 pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005881 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
5882 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005883 }
5884 }
5885 } /* 301 */
5886 else { /* LVDS */
5887 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
Peter Huewea3d675c2012-02-09 21:11:47 +01005888 | XGI_SetCRT2ToLCDA))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005889 /* enable CRT2 */
5890 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005891
Aaro Koskinen58839b02011-03-13 12:26:23 +02005892 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005893 0x2E);
5894 if (!(tempah & 0x80))
Kenji Toyama1d7f6562011-04-23 19:36:49 +08005895 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005896
Aaro Koskinendc505562011-03-13 12:26:26 +02005897 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005898 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005899 } /* End of VB */
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005900}
5901
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005902static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
5903 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005904 unsigned short ModeNo, unsigned short ModeIdIndex,
5905 struct vb_device_info *pVBInfo)
5906{
Aaro Koskinena1579612012-04-07 01:14:05 +03005907 unsigned short RefreshRateTableIndex, temp;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005908
Aaro Koskinena1579612012-04-07 01:14:05 +03005909 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfb60d0c2012-04-07 01:14:04 +03005910 outb(pVBInfo->StandTable->MISC, pVBInfo->P3c2);
Aaro Koskinena1579612012-04-07 01:14:05 +03005911 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
5912 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
5913 XGI_SetGRCRegs(pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005914 XGI_ClearExt1Regs(pVBInfo);
5915
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005916 if (HwDeviceExtension->jChipType == XG27) {
5917 if (pVBInfo->IF_DEF_LVDS == 0)
5918 XGI_SetDefaultVCLK(pVBInfo);
5919 }
5920
5921 temp = ~ProgrammingCRT2;
5922 pVBInfo->SetFlag &= temp;
5923 pVBInfo->SelectCRT2Rate = 0;
5924
Peter Huewe6896b942012-02-09 21:11:46 +01005925 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5926 | VB_SIS302LV | VB_XGI301C)) {
Peter Huewea3d675c2012-02-09 21:11:47 +01005927 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005928 | SetInSlaveMode)) {
5929 pVBInfo->SetFlag |= ProgrammingCRT2;
5930 }
5931 }
5932
5933 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5934 ModeIdIndex, pVBInfo);
5935 if (RefreshRateTableIndex != 0xFFFF) {
5936 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
5937 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5938 pVBInfo, HwDeviceExtension);
5939 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
5940 RefreshRateTableIndex, pVBInfo);
5941 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5942 HwDeviceExtension, pVBInfo);
5943 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
5944 RefreshRateTableIndex, pVBInfo);
5945 }
5946
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005947 if (HwDeviceExtension->jChipType >= XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02005948 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005949 if (temp & 0xA0) {
5950
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005951 if (HwDeviceExtension->jChipType == XG27)
5952 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
5953 RefreshRateTableIndex, pVBInfo);
5954 else
5955 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
5956 RefreshRateTableIndex, pVBInfo);
5957
5958 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
5959 RefreshRateTableIndex);
5960
Aaro Koskinen105d8d02011-08-31 21:46:00 +03005961 xgifb_set_lcd(HwDeviceExtension->jChipType,
5962 pVBInfo, RefreshRateTableIndex, ModeNo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005963
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005964 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005965 xgifb_set_lvds(xgifb_info,
5966 HwDeviceExtension->jChipType,
Aaro Koskinen64db29f2011-08-31 21:46:01 +03005967 ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005968 }
5969 }
5970
5971 pVBInfo->SetFlag &= (~ProgrammingCRT2);
5972 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
5973 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
5974 RefreshRateTableIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005975 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005976}
5977
Aaro Koskinenfab04b92011-12-06 00:10:45 +02005978unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
5979 struct xgi_hw_device_info *HwDeviceExtension,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005980 unsigned short ModeNo)
5981{
5982 unsigned short ModeIdIndex;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005983 struct vb_device_info VBINF;
5984 struct vb_device_info *pVBInfo = &VBINF;
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04005985 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005986 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005987
Miguel Gómez949eb0a2012-07-06 12:40:36 +02005988 if (HwDeviceExtension->jChipType >= XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005989 pVBInfo->IF_DEF_YPbPr = 0;
5990 pVBInfo->IF_DEF_HiVision = 0;
5991 pVBInfo->IF_DEF_CRT2Monitor = 0;
5992 pVBInfo->VBType = 0; /*set VBType default 0*/
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005993 } else {
5994 pVBInfo->IF_DEF_YPbPr = 1;
5995 pVBInfo->IF_DEF_HiVision = 1;
Aaro Koskinen06587332011-03-13 12:26:10 +02005996 pVBInfo->IF_DEF_CRT2Monitor = 1;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02005997 }
5998
5999 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
6000 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
6001 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
6002 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
6003 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
6004 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
6005 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
6006 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
6007 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
6008 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
6009 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
6010 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
6011 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01006012 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
6013 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
6014 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
6015 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
6016 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006017
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006018 /* for x86 Linux, XG21 LVDS */
6019 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006020 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006021 pVBInfo->IF_DEF_LVDS = 1;
6022 }
6023 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02006024 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
6025 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006026 pVBInfo->IF_DEF_LVDS = 1;
6027 }
6028 }
6029
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006030 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006031 XGI_GetVBType(pVBInfo);
6032
6033 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
Aaro Koskinenef497f42011-11-27 23:03:21 +02006034 if (ModeNo & 0x80)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006035 ModeNo = ModeNo & 0x7F;
Aaro Koskinen8104e322011-03-13 12:26:22 +02006036 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006037
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006038 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006039 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6040
6041 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6042
Miguel Gómez949eb0a2012-07-06 12:40:36 +02006043 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006044 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6045 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6046 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006047 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006048
Peter Huewea3d675c2012-02-09 21:11:47 +01006049 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006050 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006051 ModeIdIndex, pVBInfo);
6052
Peter Huewea3d675c2012-02-09 21:11:47 +01006053 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006054 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6055 HwDeviceExtension, pVBInfo);
6056 }
Aaro Koskinend3ae5762012-09-11 00:15:27 +03006057 } else if (!(pVBInfo->VBInfo & SwitchCRT2)) {
6058 XGI_SetCRT1Group(xgifb_info,
6059 HwDeviceExtension, ModeNo,
6060 ModeIdIndex, pVBInfo);
6061 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6062 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6063 HwDeviceExtension,
6064 pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006065 }
6066 }
6067
Peter Huewe6896b942012-02-09 21:11:46 +01006068 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006069 switch (HwDeviceExtension->ujVBChipID) {
6070 case VB_CHIP_301:
6071 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6072 pVBInfo); /*add for CRT2 */
6073 break;
6074
6075 case VB_CHIP_302:
6076 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6077 pVBInfo); /*add for CRT2 */
6078 break;
6079
6080 default:
6081 break;
6082 }
6083 }
6084
6085 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6086 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006087 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006088 } /* !XG20 */
6089 else {
6090 if (pVBInfo->IF_DEF_LVDS == 1)
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006091 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
Kenji Toyama1d7f6562011-04-23 19:36:49 +08006092 ModeIdIndex,
6093 pVBInfo))
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006094 return 0;
6095
Aaro Koskinen34c13ee2012-04-07 01:14:01 +03006096 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
Peter Huewe6896b942012-02-09 21:11:46 +01006097 Ext_ModeFlag & ModeTypeMask;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006098
6099 pVBInfo->SetFlag = 0;
Aaro Koskinen83f76a92011-08-31 21:45:58 +03006100 pVBInfo->VBInfo = DisableCRT2Display;
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006101
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006102 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006103
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006104 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6105 ModeIdIndex, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006106
Aaro Koskinenfab04b92011-12-06 00:10:45 +02006107 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006108 }
6109
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006110 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6111
Miguel Gómez3bcc2462012-07-06 12:40:53 +02006112 if (HwDeviceExtension->jChipType < XG20)
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006113 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
Aaro Koskinencc1e2392011-03-13 12:26:07 +02006114
6115 return 1;
6116}