blob: fdb7d1a78b3b614d250238cf7da80c161d2cfd6e [file] [log] [blame]
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001#include <linux/delay.h>
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02002#include <linux/vmalloc.h>
Aaro Koskinen6048d7612011-10-11 21:47:16 +03003
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02005#include "vb_def.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006#include "vb_util.h"
7#include "vb_setmode.h"
Miguel Gómeze0541022012-06-18 13:12:05 +02008#include "vb_init.h"
Peter Huewed6461e42012-06-14 00:21:46 +02009static const unsigned short XGINew_DDRDRAM_TYPE340[4][2] = {
10 { 16, 0x45},
11 { 8, 0x35},
12 { 4, 0x31},
13 { 2, 0x21} };
Bill Pemberton82d6eb52010-06-17 13:10:46 -040014
Peter Huewed6461e42012-06-14 00:21:46 +020015static const unsigned short XGINew_DDRDRAM_TYPE20[12][2] = {
16 { 128, 0x5D},
17 { 64, 0x59},
18 { 64, 0x4D},
19 { 32, 0x55},
20 { 32, 0x49},
21 { 32, 0x3D},
22 { 16, 0x51},
23 { 16, 0x45},
24 { 16, 0x39},
25 { 8, 0x41},
26 { 8, 0x35},
27 { 4, 0x31} };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020028
Aaro Koskinen02a81dd2011-12-06 00:10:36 +020029#define XGIFB_ROM_SIZE 65536
30
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080031static unsigned char
32XGINew_GetXG20DRAMType(struct xgi_hw_device_info *HwDeviceExtension,
33 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020034{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053035 unsigned char data, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020036
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053037 if (HwDeviceExtension->jChipType < XG20) {
Peter Huewe6d12dae2012-06-14 00:21:52 +020038 data = xgifb_reg_get(pVBInfo->P3c4, 0x39) & 0x02;
39 if (data == 0)
40 data = (xgifb_reg_get(pVBInfo->P3c4, 0x3A) &
41 0x02) >> 1;
42 return data;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053043 } else if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen58839b02011-03-13 12:26:23 +020044 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080045 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
Dmitry Eremin-Solenikov64903112012-03-19 21:50:09 +040046 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053047 data = 0; /* DDR */
48 else
49 data = 1; /* DDRII */
50 return data;
51 } else if (HwDeviceExtension->jChipType == XG21) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080052 /* Independent GPIO control */
53 xgifb_reg_and(pVBInfo->P3d4, 0xB4, ~0x02);
Aaro Koskinenc45715b2011-03-13 12:26:15 +020054 udelay(800);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020055 xgifb_reg_or(pVBInfo->P3d4, 0x4A, 0x80); /* Enable GPIOH read */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080056 /* GPIOF 0:DVI 1:DVO */
57 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053058 /* HOTPLUG_SUPPORT */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080059 /* for current XG20 & XG21, GPIOH is floating, driver will
60 * fix DDR temporarily */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053061 if (temp & 0x01) /* DVI read GPIOH */
62 data = 1; /* DDRII */
63 else
64 data = 0; /* DDR */
65 /* ~HOTPLUG_SUPPORT */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020066 xgifb_reg_or(pVBInfo->P3d4, 0xB4, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053067 return data;
68 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +020069 data = xgifb_reg_get(pVBInfo->P3d4, 0x97) & 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020070
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053071 if (data == 1)
72 data++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020073
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053074 return data;
75 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020076}
77
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080078static void XGINew_DDR1x_MRS_340(unsigned long P3c4,
79 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020080{
Aaro Koskinen8104e322011-03-13 12:26:22 +020081 xgifb_reg_set(P3c4, 0x18, 0x01);
82 xgifb_reg_set(P3c4, 0x19, 0x20);
83 xgifb_reg_set(P3c4, 0x16, 0x00);
84 xgifb_reg_set(P3c4, 0x16, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020085
Peter Huewe6d12dae2012-06-14 00:21:52 +020086 mdelay(3);
87 xgifb_reg_set(P3c4, 0x18, 0x00);
88 xgifb_reg_set(P3c4, 0x19, 0x20);
89 xgifb_reg_set(P3c4, 0x16, 0x00);
90 xgifb_reg_set(P3c4, 0x16, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020091
Aaro Koskinenc45715b2011-03-13 12:26:15 +020092 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +030093 xgifb_reg_set(P3c4,
94 0x18,
95 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +020096 xgifb_reg_set(P3c4, 0x19, 0x01);
97 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[0]);
98 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[1]);
Aaro Koskinenc83c6202011-03-13 12:26:14 +020099 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200100 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200101 udelay(500);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300102 xgifb_reg_set(P3c4,
103 0x18,
104 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200105 xgifb_reg_set(P3c4, 0x19, 0x00);
106 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[2]);
107 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[3]);
108 xgifb_reg_set(P3c4, 0x1B, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200109}
110
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200111static void XGINew_SetMemoryClock(struct xgi_hw_device_info *HwDeviceExtension,
112 struct vb_device_info *pVBInfo)
113{
114
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800115 xgifb_reg_set(pVBInfo->P3c4,
116 0x28,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300117 pVBInfo->MCLKData[pVBInfo->ram_type].SR28);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800118 xgifb_reg_set(pVBInfo->P3c4,
119 0x29,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300120 pVBInfo->MCLKData[pVBInfo->ram_type].SR29);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800121 xgifb_reg_set(pVBInfo->P3c4,
122 0x2A,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300123 pVBInfo->MCLKData[pVBInfo->ram_type].SR2A);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200124
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800125 xgifb_reg_set(pVBInfo->P3c4,
126 0x2E,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300127 pVBInfo->ECLKData[pVBInfo->ram_type].SR2E);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800128 xgifb_reg_set(pVBInfo->P3c4,
129 0x2F,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300130 pVBInfo->ECLKData[pVBInfo->ram_type].SR2F);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800131 xgifb_reg_set(pVBInfo->P3c4,
132 0x30,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300133 pVBInfo->ECLKData[pVBInfo->ram_type].SR30);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200134
Miguel Gómez949eb0a2012-07-06 12:40:36 +0200135 /* When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
136 /* Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz,
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800137 * Set SR32 D[1:0] = 10b */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200138 if (HwDeviceExtension->jChipType == XG42) {
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300139 if ((pVBInfo->MCLKData[pVBInfo->ram_type].SR28 == 0x1C) &&
140 (pVBInfo->MCLKData[pVBInfo->ram_type].SR29 == 0x01) &&
141 (((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x1C) &&
142 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01)) ||
143 ((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x22) &&
144 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01))))
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800145 xgifb_reg_set(pVBInfo->P3c4,
146 0x32,
147 ((unsigned char) xgifb_reg_get(
148 pVBInfo->P3c4, 0x32) & 0xFC) | 0x02);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200149 }
150}
151
Randy Dunlap89229672010-08-10 08:46:44 -0700152static void XGINew_DDRII_Bootup_XG27(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530153 struct xgi_hw_device_info *HwDeviceExtension,
154 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200155{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530156 unsigned long P3d4 = P3c4 + 0x10;
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300157 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530158 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200159
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530160 /* Set Double Frequency */
Peter Huewe6d12dae2012-06-14 00:21:52 +0200161 xgifb_reg_set(P3d4, 0x97, pVBInfo->XGINew_CR97); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200162
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200163 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200164
Aaro Koskinen8104e322011-03-13 12:26:22 +0200165 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS2 */
166 xgifb_reg_set(P3c4, 0x19, 0x80); /* Set SR19 */
167 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200168 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200169 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200170 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200171
Aaro Koskinen8104e322011-03-13 12:26:22 +0200172 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS3 */
173 xgifb_reg_set(P3c4, 0x19, 0xC0); /* Set SR19 */
174 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200175 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200176 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200177 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200178
Aaro Koskinen8104e322011-03-13 12:26:22 +0200179 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS1 */
180 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
181 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200182 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200183 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200184 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200185
Aaro Koskinen8104e322011-03-13 12:26:22 +0200186 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Enable */
187 xgifb_reg_set(P3c4, 0x19, 0x0A); /* Set SR19 */
188 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200189 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200190 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
191 xgifb_reg_set(P3c4, 0x16, 0x80); /* Set SR16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200192
Aaro Koskinen8104e322011-03-13 12:26:22 +0200193 xgifb_reg_set(P3c4, 0x1B, 0x04); /* Set SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200194 udelay(60);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200195 xgifb_reg_set(P3c4, 0x1B, 0x00); /* Set SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200196
Aaro Koskinen8104e322011-03-13 12:26:22 +0200197 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Reset */
198 xgifb_reg_set(P3c4, 0x19, 0x08); /* Set SR19 */
199 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200200
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200201 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200202 xgifb_reg_set(P3c4, 0x16, 0x83); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200203 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200204
Aaro Koskinen8104e322011-03-13 12:26:22 +0200205 xgifb_reg_set(P3c4, 0x18, 0x80); /* Set SR18 */ /* MRS, ODT */
206 xgifb_reg_set(P3c4, 0x19, 0x46); /* Set SR19 */
207 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200208 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200209 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200210 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200211
Aaro Koskinen8104e322011-03-13 12:26:22 +0200212 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS */
213 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
214 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200215 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200216 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200217 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200218
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800219 /* Set SR1B refresh control 000:close; 010:open */
220 xgifb_reg_set(P3c4, 0x1B, 0x04);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200221 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200222
223}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530224
Randy Dunlap89229672010-08-10 08:46:44 -0700225static void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530226 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200227{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530228 unsigned long P3d4 = P3c4 + 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200229
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300230 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530231 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200232
Aaro Koskinen8104e322011-03-13 12:26:22 +0200233 xgifb_reg_set(P3d4, 0x97, 0x11); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200234
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200235 udelay(200);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200236 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS2 */
237 xgifb_reg_set(P3c4, 0x19, 0x80);
238 xgifb_reg_set(P3c4, 0x16, 0x05);
239 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Aaro Koskinen8104e322011-03-13 12:26:22 +0200241 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS3 */
242 xgifb_reg_set(P3c4, 0x19, 0xC0);
243 xgifb_reg_set(P3c4, 0x16, 0x05);
244 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200245
Aaro Koskinen8104e322011-03-13 12:26:22 +0200246 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS1 */
247 xgifb_reg_set(P3c4, 0x19, 0x40);
248 xgifb_reg_set(P3c4, 0x16, 0x05);
249 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200250
Aaro Koskinen8104e322011-03-13 12:26:22 +0200251 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
252 xgifb_reg_set(P3c4, 0x19, 0x02);
253 xgifb_reg_set(P3c4, 0x16, 0x05);
254 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200255
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200256 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200257 xgifb_reg_set(P3c4, 0x1B, 0x04); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200258 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200259 xgifb_reg_set(P3c4, 0x1B, 0x00); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200260 udelay(100);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200261
Aaro Koskinen8104e322011-03-13 12:26:22 +0200262 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
263 xgifb_reg_set(P3c4, 0x19, 0x00);
264 xgifb_reg_set(P3c4, 0x16, 0x05);
265 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200266
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200267 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200268}
269
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800270static void XGINew_DDR1x_MRS_XG20(unsigned long P3c4,
271 struct vb_device_info *pVBInfo)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200272{
Aaro Koskinen8104e322011-03-13 12:26:22 +0200273 xgifb_reg_set(P3c4, 0x18, 0x01);
274 xgifb_reg_set(P3c4, 0x19, 0x40);
275 xgifb_reg_set(P3c4, 0x16, 0x00);
276 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200277 udelay(60);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200278
Aaro Koskinen8104e322011-03-13 12:26:22 +0200279 xgifb_reg_set(P3c4, 0x18, 0x00);
280 xgifb_reg_set(P3c4, 0x19, 0x40);
281 xgifb_reg_set(P3c4, 0x16, 0x00);
282 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200283 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300284 xgifb_reg_set(P3c4,
285 0x18,
286 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200287 xgifb_reg_set(P3c4, 0x19, 0x01);
288 xgifb_reg_set(P3c4, 0x16, 0x03);
289 xgifb_reg_set(P3c4, 0x16, 0x83);
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200290 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200291 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200292 udelay(500);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300293 xgifb_reg_set(P3c4,
294 0x18,
295 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200296 xgifb_reg_set(P3c4, 0x19, 0x00);
297 xgifb_reg_set(P3c4, 0x16, 0x03);
298 xgifb_reg_set(P3c4, 0x16, 0x83);
299 xgifb_reg_set(P3c4, 0x1B, 0x00);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200300}
301
Randy Dunlap89229672010-08-10 08:46:44 -0700302static void XGINew_DDR1x_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530303 struct xgi_hw_device_info *HwDeviceExtension,
304 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200305{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530306 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200307
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530308 if (HwDeviceExtension->jChipType >= XG20) {
309 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800310 xgifb_reg_set(P3d4,
311 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300312 pVBInfo->CR40[11][pVBInfo->ram_type]); /* CR82 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800313 xgifb_reg_set(P3d4,
314 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300315 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800316 xgifb_reg_set(P3d4,
317 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300318 pVBInfo->CR40[13][pVBInfo->ram_type]); /* CR86 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200319
Aaro Koskinen8104e322011-03-13 12:26:22 +0200320 xgifb_reg_set(P3d4, 0x98, 0x01);
321 xgifb_reg_set(P3d4, 0x9A, 0x02);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200322
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530323 XGINew_DDR1x_MRS_XG20(P3c4, pVBInfo);
324 } else {
325 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200326
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530327 switch (HwDeviceExtension->jChipType) {
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530328 case XG42:
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800329 /* CR82 */
330 xgifb_reg_set(P3d4,
331 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300332 pVBInfo->CR40[11][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800333 /* CR85 */
334 xgifb_reg_set(P3d4,
335 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300336 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800337 /* CR86 */
338 xgifb_reg_set(P3d4,
339 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300340 pVBInfo->CR40[13][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530341 break;
342 default:
Aaro Koskinen8104e322011-03-13 12:26:22 +0200343 xgifb_reg_set(P3d4, 0x82, 0x88);
344 xgifb_reg_set(P3d4, 0x86, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800345 /* Insert read command for delay */
346 xgifb_reg_get(P3d4, 0x86);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200347 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200348 xgifb_reg_get(P3d4, 0x86);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800349 xgifb_reg_set(P3d4,
350 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300351 pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200352 xgifb_reg_set(P3d4, 0x82, 0x77);
353 xgifb_reg_set(P3d4, 0x85, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800354
355 /* Insert read command for delay */
356 xgifb_reg_get(P3d4, 0x85);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200357 xgifb_reg_set(P3d4, 0x85, 0x88);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800358
359 /* Insert read command for delay */
360 xgifb_reg_get(P3d4, 0x85);
361 /* CR85 */
362 xgifb_reg_set(P3d4,
363 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300364 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800365 /* CR82 */
366 xgifb_reg_set(P3d4,
367 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300368 pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530369 break;
370 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200371
Aaro Koskinen8104e322011-03-13 12:26:22 +0200372 xgifb_reg_set(P3d4, 0x97, 0x00);
373 xgifb_reg_set(P3d4, 0x98, 0x01);
374 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530375 XGINew_DDR1x_MRS_340(P3c4, pVBInfo);
376 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200377}
378
Randy Dunlap89229672010-08-10 08:46:44 -0700379static void XGINew_DDR2_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530380 struct xgi_hw_device_info *HwDeviceExtension,
381 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200382{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530383 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200384
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800385 /* keep following setting sequence, each setting in
386 * the same reg insert idle */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200387 xgifb_reg_set(P3d4, 0x82, 0x77);
388 xgifb_reg_set(P3d4, 0x86, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200389 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200390 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200391 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800392 /* CR86 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300393 xgifb_reg_set(P3d4, 0x86, pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200394 xgifb_reg_set(P3d4, 0x82, 0x77);
395 xgifb_reg_set(P3d4, 0x85, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200396 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200397 xgifb_reg_set(P3d4, 0x85, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200398 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300399 xgifb_reg_set(P3d4,
400 0x85,
401 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530402 if (HwDeviceExtension->jChipType == XG27)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800403 /* CR82 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300404 xgifb_reg_set(P3d4, 0x82, pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530405 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200406 xgifb_reg_set(P3d4, 0x82, 0xA8); /* CR82 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200407
Aaro Koskinen8104e322011-03-13 12:26:22 +0200408 xgifb_reg_set(P3d4, 0x98, 0x01);
409 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530410 if (HwDeviceExtension->jChipType == XG27)
411 XGINew_DDRII_Bootup_XG27(HwDeviceExtension, P3c4, pVBInfo);
412 else
413 XGINew_DDR2_MRS_XG20(HwDeviceExtension, P3c4, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200414}
415
Aaro Koskinene0cc8a62011-03-08 22:16:20 +0200416static void XGINew_SetDRAMDefaultRegister340(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530417 struct xgi_hw_device_info *HwDeviceExtension,
418 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200419{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530420 unsigned char temp, temp1, temp2, temp3, i, j, k;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200421
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530422 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200423
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300424 xgifb_reg_set(P3d4, 0x6D, pVBInfo->CR40[8][pVBInfo->ram_type]);
425 xgifb_reg_set(P3d4, 0x68, pVBInfo->CR40[5][pVBInfo->ram_type]);
426 xgifb_reg_set(P3d4, 0x69, pVBInfo->CR40[6][pVBInfo->ram_type]);
427 xgifb_reg_set(P3d4, 0x6A, pVBInfo->CR40[7][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200428
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530429 temp2 = 0;
430 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800431 /* CR6B DQS fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300432 temp = pVBInfo->CR6B[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530433 for (j = 0; j < 4; j++) {
434 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
435 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200436 xgifb_reg_set(P3d4, 0x6B, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800437 /* Insert read command for delay */
438 xgifb_reg_get(P3d4, 0x6B);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530439 temp2 &= 0xF0;
440 temp2 += 0x10;
441 }
442 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200443
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530444 temp2 = 0;
445 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800446 /* CR6E DQM fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300447 temp = pVBInfo->CR6E[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530448 for (j = 0; j < 4; j++) {
449 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
450 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200451 xgifb_reg_set(P3d4, 0x6E, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800452 /* Insert read command for delay */
453 xgifb_reg_get(P3d4, 0x6E);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530454 temp2 &= 0xF0;
455 temp2 += 0x10;
456 }
457 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200458
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530459 temp3 = 0;
460 for (k = 0; k < 4; k++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800461 /* CR6E_D[1:0] select channel */
462 xgifb_reg_and_or(P3d4, 0x6E, 0xFC, temp3);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530463 temp2 = 0;
464 for (i = 0; i < 8; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800465 /* CR6F DQ fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300466 temp = pVBInfo->CR6F[pVBInfo->ram_type][8 * k + i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530467 for (j = 0; j < 4; j++) {
468 temp1 = (temp >> (2 * j)) & 0x03;
469 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200470 xgifb_reg_set(P3d4, 0x6F, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800471 /* Insert read command for delay */
472 xgifb_reg_get(P3d4, 0x6F);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530473 temp2 &= 0xF8;
474 temp2 += 0x08;
475 }
476 }
477 temp3 += 0x01;
478 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200479
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300480 xgifb_reg_set(P3d4,
481 0x80,
482 pVBInfo->CR40[9][pVBInfo->ram_type]); /* CR80 */
483 xgifb_reg_set(P3d4,
484 0x81,
485 pVBInfo->CR40[10][pVBInfo->ram_type]); /* CR81 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200486
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530487 temp2 = 0x80;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800488 /* CR89 terminator type select */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300489 temp = pVBInfo->CR89[pVBInfo->ram_type][0];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530490 for (j = 0; j < 4; j++) {
491 temp1 = (temp >> (2 * j)) & 0x03;
492 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200493 xgifb_reg_set(P3d4, 0x89, temp2);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200494 xgifb_reg_get(P3d4, 0x89); /* Insert read command for delay */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530495 temp2 &= 0xF0;
496 temp2 += 0x10;
497 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200498
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300499 temp = pVBInfo->CR89[pVBInfo->ram_type][1];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530500 temp1 = temp & 0x03;
501 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200502 xgifb_reg_set(P3d4, 0x89, temp2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200503
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300504 temp = pVBInfo->CR40[3][pVBInfo->ram_type];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530505 temp1 = temp & 0x0F;
506 temp2 = (temp >> 4) & 0x07;
507 temp3 = temp & 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200508 xgifb_reg_set(P3d4, 0x45, temp1); /* CR45 */
509 xgifb_reg_set(P3d4, 0x99, temp2); /* CR99 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200510 xgifb_reg_or(P3d4, 0x40, temp3); /* CR40_D[7] */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300511 xgifb_reg_set(P3d4,
512 0x41,
513 pVBInfo->CR40[0][pVBInfo->ram_type]); /* CR41 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200514
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530515 if (HwDeviceExtension->jChipType == XG27)
Peter Huewe6d12dae2012-06-14 00:21:52 +0200516 xgifb_reg_set(P3d4, 0x8F, XG27_CR8F); /* CR8F */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200517
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800518 for (j = 0; j <= 6; j++) /* CR90 - CR96 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200519 xgifb_reg_set(P3d4, (0x90 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300520 pVBInfo->CR40[14 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200521
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800522 for (j = 0; j <= 2; j++) /* CRC3 - CRC5 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200523 xgifb_reg_set(P3d4, (0xC3 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300524 pVBInfo->CR40[21 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200525
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800526 for (j = 0; j < 2; j++) /* CR8A - CR8B */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200527 xgifb_reg_set(P3d4, (0x8A + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300528 pVBInfo->CR40[1 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200529
Aaro Koskinen18408da2012-04-07 01:13:51 +0300530 if (HwDeviceExtension->jChipType == XG42)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200531 xgifb_reg_set(P3d4, 0x8C, 0x87);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200532
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300533 xgifb_reg_set(P3d4,
534 0x59,
535 pVBInfo->CR40[4][pVBInfo->ram_type]); /* CR59 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200536
Aaro Koskinen8104e322011-03-13 12:26:22 +0200537 xgifb_reg_set(P3d4, 0x83, 0x09); /* CR83 */
538 xgifb_reg_set(P3d4, 0x87, 0x00); /* CR87 */
Peter Huewe6d12dae2012-06-14 00:21:52 +0200539 xgifb_reg_set(P3d4, 0xCF, XG40_CRCF); /* CRCF */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300540 if (pVBInfo->ram_type) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200541 xgifb_reg_set(P3c4, 0x17, 0x80); /* SR17 DDRII */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530542 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200543 xgifb_reg_set(P3c4, 0x17, 0x02); /* SR17 DDRII */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200544
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530545 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200546 xgifb_reg_set(P3c4, 0x17, 0x00); /* SR17 DDR */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530547 }
Aaro Koskinen8104e322011-03-13 12:26:22 +0200548 xgifb_reg_set(P3c4, 0x1A, 0x87); /* SR1A */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200549
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530550 temp = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
551 if (temp == 0) {
552 XGINew_DDR1x_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
553 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200554 xgifb_reg_set(P3d4, 0xB0, 0x80); /* DDRII Dual frequency mode */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530555 XGINew_DDR2_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
556 }
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300557 xgifb_reg_set(P3c4,
558 0x1B,
559 pVBInfo->SR15[3][pVBInfo->ram_type]); /* SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200560}
561
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200562
Peter Huewed6461e42012-06-14 00:21:46 +0200563static unsigned short XGINew_SetDRAMSize20Reg(
564 unsigned short dram_size,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530565 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530567 unsigned short data = 0, memsize = 0;
568 int RankSize;
569 unsigned char ChannelNo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200570
Peter Huewed6461e42012-06-14 00:21:46 +0200571 RankSize = dram_size * pVBInfo->ram_bus / 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200572 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530573 data &= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200574
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530575 if (data == 0x80)
576 RankSize *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200577
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530578 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200579
Aaro Koskinenee055a42011-10-11 21:47:32 +0300580 if (pVBInfo->ram_channel == 3)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530581 ChannelNo = 4;
582 else
Aaro Koskinenee055a42011-10-11 21:47:32 +0300583 ChannelNo = pVBInfo->ram_channel;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200584
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530585 if (ChannelNo * RankSize <= 256) {
586 while ((RankSize >>= 1) > 0)
587 data += 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200588
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530589 memsize = data >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200590
Miguel Gómez949eb0a2012-07-06 12:40:36 +0200591 /* Fix DRAM Sizing Error */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800592 xgifb_reg_set(pVBInfo->P3c4,
593 0x14,
594 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
595 (data & 0xF0));
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200596 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530597 }
598 return memsize;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200599}
600
Randy Dunlap89229672010-08-10 08:46:44 -0700601static int XGINew_ReadWriteRest(unsigned short StopAddr,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530602 unsigned short StartAddr, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200603{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530604 int i;
605 unsigned long Position = 0;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300606 void __iomem *fbaddr = pVBInfo->FBAddr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200607
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300608 writel(Position, fbaddr + Position);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200609
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530610 for (i = StartAddr; i <= StopAddr; i++) {
611 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300612 writel(Position, fbaddr + Position);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530613 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200614
Miguel Gómez949eb0a2012-07-06 12:40:36 +0200615 udelay(500); /* Fix #1759 Memory Size error in Multi-Adapter. */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200616
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530617 Position = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200618
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300619 if (readl(fbaddr + Position) != Position)
Bill Pembertonfc3678a2010-06-17 13:10:44 -0400620 return 0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530621
622 for (i = StartAddr; i <= StopAddr; i++) {
623 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300624 if (readl(fbaddr + Position) != Position)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530625 return 0;
626 }
627 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200628}
629
Randy Dunlap89229672010-08-10 08:46:44 -0700630static unsigned char XGINew_CheckFrequence(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200631{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530632 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200633
Aaro Koskinen58839b02011-03-13 12:26:23 +0200634 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200635
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530636 if ((data & 0x10) == 0) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200637 data = xgifb_reg_get(pVBInfo->P3c4, 0x39);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530638 data = (data & 0x02) >> 1;
639 return data;
640 } else {
641 return data & 0x01;
642 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200643}
644
Randy Dunlap89229672010-08-10 08:46:44 -0700645static void XGINew_CheckChannel(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530646 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200647{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530648 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200649
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530650 switch (HwDeviceExtension->jChipType) {
651 case XG20:
652 case XG21:
Aaro Koskinen58839b02011-03-13 12:26:23 +0200653 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530654 data = data & 0x01;
Aaro Koskinenee055a42011-10-11 21:47:32 +0300655 pVBInfo->ram_channel = 1; /* XG20 "JUST" one channel */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200656
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530657 if (data == 0) { /* Single_32_16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200658
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530659 if ((HwDeviceExtension->ulVideoMemorySize - 1)
660 > 0x1000000) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200661
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300662 pVBInfo->ram_bus = 32; /* 32 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800663 /* 22bit + 2 rank + 32bit */
664 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200665 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200666 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200667
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530668 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
669 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200670
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800671 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
672 0x800000) {
673 /* 22bit + 1 rank + 32bit */
674 xgifb_reg_set(pVBInfo->P3c4,
675 0x13,
676 0x31);
677 xgifb_reg_set(pVBInfo->P3c4,
678 0x14,
679 0x42);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200680 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200681
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800682 if (XGINew_ReadWriteRest(23,
683 23,
684 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530685 return;
686 }
687 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200688
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800689 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
690 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300691 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800692 /* 22bit + 2 rank + 16bit */
693 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200694 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200695 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200696
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530697 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
698 return;
699 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800700 xgifb_reg_set(pVBInfo->P3c4,
701 0x13,
702 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200703 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530704 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200705
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530706 } else { /* Dual_16_8 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800707 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
708 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300709 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800710 /* (0x31:12x8x2) 22bit + 2 rank */
711 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
712 /* 0x41:16Mx16 bit*/
713 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200714 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200715
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530716 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
717 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200718
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800719 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
720 0x400000) {
721 /* (0x31:12x8x2) 22bit + 1 rank */
722 xgifb_reg_set(pVBInfo->P3c4,
723 0x13,
724 0x31);
725 /* 0x31:8Mx16 bit*/
726 xgifb_reg_set(pVBInfo->P3c4,
727 0x14,
728 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200729 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200730
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800731 if (XGINew_ReadWriteRest(22,
732 22,
733 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530734 return;
735 }
736 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200737
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800738 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
739 0x400000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300740 pVBInfo->ram_bus = 8; /* 8 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800741 /* (0x31:12x8x2) 22bit + 2 rank */
742 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
743 /* 0x30:8Mx8 bit*/
744 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200745 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200746
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530747 if (XGINew_ReadWriteRest(22, 21, pVBInfo) == 1)
748 return;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800749 else /* (0x31:12x8x2) 22bit + 1 rank */
750 xgifb_reg_set(pVBInfo->P3c4,
751 0x13,
752 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200753 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530754 }
755 }
756 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200757
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530758 case XG27:
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300759 pVBInfo->ram_bus = 16; /* 16 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300760 pVBInfo->ram_channel = 1; /* Single channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200761 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x51); /* 32Mx16 bit*/
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530762 break;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530763 case XG42:
764 /*
765 XG42 SR14 D[3] Reserve
766 D[2] = 1, Dual Channel
767 = 0, Single Channel
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200768
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530769 It's Different from Other XG40 Series.
770 */
771 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII, DDR2x */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300772 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300773 pVBInfo->ram_channel = 2; /* 2 Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200774 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
775 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x44);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200776
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530777 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
778 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200779
Aaro Koskinen8104e322011-03-13 12:26:22 +0200780 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
781 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x34);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530782 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
783 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200784
Aaro Koskinenee055a42011-10-11 21:47:32 +0300785 pVBInfo->ram_channel = 1; /* Single Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200786 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
787 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200788
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530789 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
790 return;
791 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200792 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
793 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530794 }
795 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300796 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300797 pVBInfo->ram_channel = 1; /* 1 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200798 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
799 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200800
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530801 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
802 return;
803 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200804 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
805 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530806 }
807 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200808
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530809 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200810
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530811 default: /* XG40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200812
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530813 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300814 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300815 pVBInfo->ram_channel = 3;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200816 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
817 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200818
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530819 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
820 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200821
Aaro Koskinenee055a42011-10-11 21:47:32 +0300822 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200823 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200824
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530825 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
826 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200827
Aaro Koskinen8104e322011-03-13 12:26:22 +0200828 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
829 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200830
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530831 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1) {
Aaro Koskinenee055a42011-10-11 21:47:32 +0300832 pVBInfo->ram_channel = 3; /* 4 channels */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530833 } else {
Aaro Koskinenee055a42011-10-11 21:47:32 +0300834 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200835 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530836 }
837 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300838 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300839 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200840 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
841 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200842
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530843 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1) {
844 return;
845 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200846 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
847 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530848 }
849 }
850 break;
851 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200852}
853
Aaro Koskinene0cc8a62011-03-08 22:16:20 +0200854static int XGINew_DDRSizing340(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530855 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200856{
Peter Huewe672f5ee2012-06-14 00:21:44 +0200857 u8 i, size;
858 unsigned short memsize, start_addr;
Peter Huewed6461e42012-06-14 00:21:46 +0200859 const unsigned short (*dram_table)[2];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200860
Aaro Koskinen8104e322011-03-13 12:26:22 +0200861 xgifb_reg_set(pVBInfo->P3c4, 0x15, 0x00); /* noninterleaving */
862 xgifb_reg_set(pVBInfo->P3c4, 0x1C, 0x00); /* nontiling */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530863 XGINew_CheckChannel(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200864
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530865 if (HwDeviceExtension->jChipType >= XG20) {
Peter Huewe672f5ee2012-06-14 00:21:44 +0200866 dram_table = XGINew_DDRDRAM_TYPE20;
867 size = ARRAY_SIZE(XGINew_DDRDRAM_TYPE20);
868 start_addr = 5;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530869 } else {
Peter Huewe672f5ee2012-06-14 00:21:44 +0200870 dram_table = XGINew_DDRDRAM_TYPE340;
871 size = ARRAY_SIZE(XGINew_DDRDRAM_TYPE340);
872 start_addr = 9;
873 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200874
Peter Huewe672f5ee2012-06-14 00:21:44 +0200875 for (i = 0; i < size; i++) {
Peter Huewe4e55d0b2012-06-14 00:21:45 +0200876 /* SetDRAMSizingType */
Peter Huewed6461e42012-06-14 00:21:46 +0200877 xgifb_reg_and_or(pVBInfo->P3c4, 0x13, 0x80, dram_table[i][1]);
Peter Huewe4e55d0b2012-06-14 00:21:45 +0200878 udelay(15); /* should delay 50 ns */
879
Peter Huewed6461e42012-06-14 00:21:46 +0200880 memsize = XGINew_SetDRAMSize20Reg(dram_table[i][0], pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200881
Peter Huewe672f5ee2012-06-14 00:21:44 +0200882 if (memsize == 0)
883 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200884
Peter Huewe672f5ee2012-06-14 00:21:44 +0200885 memsize += (pVBInfo->ram_channel - 2) + 20;
886 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
887 (unsigned long) (1 << memsize))
888 continue;
889
890 if (XGINew_ReadWriteRest(memsize, start_addr, pVBInfo) == 1)
891 return 1;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530892 }
893 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200894}
895
Aaro Koskinenfab04b92011-12-06 00:10:45 +0200896static void XGINew_SetDRAMSize_340(struct xgifb_video_info *xgifb_info,
897 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530898 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200899{
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200900 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200901
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200902 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200903
Aaro Koskinenfab04b92011-12-06 00:10:45 +0200904 XGISetModeNew(xgifb_info, HwDeviceExtension, 0x2e);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200905
Aaro Koskinen58839b02011-03-13 12:26:23 +0200906 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800907 /* disable read cache */
908 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data & 0xDF));
Aaro Koskinenfab04b92011-12-06 00:10:45 +0200909 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200910
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200911 XGINew_DDRSizing340(HwDeviceExtension, pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200912 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800913 /* enable read cache */
914 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data | 0x20));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200915}
916
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200917static u8 *xgifb_copy_rom(struct pci_dev *dev, size_t *rom_size)
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200918{
919 void __iomem *rom_address;
Aaro Koskinen82986dd2011-12-06 00:10:39 +0200920 u8 *rom_copy;
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200921
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200922 rom_address = pci_map_rom(dev, rom_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200923 if (rom_address == NULL)
924 return NULL;
925
926 rom_copy = vzalloc(XGIFB_ROM_SIZE);
927 if (rom_copy == NULL)
928 goto done;
929
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200930 *rom_size = min_t(size_t, *rom_size, XGIFB_ROM_SIZE);
931 memcpy_fromio(rom_copy, rom_address, *rom_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200932
933done:
934 pci_unmap_rom(dev, rom_address);
935 return rom_copy;
936}
937
Aaro Koskinen4e6f4032011-12-06 00:10:42 +0200938static void xgifb_read_vbios(struct pci_dev *pdev,
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800939 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200940{
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200941 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
Aaro Koskinen82986dd2011-12-06 00:10:39 +0200942 u8 *vbios;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530943 unsigned long i;
Aaro Koskinend1805b32011-12-06 00:10:41 +0200944 unsigned char j;
Aaro Koskinen97f45322011-12-06 00:10:34 +0200945 struct XGI21_LVDSCapStruct *lvds;
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200946 size_t vbios_size;
Aaro Koskinend1805b32011-12-06 00:10:41 +0200947 int entry;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200948
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200949 if (xgifb_info->chip != XG21)
Aaro Koskinenbd761272011-12-06 00:10:31 +0200950 return;
951 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200952 vbios = xgifb_copy_rom(pdev, &vbios_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200953 if (vbios == NULL) {
Miguel Gómezbe25aef2012-07-06 12:40:40 +0200954 dev_err(&pdev->dev, "Video BIOS not available\n");
Aaro Koskinenbd761272011-12-06 00:10:31 +0200955 return;
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200956 }
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200957 if (vbios_size <= 0x65)
958 goto error;
Aaro Koskinen25aa75f2011-12-06 00:10:48 +0200959 /*
960 * The user can ignore the LVDS bit in the BIOS and force the display
961 * type.
962 */
963 if (!(vbios[0x65] & 0x1) &&
964 (!xgifb_info->display2_force ||
965 xgifb_info->display2 != XGIFB_DISP_LCD)) {
Aaro Koskinen02a81dd2011-12-06 00:10:36 +0200966 vfree(vbios);
967 return;
968 }
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200969 if (vbios_size <= 0x317)
970 goto error;
Aaro Koskinen4b21d992011-12-06 00:10:33 +0200971 i = vbios[0x316] | (vbios[0x317] << 8);
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200972 if (vbios_size <= i - 1)
973 goto error;
Aaro Koskinen4b21d992011-12-06 00:10:33 +0200974 j = vbios[i - 1];
Aaro Koskinen08ce2392011-12-06 00:10:40 +0200975 if (j == 0)
976 goto error;
Aaro Koskinenbd761272011-12-06 00:10:31 +0200977 if (j == 0xff)
978 j = 1;
Aaro Koskinend1805b32011-12-06 00:10:41 +0200979 /*
980 * Read the LVDS table index scratch register set by the BIOS.
981 */
982 entry = xgifb_reg_get(xgifb_info->dev_info.P3d4, 0x36);
983 if (entry >= j)
984 entry = 0;
985 i += entry * 25;
Aaro Koskinenfab04b92011-12-06 00:10:45 +0200986 lvds = &xgifb_info->lvds_data;
Aaro Koskinend1805b32011-12-06 00:10:41 +0200987 if (vbios_size <= i + 24)
988 goto error;
989 lvds->LVDS_Capability = vbios[i] | (vbios[i + 1] << 8);
990 lvds->LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
991 lvds->LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
992 lvds->LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
993 lvds->LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
994 lvds->LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
995 lvds->LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
996 lvds->LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
997 lvds->LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
998 lvds->VCLKData1 = vbios[i + 18];
999 lvds->VCLKData2 = vbios[i + 19];
1000 lvds->PSC_S1 = vbios[i + 20];
1001 lvds->PSC_S2 = vbios[i + 21];
1002 lvds->PSC_S3 = vbios[i + 22];
1003 lvds->PSC_S4 = vbios[i + 23];
1004 lvds->PSC_S5 = vbios[i + 24];
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001005 vfree(vbios);
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001006 pVBInfo->IF_DEF_LVDS = 1;
1007 return;
1008error:
Miguel Gómezbe25aef2012-07-06 12:40:40 +02001009 dev_err(&pdev->dev, "Video BIOS corrupted\n");
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001010 vfree(vbios);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001011}
1012
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001013static void XGINew_ChkSenseStatus(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301014 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001015{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301016 unsigned short tempbx = 0, temp, tempcx, CR3CData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001017
Aaro Koskinen58839b02011-03-13 12:26:23 +02001018 temp = xgifb_reg_get(pVBInfo->P3d4, 0x32);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001019
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301020 if (temp & Monitor1Sense)
1021 tempbx |= ActiveCRT1;
1022 if (temp & LCDSense)
1023 tempbx |= ActiveLCD;
1024 if (temp & Monitor2Sense)
1025 tempbx |= ActiveCRT2;
1026 if (temp & TVSense) {
1027 tempbx |= ActiveTV;
1028 if (temp & AVIDEOSense)
1029 tempbx |= (ActiveAVideo << 8);
1030 if (temp & SVIDEOSense)
1031 tempbx |= (ActiveSVideo << 8);
1032 if (temp & SCARTSense)
1033 tempbx |= (ActiveSCART << 8);
1034 if (temp & HiTVSense)
1035 tempbx |= (ActiveHiTV << 8);
1036 if (temp & YPbPrSense)
1037 tempbx |= (ActiveYPbPr << 8);
1038 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001039
Aaro Koskinen58839b02011-03-13 12:26:23 +02001040 tempcx = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1041 tempcx |= (xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001042
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301043 if (tempbx & tempcx) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001044 CR3CData = xgifb_reg_get(pVBInfo->P3d4, 0x3c);
Miguel Gómez3bcc2462012-07-06 12:40:53 +02001045 if (!(CR3CData & DisplayDeviceFromCMOS))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301046 tempcx = 0x1FF0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301047 } else {
1048 tempcx = 0x1FF0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301049 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001050
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301051 tempbx &= tempcx;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001052 xgifb_reg_set(pVBInfo->P3d4, 0x3d, (tempbx & 0x00FF));
1053 xgifb_reg_set(pVBInfo->P3d4, 0x3e, ((tempbx & 0xFF00) >> 8));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001054}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301055
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001056static void XGINew_SetModeScratch(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301057 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001058{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301059 unsigned short temp, tempcl = 0, tempch = 0, CR31Data, CR38Data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001060
Aaro Koskinen58839b02011-03-13 12:26:23 +02001061 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1062 temp |= xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8;
1063 temp |= (xgifb_reg_get(pVBInfo->P3d4, 0x31) & (DriverMode >> 8)) << 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001064
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301065 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
1066 if (temp & ActiveCRT2)
1067 tempcl = SetCRT2ToRAMDAC;
1068 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001069
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301070 if (temp & ActiveLCD) {
1071 tempcl |= SetCRT2ToLCD;
1072 if (temp & DriverMode) {
1073 if (temp & ActiveTV) {
1074 tempch = SetToLCDA | EnableDualEdge;
1075 temp ^= SetCRT2ToLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001076
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301077 if ((temp >> 8) & ActiveAVideo)
1078 tempcl |= SetCRT2ToAVIDEO;
1079 if ((temp >> 8) & ActiveSVideo)
1080 tempcl |= SetCRT2ToSVIDEO;
1081 if ((temp >> 8) & ActiveSCART)
1082 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001083
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301084 if (pVBInfo->IF_DEF_HiVision == 1) {
1085 if ((temp >> 8) & ActiveHiTV)
Peter Huewe599801f2012-02-09 21:11:45 +01001086 tempcl |= SetCRT2ToHiVision;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301087 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001088
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301089 if (pVBInfo->IF_DEF_YPbPr == 1) {
1090 if ((temp >> 8) & ActiveYPbPr)
1091 tempch |= SetYPbPr;
1092 }
1093 }
1094 }
1095 } else {
1096 if ((temp >> 8) & ActiveAVideo)
1097 tempcl |= SetCRT2ToAVIDEO;
1098 if ((temp >> 8) & ActiveSVideo)
1099 tempcl |= SetCRT2ToSVIDEO;
1100 if ((temp >> 8) & ActiveSCART)
1101 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001102
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301103 if (pVBInfo->IF_DEF_HiVision == 1) {
1104 if ((temp >> 8) & ActiveHiTV)
Peter Huewe599801f2012-02-09 21:11:45 +01001105 tempcl |= SetCRT2ToHiVision;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301106 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001107
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301108 if (pVBInfo->IF_DEF_YPbPr == 1) {
1109 if ((temp >> 8) & ActiveYPbPr)
1110 tempch |= SetYPbPr;
1111 }
1112 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001113
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301114 tempcl |= SetSimuScanMode;
1115 if ((!(temp & ActiveCRT1)) && ((temp & ActiveLCD) || (temp & ActiveTV)
1116 || (temp & ActiveCRT2)))
Peter Huewe6896b942012-02-09 21:11:46 +01001117 tempcl ^= (SetSimuScanMode | SwitchCRT2);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301118 if ((temp & ActiveLCD) && (temp & ActiveTV))
Peter Huewe6896b942012-02-09 21:11:46 +01001119 tempcl ^= (SetSimuScanMode | SwitchCRT2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001120 xgifb_reg_set(pVBInfo->P3d4, 0x30, tempcl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001121
Aaro Koskinen58839b02011-03-13 12:26:23 +02001122 CR31Data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301123 CR31Data &= ~(SetNotSimuMode >> 8);
1124 if (!(temp & ActiveCRT1))
1125 CR31Data |= (SetNotSimuMode >> 8);
1126 CR31Data &= ~(DisableCRT2Display >> 8);
1127 if (!((temp & ActiveLCD) || (temp & ActiveTV) || (temp & ActiveCRT2)))
1128 CR31Data |= (DisableCRT2Display >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001129 xgifb_reg_set(pVBInfo->P3d4, 0x31, CR31Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001130
Aaro Koskinen58839b02011-03-13 12:26:23 +02001131 CR38Data = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301132 CR38Data &= ~SetYPbPr;
1133 CR38Data |= tempch;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001134 xgifb_reg_set(pVBInfo->P3d4, 0x38, CR38Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001135
1136}
1137
Aaro Koskinen40544b02011-11-13 00:09:25 +02001138static unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
1139 *HwDeviceExtension,
1140 struct vb_device_info *pVBInfo)
1141{
1142 unsigned short temp;
1143
1144 /* add lcd sense */
1145 if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN) {
1146 return 0;
1147 } else {
1148 temp = (unsigned short) HwDeviceExtension->ulCRT2LCDType;
1149 switch (HwDeviceExtension->ulCRT2LCDType) {
1150 case LCD_INVALID:
1151 case LCD_800x600:
1152 case LCD_1024x768:
1153 case LCD_1280x1024:
1154 break;
1155
1156 case LCD_640x480:
1157 case LCD_1024x600:
1158 case LCD_1152x864:
1159 case LCD_1280x960:
1160 case LCD_1152x768:
1161 temp = 0;
1162 break;
1163
1164 case LCD_1400x1050:
1165 case LCD_1280x768:
1166 case LCD_1600x1200:
1167 break;
1168
1169 case LCD_1920x1440:
1170 case LCD_2048x1536:
1171 temp = 0;
1172 break;
1173
1174 default:
1175 break;
1176 }
1177 xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp);
1178 return 1;
1179 }
1180}
1181
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001182static void XGINew_GetXG21Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301183 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001184{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301185 unsigned char Temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001186
Aaro Koskinenc4ffaa42011-12-06 00:10:35 +02001187 if (pVBInfo->IF_DEF_LVDS) { /* For XG21 LVDS */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001188 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001189 /* LVDS on chip */
1190 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301191 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001192 /* Enable GPIOA/B read */
1193 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001194 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0xC0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301195 if (Temp == 0xC0) { /* DVI & DVO GPIOA/B pull high */
1196 XGINew_SenseLCD(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001197 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001198 /* Enable read GPIOF */
1199 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x20, 0x20);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001200 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301201 if (!Temp)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001202 xgifb_reg_and_or(pVBInfo->P3d4,
1203 0x38,
1204 ~0xE0,
1205 0x80); /* TMDS on chip */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301206 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001207 xgifb_reg_and_or(pVBInfo->P3d4,
1208 0x38,
1209 ~0xE0,
1210 0xA0); /* Only DVO on chip */
1211 /* Disable read GPIOF */
1212 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301213 }
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301214 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001215}
1216
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001217static void XGINew_GetXG27Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301218 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001219{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001220 unsigned char Temp, bCR4A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001221
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301222 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001223 bCR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001224 /* Enable GPIOA/B/C read */
1225 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x07, 0x07);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001226 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x07;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001227 xgifb_reg_set(pVBInfo->P3d4, 0x4A, bCR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001228
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301229 if (Temp <= 0x02) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001230 /* LVDS setting */
1231 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001232 xgifb_reg_set(pVBInfo->P3d4, 0x30, 0x21);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301233 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001234 /* TMDS/DVO setting */
1235 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xA0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301236 }
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001237 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001238
1239}
1240
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001241static unsigned char GetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001242{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001243 unsigned char CR38, CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001244
Aaro Koskinen58839b02011-03-13 12:26:23 +02001245 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001246 /* enable GPIOE read */
1247 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x10, 0x10);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001248 CR38 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301249 temp = 0;
1250 if ((CR38 & 0xE0) > 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001251 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301252 temp &= 0x08;
1253 temp >>= 3;
1254 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001255
Aaro Koskinen8104e322011-03-13 12:26:22 +02001256 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001257
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301258 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259}
1260
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001261static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001262{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001263 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001264
Aaro Koskinen58839b02011-03-13 12:26:23 +02001265 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001266 /* enable GPIOA/B/C read */
1267 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001268 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301269 if (temp <= 2)
1270 temp &= 0x03;
1271 else
Dan Carpenter2f123cb2012-08-14 10:04:45 +03001272 temp = ((temp & 0x04) >> 1) | ((~temp) & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001273
Aaro Koskinen8104e322011-03-13 12:26:22 +02001274 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301275
1276 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001277}
1278
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001279unsigned char XGIInitNew(struct pci_dev *pdev)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001280{
Aaro Koskinenab886ff2011-10-11 21:47:18 +03001281 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001282 struct xgi_hw_device_info *HwDeviceExtension = &xgifb_info->hw_info;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001283 struct vb_device_info VBINF;
1284 struct vb_device_info *pVBInfo = &VBINF;
1285 unsigned char i, temp = 0, temp1;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001286
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001287 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
1288
Dmitry Eremin-Solenikov9a801f22012-03-19 21:50:13 +04001289 pVBInfo->BaseAddr = xgifb_info->vga_base;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001290
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001291 if (pVBInfo->FBAddr == NULL) {
Miguel Gómez19185702012-06-18 13:12:06 +02001292 dev_dbg(&pdev->dev, "pVBInfo->FBAddr == 0\n");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001293 return 0;
1294 }
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001295 if (pVBInfo->BaseAddr == 0) {
Miguel Gómez19185702012-06-18 13:12:06 +02001296 dev_dbg(&pdev->dev, "pVBInfo->BaseAddr == 0\n");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001297 return 0;
1298 }
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001299
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001300 outb(0x67, (pVBInfo->BaseAddr + 0x12)); /* 3c2 <- 67 ,ynlai */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001301
1302 pVBInfo->ISXPDOS = 0;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001303
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001304 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
1305 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
1306 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
1307 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
1308 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
1309 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
1310 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
1311 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
1312 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
1313 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
1314 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
1315 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01001316 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
1317 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
1318 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
1319 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
1320 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001321
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001322 if (HwDeviceExtension->jChipType < XG20)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001323 /* Run XGI_GetVBType before InitTo330Pointer */
1324 XGI_GetVBType(pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001325
1326 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
1327
Aaro Koskinen4e6f4032011-12-06 00:10:42 +02001328 xgifb_read_vbios(pdev, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001329
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001330 /* Openkey */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001331 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001332
1333 /* GetXG21Sense (GPIO) */
1334 if (HwDeviceExtension->jChipType == XG21)
1335 XGINew_GetXG21Sense(HwDeviceExtension, pVBInfo);
1336
1337 if (HwDeviceExtension->jChipType == XG27)
1338 XGINew_GetXG27Sense(HwDeviceExtension, pVBInfo);
1339
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001340 /* Reset Extended register */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001341
1342 for (i = 0x06; i < 0x20; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001343 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001344
1345 for (i = 0x21; i <= 0x27; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001346 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001347
Aaro Koskinen06587332011-03-13 12:26:10 +02001348 for (i = 0x31; i <= 0x3B; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001349 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001350
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001351 /* Auto over driver for XG42 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001352 if (HwDeviceExtension->jChipType == XG42)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001353 xgifb_reg_set(pVBInfo->P3c4, 0x3B, 0xC0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001354
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001355 for (i = 0x79; i <= 0x7C; i++)
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001356 xgifb_reg_set(pVBInfo->P3d4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001357
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001358 if (HwDeviceExtension->jChipType >= XG20)
Peter Huewe6d12dae2012-06-14 00:21:52 +02001359 xgifb_reg_set(pVBInfo->P3d4, 0x97, pVBInfo->XGINew_CR97);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001360
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001361 /* SetDefExt1Regs begin */
Peter Huewe6d12dae2012-06-14 00:21:52 +02001362 xgifb_reg_set(pVBInfo->P3c4, 0x07, XGI330_SR07);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001363 if (HwDeviceExtension->jChipType == XG27) {
Peter Huewe6d12dae2012-06-14 00:21:52 +02001364 xgifb_reg_set(pVBInfo->P3c4, 0x40, XG27_SR40);
1365 xgifb_reg_set(pVBInfo->P3c4, 0x41, XG27_SR41);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001366 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02001367 xgifb_reg_set(pVBInfo->P3c4, 0x11, 0x0F);
Peter Huewe6d12dae2012-06-14 00:21:52 +02001368 xgifb_reg_set(pVBInfo->P3c4, 0x1F, XGI330_SR1F);
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001369 /* Frame buffer can read/write SR20 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001370 xgifb_reg_set(pVBInfo->P3c4, 0x20, 0xA0);
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001371 /* H/W request for slow corner chip */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001372 xgifb_reg_set(pVBInfo->P3c4, 0x36, 0x70);
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001373 if (HwDeviceExtension->jChipType == XG27)
Peter Huewe6d12dae2012-06-14 00:21:52 +02001374 xgifb_reg_set(pVBInfo->P3c4, 0x36, XG27_SR36);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001375
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001376 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001377 u32 Temp;
1378
Aaro Koskinen06587332011-03-13 12:26:10 +02001379 /* Set AGP customize registers (in SetDefAGPRegs) Start */
1380 for (i = 0x47; i <= 0x4C; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001381 xgifb_reg_set(pVBInfo->P3d4,
1382 i,
1383 pVBInfo->AGPReg[i - 0x47]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001384
Aaro Koskinen06587332011-03-13 12:26:10 +02001385 for (i = 0x70; i <= 0x71; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001386 xgifb_reg_set(pVBInfo->P3d4,
1387 i,
1388 pVBInfo->AGPReg[6 + i - 0x70]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001389
Aaro Koskinen06587332011-03-13 12:26:10 +02001390 for (i = 0x74; i <= 0x77; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001391 xgifb_reg_set(pVBInfo->P3d4,
1392 i,
1393 pVBInfo->AGPReg[8 + i - 0x74]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001394
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001395 pci_read_config_dword(pdev, 0x50, &Temp);
Aaro Koskinen06587332011-03-13 12:26:10 +02001396 Temp >>= 20;
1397 Temp &= 0xF;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001398
Aaro Koskinen06587332011-03-13 12:26:10 +02001399 if (Temp == 1)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001400 xgifb_reg_set(pVBInfo->P3d4, 0x48, 0x20); /* CR48 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001401 } /* != XG20 */
1402
1403 /* Set PCI */
Peter Huewe6d12dae2012-06-14 00:21:52 +02001404 xgifb_reg_set(pVBInfo->P3c4, 0x23, XGI330_SR23);
1405 xgifb_reg_set(pVBInfo->P3c4, 0x24, XGI330_SR24);
1406 xgifb_reg_set(pVBInfo->P3c4, 0x25, XGI330_SR25);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001407
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001408 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001409 /* Set VB */
1410 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001411 /* disable VideoCapture */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001412 xgifb_reg_and_or(pVBInfo->Part0Port, 0x3F, 0xEF, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001413 xgifb_reg_set(pVBInfo->Part1Port, 0x00, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001414 /* chk if BCLK>=100MHz */
1415 temp1 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x7B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001416 temp = (unsigned char) ((temp1 >> 4) & 0x0F);
1417
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001418 xgifb_reg_set(pVBInfo->Part1Port,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001419 0x02, XGI330_CRT2Data_1_2);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001420
Aaro Koskinen8104e322011-03-13 12:26:22 +02001421 xgifb_reg_set(pVBInfo->Part1Port, 0x2E, 0x08); /* use VB */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001422 } /* != XG20 */
1423
Aaro Koskinen8104e322011-03-13 12:26:22 +02001424 xgifb_reg_set(pVBInfo->P3c4, 0x27, 0x1F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001425
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001426 if ((HwDeviceExtension->jChipType == XG42) &&
1427 XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo) != 0) {
1428 /* Not DDR */
1429 xgifb_reg_set(pVBInfo->P3c4,
1430 0x31,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001431 (XGI330_SR31 & 0x3F) | 0x40);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001432 xgifb_reg_set(pVBInfo->P3c4,
1433 0x32,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001434 (XGI330_SR32 & 0xFC) | 0x01);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001435 } else {
Peter Huewe6d12dae2012-06-14 00:21:52 +02001436 xgifb_reg_set(pVBInfo->P3c4, 0x31, XGI330_SR31);
1437 xgifb_reg_set(pVBInfo->P3c4, 0x32, XGI330_SR32);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001438 }
Peter Huewe6d12dae2012-06-14 00:21:52 +02001439 xgifb_reg_set(pVBInfo->P3c4, 0x33, XGI330_SR33);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001440
Miguel Gómez949eb0a2012-07-06 12:40:36 +02001441 if (HwDeviceExtension->jChipType < XG20) {
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001442 if (XGI_BridgeIsOn(pVBInfo) == 1) {
1443 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001444 xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1C);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001445 xgifb_reg_set(pVBInfo->Part4Port,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001446 0x0D, XGI330_CRT2Data_4_D);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001447 xgifb_reg_set(pVBInfo->Part4Port,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001448 0x0E, XGI330_CRT2Data_4_E);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001449 xgifb_reg_set(pVBInfo->Part4Port,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001450 0x10, XGI330_CRT2Data_4_10);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001451 xgifb_reg_set(pVBInfo->Part4Port, 0x0F, 0x3F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001452 }
1453
1454 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
1455 }
1456 } /* != XG20 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001457
1458 XGI_SenseCRT1(pVBInfo);
1459
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001460 if (HwDeviceExtension->jChipType == XG21) {
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001461
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001462 xgifb_reg_and_or(pVBInfo->P3d4,
1463 0x32,
1464 ~Monitor1Sense,
1465 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001466 temp = GetXG21FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001467 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x01, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001468
1469 }
1470 if (HwDeviceExtension->jChipType == XG27) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001471 xgifb_reg_and_or(pVBInfo->P3d4,
1472 0x32,
1473 ~Monitor1Sense,
1474 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001475 temp = GetXG27FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001476 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x03, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001477 }
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001478
Aaro Koskinen2af1a292011-10-11 21:47:31 +03001479 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001480
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001481 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension,
1482 pVBInfo->P3d4,
1483 pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001484
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001485 XGINew_SetDRAMSize_340(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001486
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001487 xgifb_reg_set(pVBInfo->P3c4,
1488 0x22,
Peter Huewe6d12dae2012-06-14 00:21:52 +02001489 (unsigned char) ((pVBInfo->SR22) & 0xFE));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001490
Peter Huewe6d12dae2012-06-14 00:21:52 +02001491 xgifb_reg_set(pVBInfo->P3c4, 0x21, pVBInfo->SR21);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001492
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001493 XGINew_ChkSenseStatus(HwDeviceExtension, pVBInfo);
1494 XGINew_SetModeScratch(HwDeviceExtension, pVBInfo);
1495
Aaro Koskinen8104e322011-03-13 12:26:22 +02001496 xgifb_reg_set(pVBInfo->P3d4, 0x8c, 0x87);
1497 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x31);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001498
1499 return 1;
1500} /* end of init */