blob: 9e890a17fbc232b324ab645a1b8d74a82c9b4ec5 [file] [log] [blame]
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001#include <linux/types.h>
2#include <linux/delay.h> /* udelay */
Aaro Koskinen6048d7612011-10-11 21:47:16 +03003#include <linux/pci.h>
4
Aaro Koskinen4b495462011-09-13 22:49:32 +03005#include "vgatypes.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02007
8#include "vb_def.h"
9#include "vb_struct.h"
10#include "vb_util.h"
11#include "vb_setmode.h"
12#include "vb_init.h"
13#include "vb_ext.h"
14
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020015
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080016#include <linux/io.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020017
Aaro Koskinen4397c7f2011-10-11 21:47:34 +030018static const unsigned short XGINew_DDRDRAM_TYPE340[4][5] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040019 { 2, 13, 9, 64, 0x45},
20 { 2, 12, 9, 32, 0x35},
21 { 2, 12, 8, 16, 0x31},
22 { 2, 11, 8, 8, 0x21} };
23
Aaro Koskinen4397c7f2011-10-11 21:47:34 +030024static const unsigned short XGINew_DDRDRAM_TYPE20[12][5] = {
Bill Pemberton82d6eb52010-06-17 13:10:46 -040025 { 2, 14, 11, 128, 0x5D},
26 { 2, 14, 10, 64, 0x59},
27 { 2, 13, 11, 64, 0x4D},
28 { 2, 14, 9, 32, 0x55},
29 { 2, 13, 10, 32, 0x49},
30 { 2, 12, 11, 32, 0x3D},
31 { 2, 14, 8, 16, 0x51},
32 { 2, 13, 9, 16, 0x45},
33 { 2, 12, 10, 16, 0x39},
34 { 2, 13, 8, 8, 0x41},
35 { 2, 12, 9, 8, 0x35},
36 { 2, 12, 8, 4, 0x31} };
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020037
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080038static unsigned char
39XGINew_GetXG20DRAMType(struct xgi_hw_device_info *HwDeviceExtension,
40 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020041{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053042 unsigned char data, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020043
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053044 if (HwDeviceExtension->jChipType < XG20) {
45 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
46 data = *pVBInfo->pSoftSetting & 0x07;
47 return data;
48 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +020049 data = xgifb_reg_get(pVBInfo->P3c4, 0x39) & 0x02;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053050 if (data == 0)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080051 data = (xgifb_reg_get(pVBInfo->P3c4, 0x3A) &
52 0x02) >> 1;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053053 return data;
54 }
55 } else if (HwDeviceExtension->jChipType == XG27) {
56 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
57 data = *pVBInfo->pSoftSetting & 0x07;
58 return data;
59 }
Aaro Koskinen58839b02011-03-13 12:26:23 +020060 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080061 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
62 if ((temp & 0x88) == 0x80)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053063 data = 0; /* DDR */
64 else
65 data = 1; /* DDRII */
66 return data;
67 } else if (HwDeviceExtension->jChipType == XG21) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080068 /* Independent GPIO control */
69 xgifb_reg_and(pVBInfo->P3d4, 0xB4, ~0x02);
Aaro Koskinenc45715b2011-03-13 12:26:15 +020070 udelay(800);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020071 xgifb_reg_or(pVBInfo->P3d4, 0x4A, 0x80); /* Enable GPIOH read */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080072 /* GPIOF 0:DVI 1:DVO */
73 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053074 /* HOTPLUG_SUPPORT */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080075 /* for current XG20 & XG21, GPIOH is floating, driver will
76 * fix DDR temporarily */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053077 if (temp & 0x01) /* DVI read GPIOH */
78 data = 1; /* DDRII */
79 else
80 data = 0; /* DDR */
81 /* ~HOTPLUG_SUPPORT */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020082 xgifb_reg_or(pVBInfo->P3d4, 0xB4, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053083 return data;
84 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +020085 data = xgifb_reg_get(pVBInfo->P3d4, 0x97) & 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020086
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053087 if (data == 1)
88 data++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020089
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053090 return data;
91 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020092}
93
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080094static void XGINew_DDR1x_MRS_340(unsigned long P3c4,
95 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020096{
Aaro Koskinen8104e322011-03-13 12:26:22 +020097 xgifb_reg_set(P3c4, 0x18, 0x01);
98 xgifb_reg_set(P3c4, 0x19, 0x20);
99 xgifb_reg_set(P3c4, 0x16, 0x00);
100 xgifb_reg_set(P3c4, 0x16, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200101
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530102 if (*pVBInfo->pXGINew_DRAMTypeDefinition != 0x0C) { /* Samsung F Die */
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200103 mdelay(3);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200104 xgifb_reg_set(P3c4, 0x18, 0x00);
105 xgifb_reg_set(P3c4, 0x19, 0x20);
106 xgifb_reg_set(P3c4, 0x16, 0x00);
107 xgifb_reg_set(P3c4, 0x16, 0x80);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530108 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200109
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200110 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300111 xgifb_reg_set(P3c4,
112 0x18,
113 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200114 xgifb_reg_set(P3c4, 0x19, 0x01);
115 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[0]);
116 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[1]);
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200117 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200118 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200119 udelay(500);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300120 xgifb_reg_set(P3c4,
121 0x18,
122 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200123 xgifb_reg_set(P3c4, 0x19, 0x00);
124 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[2]);
125 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[3]);
126 xgifb_reg_set(P3c4, 0x1B, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200127}
128
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200129static void XGINew_SetMemoryClock(struct xgi_hw_device_info *HwDeviceExtension,
130 struct vb_device_info *pVBInfo)
131{
132
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800133 xgifb_reg_set(pVBInfo->P3c4,
134 0x28,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300135 pVBInfo->MCLKData[pVBInfo->ram_type].SR28);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800136 xgifb_reg_set(pVBInfo->P3c4,
137 0x29,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300138 pVBInfo->MCLKData[pVBInfo->ram_type].SR29);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800139 xgifb_reg_set(pVBInfo->P3c4,
140 0x2A,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300141 pVBInfo->MCLKData[pVBInfo->ram_type].SR2A);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200142
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800143 xgifb_reg_set(pVBInfo->P3c4,
144 0x2E,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300145 pVBInfo->ECLKData[pVBInfo->ram_type].SR2E);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800146 xgifb_reg_set(pVBInfo->P3c4,
147 0x2F,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300148 pVBInfo->ECLKData[pVBInfo->ram_type].SR2F);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800149 xgifb_reg_set(pVBInfo->P3c4,
150 0x30,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300151 pVBInfo->ECLKData[pVBInfo->ram_type].SR30);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200152
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800153 /* [Vicent] 2004/07/07,
154 * When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
155 /* [Hsuan] 2004/08/20,
156 * Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz,
157 * Set SR32 D[1:0] = 10b */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200158 if (HwDeviceExtension->jChipType == XG42) {
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300159 if ((pVBInfo->MCLKData[pVBInfo->ram_type].SR28 == 0x1C) &&
160 (pVBInfo->MCLKData[pVBInfo->ram_type].SR29 == 0x01) &&
161 (((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x1C) &&
162 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01)) ||
163 ((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x22) &&
164 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01))))
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800165 xgifb_reg_set(pVBInfo->P3c4,
166 0x32,
167 ((unsigned char) xgifb_reg_get(
168 pVBInfo->P3c4, 0x32) & 0xFC) | 0x02);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200169 }
170}
171
Randy Dunlap89229672010-08-10 08:46:44 -0700172static void XGINew_DDRII_Bootup_XG27(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530173 struct xgi_hw_device_info *HwDeviceExtension,
174 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200175{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530176 unsigned long P3d4 = P3c4 + 0x10;
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300177 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530178 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200179
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530180 /* Set Double Frequency */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200181 /* xgifb_reg_set(P3d4, 0x97, 0x11); *//* CR97 */
182 xgifb_reg_set(P3d4, 0x97, *pVBInfo->pXGINew_CR97); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200183
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200184 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200185
Aaro Koskinen8104e322011-03-13 12:26:22 +0200186 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS2 */
187 xgifb_reg_set(P3c4, 0x19, 0x80); /* Set SR19 */
188 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200189 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200190 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200191 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200192
Aaro Koskinen8104e322011-03-13 12:26:22 +0200193 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS3 */
194 xgifb_reg_set(P3c4, 0x19, 0xC0); /* Set SR19 */
195 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200196 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200197 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200198 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200199
Aaro Koskinen8104e322011-03-13 12:26:22 +0200200 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS1 */
201 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
202 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200203 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200204 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200205 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206
Aaro Koskinen8104e322011-03-13 12:26:22 +0200207 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Enable */
208 xgifb_reg_set(P3c4, 0x19, 0x0A); /* Set SR19 */
209 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200210 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200211 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
212 xgifb_reg_set(P3c4, 0x16, 0x80); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200213 /* udelay(15); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200214
Aaro Koskinen8104e322011-03-13 12:26:22 +0200215 xgifb_reg_set(P3c4, 0x1B, 0x04); /* Set SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200216 udelay(60);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200217 xgifb_reg_set(P3c4, 0x1B, 0x00); /* Set SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200218
Aaro Koskinen8104e322011-03-13 12:26:22 +0200219 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Reset */
220 xgifb_reg_set(P3c4, 0x19, 0x08); /* Set SR19 */
221 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200222
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200223 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200224 xgifb_reg_set(P3c4, 0x16, 0x83); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200225 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200226
Aaro Koskinen8104e322011-03-13 12:26:22 +0200227 xgifb_reg_set(P3c4, 0x18, 0x80); /* Set SR18 */ /* MRS, ODT */
228 xgifb_reg_set(P3c4, 0x19, 0x46); /* Set SR19 */
229 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200230 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200231 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200232 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200233
Aaro Koskinen8104e322011-03-13 12:26:22 +0200234 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS */
235 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
236 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200237 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200238 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200239 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800241 /* Set SR1B refresh control 000:close; 010:open */
242 xgifb_reg_set(P3c4, 0x1B, 0x04);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200243 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200244
245}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530246
Randy Dunlap89229672010-08-10 08:46:44 -0700247static void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530248 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200249{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530250 unsigned long P3d4 = P3c4 + 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200251
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300252 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530253 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200254
Aaro Koskinen8104e322011-03-13 12:26:22 +0200255 xgifb_reg_set(P3d4, 0x97, 0x11); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200257 udelay(200);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200258 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS2 */
259 xgifb_reg_set(P3c4, 0x19, 0x80);
260 xgifb_reg_set(P3c4, 0x16, 0x05);
261 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200262
Aaro Koskinen8104e322011-03-13 12:26:22 +0200263 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS3 */
264 xgifb_reg_set(P3c4, 0x19, 0xC0);
265 xgifb_reg_set(P3c4, 0x16, 0x05);
266 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200267
Aaro Koskinen8104e322011-03-13 12:26:22 +0200268 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS1 */
269 xgifb_reg_set(P3c4, 0x19, 0x40);
270 xgifb_reg_set(P3c4, 0x16, 0x05);
271 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200272
Aaro Koskinen8104e322011-03-13 12:26:22 +0200273 /* xgifb_reg_set(P3c4, 0x18, 0x52); */ /* MRS1 */
274 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
275 xgifb_reg_set(P3c4, 0x19, 0x02);
276 xgifb_reg_set(P3c4, 0x16, 0x05);
277 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200278
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200279 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200280 xgifb_reg_set(P3c4, 0x1B, 0x04); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200281 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200282 xgifb_reg_set(P3c4, 0x1B, 0x00); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200283 udelay(100);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200284
Aaro Koskinen8104e322011-03-13 12:26:22 +0200285 /* xgifb_reg_set(P3c4 ,0x18, 0x52); */ /* MRS2 */
286 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
287 xgifb_reg_set(P3c4, 0x19, 0x00);
288 xgifb_reg_set(P3c4, 0x16, 0x05);
289 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200290
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200291 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292}
293
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800294static void XGINew_DDR1x_MRS_XG20(unsigned long P3c4,
295 struct vb_device_info *pVBInfo)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200296{
Aaro Koskinen8104e322011-03-13 12:26:22 +0200297 xgifb_reg_set(P3c4, 0x18, 0x01);
298 xgifb_reg_set(P3c4, 0x19, 0x40);
299 xgifb_reg_set(P3c4, 0x16, 0x00);
300 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200301 udelay(60);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200302
Aaro Koskinen8104e322011-03-13 12:26:22 +0200303 xgifb_reg_set(P3c4, 0x18, 0x00);
304 xgifb_reg_set(P3c4, 0x19, 0x40);
305 xgifb_reg_set(P3c4, 0x16, 0x00);
306 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200307 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300308 xgifb_reg_set(P3c4,
309 0x18,
310 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200311 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
312 xgifb_reg_set(P3c4, 0x19, 0x01);
313 xgifb_reg_set(P3c4, 0x16, 0x03);
314 xgifb_reg_set(P3c4, 0x16, 0x83);
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200315 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200316 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200317 udelay(500);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200318 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300319 xgifb_reg_set(P3c4,
320 0x18,
321 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200322 xgifb_reg_set(P3c4, 0x19, 0x00);
323 xgifb_reg_set(P3c4, 0x16, 0x03);
324 xgifb_reg_set(P3c4, 0x16, 0x83);
325 xgifb_reg_set(P3c4, 0x1B, 0x00);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200326}
327
Randy Dunlap89229672010-08-10 08:46:44 -0700328static void XGINew_DDR1x_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530329 struct xgi_hw_device_info *HwDeviceExtension,
330 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200331{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530332 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530334 if (HwDeviceExtension->jChipType >= XG20) {
335 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800336 xgifb_reg_set(P3d4,
337 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300338 pVBInfo->CR40[11][pVBInfo->ram_type]); /* CR82 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800339 xgifb_reg_set(P3d4,
340 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300341 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800342 xgifb_reg_set(P3d4,
343 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300344 pVBInfo->CR40[13][pVBInfo->ram_type]); /* CR86 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200345
Aaro Koskinen8104e322011-03-13 12:26:22 +0200346 xgifb_reg_set(P3d4, 0x98, 0x01);
347 xgifb_reg_set(P3d4, 0x9A, 0x02);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200348
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530349 XGINew_DDR1x_MRS_XG20(P3c4, pVBInfo);
350 } else {
351 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200352
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530353 switch (HwDeviceExtension->jChipType) {
354 case XG41:
355 case XG42:
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800356 /* CR82 */
357 xgifb_reg_set(P3d4,
358 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300359 pVBInfo->CR40[11][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800360 /* CR85 */
361 xgifb_reg_set(P3d4,
362 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300363 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800364 /* CR86 */
365 xgifb_reg_set(P3d4,
366 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300367 pVBInfo->CR40[13][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530368 break;
369 default:
Aaro Koskinen8104e322011-03-13 12:26:22 +0200370 xgifb_reg_set(P3d4, 0x82, 0x88);
371 xgifb_reg_set(P3d4, 0x86, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800372 /* Insert read command for delay */
373 xgifb_reg_get(P3d4, 0x86);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200374 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200375 xgifb_reg_get(P3d4, 0x86);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800376 xgifb_reg_set(P3d4,
377 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300378 pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200379 xgifb_reg_set(P3d4, 0x82, 0x77);
380 xgifb_reg_set(P3d4, 0x85, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800381
382 /* Insert read command for delay */
383 xgifb_reg_get(P3d4, 0x85);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200384 xgifb_reg_set(P3d4, 0x85, 0x88);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800385
386 /* Insert read command for delay */
387 xgifb_reg_get(P3d4, 0x85);
388 /* CR85 */
389 xgifb_reg_set(P3d4,
390 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300391 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800392 /* CR82 */
393 xgifb_reg_set(P3d4,
394 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300395 pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530396 break;
397 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200398
Aaro Koskinen8104e322011-03-13 12:26:22 +0200399 xgifb_reg_set(P3d4, 0x97, 0x00);
400 xgifb_reg_set(P3d4, 0x98, 0x01);
401 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530402 XGINew_DDR1x_MRS_340(P3c4, pVBInfo);
403 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200404}
405
Randy Dunlap89229672010-08-10 08:46:44 -0700406static void XGINew_DDR2_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530407 struct xgi_hw_device_info *HwDeviceExtension,
408 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200409{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530410 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800412 /* keep following setting sequence, each setting in
413 * the same reg insert idle */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200414 xgifb_reg_set(P3d4, 0x82, 0x77);
415 xgifb_reg_set(P3d4, 0x86, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200416 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200417 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200418 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800419 /* CR86 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300420 xgifb_reg_set(P3d4, 0x86, pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200421 xgifb_reg_set(P3d4, 0x82, 0x77);
422 xgifb_reg_set(P3d4, 0x85, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200423 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200424 xgifb_reg_set(P3d4, 0x85, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200425 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300426 xgifb_reg_set(P3d4,
427 0x85,
428 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530429 if (HwDeviceExtension->jChipType == XG27)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800430 /* CR82 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300431 xgifb_reg_set(P3d4, 0x82, pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530432 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200433 xgifb_reg_set(P3d4, 0x82, 0xA8); /* CR82 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200434
Aaro Koskinen8104e322011-03-13 12:26:22 +0200435 xgifb_reg_set(P3d4, 0x98, 0x01);
436 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530437 if (HwDeviceExtension->jChipType == XG27)
438 XGINew_DDRII_Bootup_XG27(HwDeviceExtension, P3c4, pVBInfo);
439 else
440 XGINew_DDR2_MRS_XG20(HwDeviceExtension, P3c4, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200441}
442
Aaro Koskinene0cc8a62011-03-08 22:16:20 +0200443static void XGINew_SetDRAMDefaultRegister340(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530444 struct xgi_hw_device_info *HwDeviceExtension,
445 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200446{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530447 unsigned char temp, temp1, temp2, temp3, i, j, k;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200448
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530449 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200450
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300451 xgifb_reg_set(P3d4, 0x6D, pVBInfo->CR40[8][pVBInfo->ram_type]);
452 xgifb_reg_set(P3d4, 0x68, pVBInfo->CR40[5][pVBInfo->ram_type]);
453 xgifb_reg_set(P3d4, 0x69, pVBInfo->CR40[6][pVBInfo->ram_type]);
454 xgifb_reg_set(P3d4, 0x6A, pVBInfo->CR40[7][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200455
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530456 temp2 = 0;
457 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800458 /* CR6B DQS fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300459 temp = pVBInfo->CR6B[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530460 for (j = 0; j < 4; j++) {
461 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
462 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200463 xgifb_reg_set(P3d4, 0x6B, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800464 /* Insert read command for delay */
465 xgifb_reg_get(P3d4, 0x6B);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530466 temp2 &= 0xF0;
467 temp2 += 0x10;
468 }
469 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200470
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530471 temp2 = 0;
472 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800473 /* CR6E DQM fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300474 temp = pVBInfo->CR6E[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530475 for (j = 0; j < 4; j++) {
476 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
477 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200478 xgifb_reg_set(P3d4, 0x6E, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800479 /* Insert read command for delay */
480 xgifb_reg_get(P3d4, 0x6E);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530481 temp2 &= 0xF0;
482 temp2 += 0x10;
483 }
484 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200485
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530486 temp3 = 0;
487 for (k = 0; k < 4; k++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800488 /* CR6E_D[1:0] select channel */
489 xgifb_reg_and_or(P3d4, 0x6E, 0xFC, temp3);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530490 temp2 = 0;
491 for (i = 0; i < 8; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800492 /* CR6F DQ fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300493 temp = pVBInfo->CR6F[pVBInfo->ram_type][8 * k + i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530494 for (j = 0; j < 4; j++) {
495 temp1 = (temp >> (2 * j)) & 0x03;
496 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200497 xgifb_reg_set(P3d4, 0x6F, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800498 /* Insert read command for delay */
499 xgifb_reg_get(P3d4, 0x6F);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530500 temp2 &= 0xF8;
501 temp2 += 0x08;
502 }
503 }
504 temp3 += 0x01;
505 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200506
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300507 xgifb_reg_set(P3d4,
508 0x80,
509 pVBInfo->CR40[9][pVBInfo->ram_type]); /* CR80 */
510 xgifb_reg_set(P3d4,
511 0x81,
512 pVBInfo->CR40[10][pVBInfo->ram_type]); /* CR81 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200513
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530514 temp2 = 0x80;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800515 /* CR89 terminator type select */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300516 temp = pVBInfo->CR89[pVBInfo->ram_type][0];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530517 for (j = 0; j < 4; j++) {
518 temp1 = (temp >> (2 * j)) & 0x03;
519 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200520 xgifb_reg_set(P3d4, 0x89, temp2);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200521 xgifb_reg_get(P3d4, 0x89); /* Insert read command for delay */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530522 temp2 &= 0xF0;
523 temp2 += 0x10;
524 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200525
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300526 temp = pVBInfo->CR89[pVBInfo->ram_type][1];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530527 temp1 = temp & 0x03;
528 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200529 xgifb_reg_set(P3d4, 0x89, temp2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200530
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300531 temp = pVBInfo->CR40[3][pVBInfo->ram_type];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530532 temp1 = temp & 0x0F;
533 temp2 = (temp >> 4) & 0x07;
534 temp3 = temp & 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200535 xgifb_reg_set(P3d4, 0x45, temp1); /* CR45 */
536 xgifb_reg_set(P3d4, 0x99, temp2); /* CR99 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200537 xgifb_reg_or(P3d4, 0x40, temp3); /* CR40_D[7] */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300538 xgifb_reg_set(P3d4,
539 0x41,
540 pVBInfo->CR40[0][pVBInfo->ram_type]); /* CR41 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200541
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530542 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200543 xgifb_reg_set(P3d4, 0x8F, *pVBInfo->pCR8F); /* CR8F */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200544
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800545 for (j = 0; j <= 6; j++) /* CR90 - CR96 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200546 xgifb_reg_set(P3d4, (0x90 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300547 pVBInfo->CR40[14 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200548
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800549 for (j = 0; j <= 2; j++) /* CRC3 - CRC5 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200550 xgifb_reg_set(P3d4, (0xC3 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300551 pVBInfo->CR40[21 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200552
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800553 for (j = 0; j < 2; j++) /* CR8A - CR8B */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200554 xgifb_reg_set(P3d4, (0x8A + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300555 pVBInfo->CR40[1 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200556
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800557 if ((HwDeviceExtension->jChipType == XG41) ||
558 (HwDeviceExtension->jChipType == XG42))
Aaro Koskinen8104e322011-03-13 12:26:22 +0200559 xgifb_reg_set(P3d4, 0x8C, 0x87);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200560
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300561 xgifb_reg_set(P3d4,
562 0x59,
563 pVBInfo->CR40[4][pVBInfo->ram_type]); /* CR59 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200564
Aaro Koskinen8104e322011-03-13 12:26:22 +0200565 xgifb_reg_set(P3d4, 0x83, 0x09); /* CR83 */
566 xgifb_reg_set(P3d4, 0x87, 0x00); /* CR87 */
567 xgifb_reg_set(P3d4, 0xCF, *pVBInfo->pCRCF); /* CRCF */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300568 if (pVBInfo->ram_type) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200569 /* xgifb_reg_set(P3c4, 0x17, 0xC0); */ /* SR17 DDRII */
570 xgifb_reg_set(P3c4, 0x17, 0x80); /* SR17 DDRII */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530571 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200572 xgifb_reg_set(P3c4, 0x17, 0x02); /* SR17 DDRII */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200573
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530574 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200575 xgifb_reg_set(P3c4, 0x17, 0x00); /* SR17 DDR */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530576 }
Aaro Koskinen8104e322011-03-13 12:26:22 +0200577 xgifb_reg_set(P3c4, 0x1A, 0x87); /* SR1A */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200578
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530579 temp = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
580 if (temp == 0) {
581 XGINew_DDR1x_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
582 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200583 xgifb_reg_set(P3d4, 0xB0, 0x80); /* DDRII Dual frequency mode */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530584 XGINew_DDR2_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
585 }
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300586 xgifb_reg_set(P3c4,
587 0x1B,
588 pVBInfo->SR15[3][pVBInfo->ram_type]); /* SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200589}
590
Randy Dunlap89229672010-08-10 08:46:44 -0700591static void XGINew_SetDRAMSizingType(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300592 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530593 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200594{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530595 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200596
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530597 data = DRAMTYPE_TABLE[index][4];
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200598 xgifb_reg_and_or(pVBInfo->P3c4, 0x13, 0x80, data);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200599 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530600 /* should delay 50 ns */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200601}
602
Randy Dunlap89229672010-08-10 08:46:44 -0700603static unsigned short XGINew_SetDRAMSizeReg(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300604 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530605 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200606{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530607 unsigned short data = 0, memsize = 0;
608 int RankSize;
609 unsigned char ChannelNo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200610
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300611 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 32;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200612 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530613 data &= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200614
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530615 if (data == 0x80)
616 RankSize *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200617
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530618 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200619
Aaro Koskinenee055a42011-10-11 21:47:32 +0300620 if (pVBInfo->ram_channel == 3)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530621 ChannelNo = 4;
622 else
Aaro Koskinenee055a42011-10-11 21:47:32 +0300623 ChannelNo = pVBInfo->ram_channel;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200624
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530625 if (ChannelNo * RankSize <= 256) {
626 while ((RankSize >>= 1) > 0)
627 data += 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200628
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530629 memsize = data >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200630
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530631 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800632 xgifb_reg_set(pVBInfo->P3c4,
633 0x14,
634 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
635 (data & 0xF0));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200636
Aaro Koskinenee055a42011-10-11 21:47:32 +0300637 /* data |= pVBInfo->ram_channel << 2; */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300638 /* data |= (pVBInfo->ram_bus / 64) << 1; */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200639 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200640
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530641 /* should delay */
642 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
643 }
644 return memsize;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200645}
646
Randy Dunlap89229672010-08-10 08:46:44 -0700647static unsigned short XGINew_SetDRAMSize20Reg(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300648 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530649 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200650{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530651 unsigned short data = 0, memsize = 0;
652 int RankSize;
653 unsigned char ChannelNo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200654
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300655 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200656 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530657 data &= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200658
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530659 if (data == 0x80)
660 RankSize *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200661
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530662 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200663
Aaro Koskinenee055a42011-10-11 21:47:32 +0300664 if (pVBInfo->ram_channel == 3)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530665 ChannelNo = 4;
666 else
Aaro Koskinenee055a42011-10-11 21:47:32 +0300667 ChannelNo = pVBInfo->ram_channel;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200668
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530669 if (ChannelNo * RankSize <= 256) {
670 while ((RankSize >>= 1) > 0)
671 data += 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200672
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530673 memsize = data >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200674
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530675 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800676 xgifb_reg_set(pVBInfo->P3c4,
677 0x14,
678 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
679 (data & 0xF0));
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200680 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200681
Aaro Koskinenee055a42011-10-11 21:47:32 +0300682 /* data |= pVBInfo->ram_channel << 2; */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300683 /* data |= (pVBInfo->ram_bus / 64) << 1; */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200684 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200685
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530686 /* should delay */
687 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
688 }
689 return memsize;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200690}
691
Randy Dunlap89229672010-08-10 08:46:44 -0700692static int XGINew_ReadWriteRest(unsigned short StopAddr,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530693 unsigned short StartAddr, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200694{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530695 int i;
696 unsigned long Position = 0;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300697 void __iomem *fbaddr = pVBInfo->FBAddr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200698
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300699 writel(Position, fbaddr + Position);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200700
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530701 for (i = StartAddr; i <= StopAddr; i++) {
702 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300703 writel(Position, fbaddr + Position);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530704 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200705
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800706 udelay(500); /* [Vicent] 2004/04/16.
707 Fix #1759 Memory Size error in Multi-Adapter. */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200708
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530709 Position = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200710
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300711 if (readl(fbaddr + Position) != Position)
Bill Pembertonfc3678a2010-06-17 13:10:44 -0400712 return 0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530713
714 for (i = StartAddr; i <= StopAddr; i++) {
715 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300716 if (readl(fbaddr + Position) != Position)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530717 return 0;
718 }
719 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200720}
721
Randy Dunlap89229672010-08-10 08:46:44 -0700722static unsigned char XGINew_CheckFrequence(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200723{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530724 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200725
Aaro Koskinen58839b02011-03-13 12:26:23 +0200726 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200727
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530728 if ((data & 0x10) == 0) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200729 data = xgifb_reg_get(pVBInfo->P3c4, 0x39);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530730 data = (data & 0x02) >> 1;
731 return data;
732 } else {
733 return data & 0x01;
734 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200735}
736
Randy Dunlap89229672010-08-10 08:46:44 -0700737static void XGINew_CheckChannel(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530738 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200739{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530740 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200741
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530742 switch (HwDeviceExtension->jChipType) {
743 case XG20:
744 case XG21:
Aaro Koskinen58839b02011-03-13 12:26:23 +0200745 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530746 data = data & 0x01;
Aaro Koskinenee055a42011-10-11 21:47:32 +0300747 pVBInfo->ram_channel = 1; /* XG20 "JUST" one channel */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200748
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530749 if (data == 0) { /* Single_32_16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200750
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530751 if ((HwDeviceExtension->ulVideoMemorySize - 1)
752 > 0x1000000) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200753
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300754 pVBInfo->ram_bus = 32; /* 32 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800755 /* 22bit + 2 rank + 32bit */
756 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200757 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200758 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200759
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530760 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
761 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200762
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800763 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
764 0x800000) {
765 /* 22bit + 1 rank + 32bit */
766 xgifb_reg_set(pVBInfo->P3c4,
767 0x13,
768 0x31);
769 xgifb_reg_set(pVBInfo->P3c4,
770 0x14,
771 0x42);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200772 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200773
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800774 if (XGINew_ReadWriteRest(23,
775 23,
776 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530777 return;
778 }
779 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200780
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800781 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
782 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300783 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800784 /* 22bit + 2 rank + 16bit */
785 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200786 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200787 udelay(15);
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
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800792 xgifb_reg_set(pVBInfo->P3c4,
793 0x13,
794 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200795 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530796 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200797
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530798 } else { /* Dual_16_8 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800799 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
800 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300801 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800802 /* (0x31:12x8x2) 22bit + 2 rank */
803 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
804 /* 0x41:16Mx16 bit*/
805 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200806 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200807
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530808 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
809 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200810
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800811 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
812 0x400000) {
813 /* (0x31:12x8x2) 22bit + 1 rank */
814 xgifb_reg_set(pVBInfo->P3c4,
815 0x13,
816 0x31);
817 /* 0x31:8Mx16 bit*/
818 xgifb_reg_set(pVBInfo->P3c4,
819 0x14,
820 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200821 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200822
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800823 if (XGINew_ReadWriteRest(22,
824 22,
825 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530826 return;
827 }
828 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200829
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800830 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
831 0x400000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300832 pVBInfo->ram_bus = 8; /* 8 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800833 /* (0x31:12x8x2) 22bit + 2 rank */
834 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
835 /* 0x30:8Mx8 bit*/
836 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200837 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200838
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530839 if (XGINew_ReadWriteRest(22, 21, pVBInfo) == 1)
840 return;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800841 else /* (0x31:12x8x2) 22bit + 1 rank */
842 xgifb_reg_set(pVBInfo->P3c4,
843 0x13,
844 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200845 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530846 }
847 }
848 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200849
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530850 case XG27:
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300851 pVBInfo->ram_bus = 16; /* 16 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300852 pVBInfo->ram_channel = 1; /* Single channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200853 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x51); /* 32Mx16 bit*/
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530854 break;
855 case XG41:
856 if (XGINew_CheckFrequence(pVBInfo) == 1) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300857 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300858 pVBInfo->ram_channel = 3; /* Quad Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200859 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
860 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200861
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530862 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
863 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200864
Aaro Koskinenee055a42011-10-11 21:47:32 +0300865 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200866 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200867
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530868 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
869 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200870
Aaro Koskinen8104e322011-03-13 12:26:22 +0200871 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x49);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200872
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530873 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
874 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200875
Aaro Koskinenee055a42011-10-11 21:47:32 +0300876 pVBInfo->ram_channel = 3;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200877 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
878 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200879
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530880 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
881 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200882
Aaro Koskinen8104e322011-03-13 12:26:22 +0200883 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200884
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530885 if (XGINew_ReadWriteRest(8, 4, pVBInfo) == 1)
886 return;
887 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200888 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x39);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530889 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300890 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300891 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200892 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
893 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200894
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530895 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1)
896 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200897
Aaro Koskinenee055a42011-10-11 21:47:32 +0300898 pVBInfo->ram_channel = 1; /* Single channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200899 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200900
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530901 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
902 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200903
Aaro Koskinen8104e322011-03-13 12:26:22 +0200904 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x53);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200905
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530906 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
907 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200908
Aaro Koskinenee055a42011-10-11 21:47:32 +0300909 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200910 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
911 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200912
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530913 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
914 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200915
Aaro Koskinenee055a42011-10-11 21:47:32 +0300916 pVBInfo->ram_channel = 1; /* Single channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200917 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200918
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530919 if (XGINew_ReadWriteRest(8, 4, pVBInfo) == 1)
920 return;
921 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200922 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x43);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530923 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200924
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530925 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200926
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530927 case XG42:
928 /*
929 XG42 SR14 D[3] Reserve
930 D[2] = 1, Dual Channel
931 = 0, Single Channel
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200932
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530933 It's Different from Other XG40 Series.
934 */
935 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII, DDR2x */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300936 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300937 pVBInfo->ram_channel = 2; /* 2 Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200938 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
939 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x44);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200940
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530941 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
942 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200943
Aaro Koskinen8104e322011-03-13 12:26:22 +0200944 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
945 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x34);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530946 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
947 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200948
Aaro Koskinenee055a42011-10-11 21:47:32 +0300949 pVBInfo->ram_channel = 1; /* Single Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200950 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
951 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200952
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530953 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
954 return;
955 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200956 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
957 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530958 }
959 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300960 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300961 pVBInfo->ram_channel = 1; /* 1 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200962 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
963 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200964
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530965 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
966 return;
967 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200968 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
969 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530970 }
971 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200972
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530973 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200974
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530975 default: /* XG40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200976
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530977 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300978 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300979 pVBInfo->ram_channel = 3;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200980 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
981 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200982
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530983 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
984 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200985
Aaro Koskinenee055a42011-10-11 21:47:32 +0300986 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200987 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200988
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530989 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
990 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200991
Aaro Koskinen8104e322011-03-13 12:26:22 +0200992 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
993 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200994
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530995 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1) {
Aaro Koskinenee055a42011-10-11 21:47:32 +0300996 pVBInfo->ram_channel = 3; /* 4 channels */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530997 } else {
Aaro Koskinenee055a42011-10-11 21:47:32 +0300998 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200999 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301000 }
1001 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +03001002 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +03001003 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001004 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
1005 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001006
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301007 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1) {
1008 return;
1009 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001010 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
1011 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301012 }
1013 }
1014 break;
1015 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001016}
1017
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001018static int XGINew_DDRSizing340(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301019 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001020{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301021 int i;
1022 unsigned short memsize, addr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001023
Aaro Koskinen8104e322011-03-13 12:26:22 +02001024 xgifb_reg_set(pVBInfo->P3c4, 0x15, 0x00); /* noninterleaving */
1025 xgifb_reg_set(pVBInfo->P3c4, 0x1C, 0x00); /* nontiling */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301026 XGINew_CheckChannel(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001027
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301028 if (HwDeviceExtension->jChipType >= XG20) {
1029 for (i = 0; i < 12; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001030 XGINew_SetDRAMSizingType(i,
1031 XGINew_DDRDRAM_TYPE20,
1032 pVBInfo);
1033 memsize = XGINew_SetDRAMSize20Reg(i,
1034 XGINew_DDRDRAM_TYPE20,
1035 pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301036 if (memsize == 0)
1037 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001038
Aaro Koskinenee055a42011-10-11 21:47:32 +03001039 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001040 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
1041 (unsigned long) (1 << addr))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301042 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001043
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301044 if (XGINew_ReadWriteRest(addr, 5, pVBInfo) == 1)
1045 return 1;
1046 }
1047 } else {
1048 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001049 XGINew_SetDRAMSizingType(i,
1050 XGINew_DDRDRAM_TYPE340,
1051 pVBInfo);
1052 memsize = XGINew_SetDRAMSizeReg(i,
1053 XGINew_DDRDRAM_TYPE340,
1054 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001055
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301056 if (memsize == 0)
1057 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001058
Aaro Koskinenee055a42011-10-11 21:47:32 +03001059 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001060 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
1061 (unsigned long) (1 << addr))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301062 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001063
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301064 if (XGINew_ReadWriteRest(addr, 9, pVBInfo) == 1)
1065 return 1;
1066 }
1067 }
1068 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001069}
1070
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001071static void XGINew_SetDRAMSize_340(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301072 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001073{
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001074 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001075
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001076 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
1077 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001078
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001079 XGISetModeNew(HwDeviceExtension, 0x2e);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001080
Aaro Koskinen58839b02011-03-13 12:26:23 +02001081 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001082 /* disable read cache */
1083 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data & 0xDF));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001084 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
1085
Aaro Koskinen58839b02011-03-13 12:26:23 +02001086 /* data = xgifb_reg_get(pVBInfo->P3c4, 0x1); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001087 /* data |= 0x20 ; */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001088 /* xgifb_reg_set(pVBInfo->P3c4, 0x01, data); *//* Turn OFF Display */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001089 XGINew_DDRSizing340(HwDeviceExtension, pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001090 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001091 /* enable read cache */
1092 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data | 0x20));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001093}
1094
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001095static void ReadVBIOSTablData(unsigned char ChipType,
1096 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001097{
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001098 volatile unsigned char *pVideoMemory =
1099 (unsigned char *) pVBInfo->ROMAddr;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301100 unsigned long i;
1101 unsigned char j, k;
1102 /* Volari customize data area end */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001103
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301104 if (ChipType == XG21) {
1105 pVBInfo->IF_DEF_LVDS = 0;
1106 if (pVideoMemory[0x65] & 0x1) {
1107 pVBInfo->IF_DEF_LVDS = 1;
1108 i = pVideoMemory[0x316] | (pVideoMemory[0x317] << 8);
1109 j = pVideoMemory[i - 1];
1110 if (j != 0xff) {
1111 k = 0;
1112 do {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001113 pVBInfo->XG21_LVDSCapList[k].
1114 LVDS_Capability
1115 = pVideoMemory[i] |
1116 (pVideoMemory[i + 1] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301117 pVBInfo->XG21_LVDSCapList[k].LVDSHT
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001118 = pVideoMemory[i + 2] |
1119 (pVideoMemory[i + 3] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301120 pVBInfo->XG21_LVDSCapList[k].LVDSVT
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001121 = pVideoMemory[i + 4] |
1122 (pVideoMemory[i + 5] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301123 pVBInfo->XG21_LVDSCapList[k].LVDSHDE
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001124 = pVideoMemory[i + 6] |
1125 (pVideoMemory[i + 7] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301126 pVBInfo->XG21_LVDSCapList[k].LVDSVDE
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001127 = pVideoMemory[i + 8] |
1128 (pVideoMemory[i + 9] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301129 pVBInfo->XG21_LVDSCapList[k].LVDSHFP
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001130 = pVideoMemory[i + 10] |
1131 (pVideoMemory[i + 11] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301132 pVBInfo->XG21_LVDSCapList[k].LVDSVFP
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001133 = pVideoMemory[i + 12] |
1134 (pVideoMemory[i + 13] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301135 pVBInfo->XG21_LVDSCapList[k].LVDSHSYNC
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001136 = pVideoMemory[i + 14] |
1137 (pVideoMemory[i + 15] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301138 pVBInfo->XG21_LVDSCapList[k].LVDSVSYNC
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001139 = pVideoMemory[i + 16] |
1140 (pVideoMemory[i + 17] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301141 pVBInfo->XG21_LVDSCapList[k].VCLKData1
1142 = pVideoMemory[i + 18];
1143 pVBInfo->XG21_LVDSCapList[k].VCLKData2
1144 = pVideoMemory[i + 19];
1145 pVBInfo->XG21_LVDSCapList[k].PSC_S1
1146 = pVideoMemory[i + 20];
1147 pVBInfo->XG21_LVDSCapList[k].PSC_S2
1148 = pVideoMemory[i + 21];
1149 pVBInfo->XG21_LVDSCapList[k].PSC_S3
1150 = pVideoMemory[i + 22];
1151 pVBInfo->XG21_LVDSCapList[k].PSC_S4
1152 = pVideoMemory[i + 23];
1153 pVBInfo->XG21_LVDSCapList[k].PSC_S5
1154 = pVideoMemory[i + 24];
1155 i += 25;
1156 j--;
1157 k++;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001158 } while ((j > 0) &&
1159 (k < (sizeof(XGI21_LCDCapList) /
1160 sizeof(struct
1161 XGI21_LVDSCapStruct))));
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301162 } else {
1163 pVBInfo->XG21_LVDSCapList[0].LVDS_Capability
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001164 = pVideoMemory[i] |
1165 (pVideoMemory[i + 1] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301166 pVBInfo->XG21_LVDSCapList[0].LVDSHT
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001167 = pVideoMemory[i + 2] |
1168 (pVideoMemory[i + 3] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301169 pVBInfo->XG21_LVDSCapList[0].LVDSVT
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001170 = pVideoMemory[i + 4] |
1171 (pVideoMemory[i + 5] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301172 pVBInfo->XG21_LVDSCapList[0].LVDSHDE
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001173 = pVideoMemory[i + 6] |
1174 (pVideoMemory[i + 7] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301175 pVBInfo->XG21_LVDSCapList[0].LVDSVDE
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001176 = pVideoMemory[i + 8] |
1177 (pVideoMemory[i + 9] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301178 pVBInfo->XG21_LVDSCapList[0].LVDSHFP
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001179 = pVideoMemory[i + 10] |
1180 (pVideoMemory[i + 11] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301181 pVBInfo->XG21_LVDSCapList[0].LVDSVFP
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001182 = pVideoMemory[i + 12] |
1183 (pVideoMemory[i + 13] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301184 pVBInfo->XG21_LVDSCapList[0].LVDSHSYNC
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001185 = pVideoMemory[i + 14] |
1186 (pVideoMemory[i + 15] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301187 pVBInfo->XG21_LVDSCapList[0].LVDSVSYNC
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001188 = pVideoMemory[i + 16] |
1189 (pVideoMemory[i + 17] << 8);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301190 pVBInfo->XG21_LVDSCapList[0].VCLKData1
1191 = pVideoMemory[i + 18];
1192 pVBInfo->XG21_LVDSCapList[0].VCLKData2
1193 = pVideoMemory[i + 19];
1194 pVBInfo->XG21_LVDSCapList[0].PSC_S1
1195 = pVideoMemory[i + 20];
1196 pVBInfo->XG21_LVDSCapList[0].PSC_S2
1197 = pVideoMemory[i + 21];
1198 pVBInfo->XG21_LVDSCapList[0].PSC_S3
1199 = pVideoMemory[i + 22];
1200 pVBInfo->XG21_LVDSCapList[0].PSC_S4
1201 = pVideoMemory[i + 23];
1202 pVBInfo->XG21_LVDSCapList[0].PSC_S5
1203 = pVideoMemory[i + 24];
1204 }
1205 }
1206 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001207}
1208
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001209static void XGINew_ChkSenseStatus(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301210 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001211{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301212 unsigned short tempbx = 0, temp, tempcx, CR3CData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001213
Aaro Koskinen58839b02011-03-13 12:26:23 +02001214 temp = xgifb_reg_get(pVBInfo->P3d4, 0x32);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001215
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301216 if (temp & Monitor1Sense)
1217 tempbx |= ActiveCRT1;
1218 if (temp & LCDSense)
1219 tempbx |= ActiveLCD;
1220 if (temp & Monitor2Sense)
1221 tempbx |= ActiveCRT2;
1222 if (temp & TVSense) {
1223 tempbx |= ActiveTV;
1224 if (temp & AVIDEOSense)
1225 tempbx |= (ActiveAVideo << 8);
1226 if (temp & SVIDEOSense)
1227 tempbx |= (ActiveSVideo << 8);
1228 if (temp & SCARTSense)
1229 tempbx |= (ActiveSCART << 8);
1230 if (temp & HiTVSense)
1231 tempbx |= (ActiveHiTV << 8);
1232 if (temp & YPbPrSense)
1233 tempbx |= (ActiveYPbPr << 8);
1234 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001235
Aaro Koskinen58839b02011-03-13 12:26:23 +02001236 tempcx = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1237 tempcx |= (xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001238
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301239 if (tempbx & tempcx) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001240 CR3CData = xgifb_reg_get(pVBInfo->P3d4, 0x3c);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301241 if (!(CR3CData & DisplayDeviceFromCMOS)) {
1242 tempcx = 0x1FF0;
1243 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1244 tempbx = 0x1FF0;
1245 }
1246 } else {
1247 tempcx = 0x1FF0;
1248 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1249 tempbx = 0x1FF0;
1250 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001251
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301252 tempbx &= tempcx;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001253 xgifb_reg_set(pVBInfo->P3d4, 0x3d, (tempbx & 0x00FF));
1254 xgifb_reg_set(pVBInfo->P3d4, 0x3e, ((tempbx & 0xFF00) >> 8));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001255}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301256
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001257static void XGINew_SetModeScratch(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301258 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001259{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301260 unsigned short temp, tempcl = 0, tempch = 0, CR31Data, CR38Data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001261
Aaro Koskinen58839b02011-03-13 12:26:23 +02001262 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1263 temp |= xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8;
1264 temp |= (xgifb_reg_get(pVBInfo->P3d4, 0x31) & (DriverMode >> 8)) << 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001265
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301266 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
1267 if (temp & ActiveCRT2)
1268 tempcl = SetCRT2ToRAMDAC;
1269 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001270
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301271 if (temp & ActiveLCD) {
1272 tempcl |= SetCRT2ToLCD;
1273 if (temp & DriverMode) {
1274 if (temp & ActiveTV) {
1275 tempch = SetToLCDA | EnableDualEdge;
1276 temp ^= SetCRT2ToLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001277
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301278 if ((temp >> 8) & ActiveAVideo)
1279 tempcl |= SetCRT2ToAVIDEO;
1280 if ((temp >> 8) & ActiveSVideo)
1281 tempcl |= SetCRT2ToSVIDEO;
1282 if ((temp >> 8) & ActiveSCART)
1283 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001284
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301285 if (pVBInfo->IF_DEF_HiVision == 1) {
1286 if ((temp >> 8) & ActiveHiTV)
1287 tempcl |= SetCRT2ToHiVisionTV;
1288 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001289
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301290 if (pVBInfo->IF_DEF_YPbPr == 1) {
1291 if ((temp >> 8) & ActiveYPbPr)
1292 tempch |= SetYPbPr;
1293 }
1294 }
1295 }
1296 } else {
1297 if ((temp >> 8) & ActiveAVideo)
1298 tempcl |= SetCRT2ToAVIDEO;
1299 if ((temp >> 8) & ActiveSVideo)
1300 tempcl |= SetCRT2ToSVIDEO;
1301 if ((temp >> 8) & ActiveSCART)
1302 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001303
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301304 if (pVBInfo->IF_DEF_HiVision == 1) {
1305 if ((temp >> 8) & ActiveHiTV)
1306 tempcl |= SetCRT2ToHiVisionTV;
1307 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001308
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301309 if (pVBInfo->IF_DEF_YPbPr == 1) {
1310 if ((temp >> 8) & ActiveYPbPr)
1311 tempch |= SetYPbPr;
1312 }
1313 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001314
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301315 tempcl |= SetSimuScanMode;
1316 if ((!(temp & ActiveCRT1)) && ((temp & ActiveLCD) || (temp & ActiveTV)
1317 || (temp & ActiveCRT2)))
1318 tempcl ^= (SetSimuScanMode | SwitchToCRT2);
1319 if ((temp & ActiveLCD) && (temp & ActiveTV))
1320 tempcl ^= (SetSimuScanMode | SwitchToCRT2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001321 xgifb_reg_set(pVBInfo->P3d4, 0x30, tempcl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001322
Aaro Koskinen58839b02011-03-13 12:26:23 +02001323 CR31Data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301324 CR31Data &= ~(SetNotSimuMode >> 8);
1325 if (!(temp & ActiveCRT1))
1326 CR31Data |= (SetNotSimuMode >> 8);
1327 CR31Data &= ~(DisableCRT2Display >> 8);
1328 if (!((temp & ActiveLCD) || (temp & ActiveTV) || (temp & ActiveCRT2)))
1329 CR31Data |= (DisableCRT2Display >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001330 xgifb_reg_set(pVBInfo->P3d4, 0x31, CR31Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001331
Aaro Koskinen58839b02011-03-13 12:26:23 +02001332 CR38Data = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301333 CR38Data &= ~SetYPbPr;
1334 CR38Data |= tempch;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001335 xgifb_reg_set(pVBInfo->P3d4, 0x38, CR38Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001336
1337}
1338
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001339static void XGINew_GetXG21Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301340 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001341{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301342 unsigned char Temp;
1343 volatile unsigned char *pVideoMemory =
1344 (unsigned char *) pVBInfo->ROMAddr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001345
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301346 pVBInfo->IF_DEF_LVDS = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001347
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001348#if 1
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301349 if ((pVideoMemory[0x65] & 0x01)) { /* For XG21 LVDS */
1350 pVBInfo->IF_DEF_LVDS = 1;
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001351 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001352 /* LVDS on chip */
1353 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301354 } else {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001355#endif
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001356 /* Enable GPIOA/B read */
1357 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001358 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0xC0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301359 if (Temp == 0xC0) { /* DVI & DVO GPIOA/B pull high */
1360 XGINew_SenseLCD(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001361 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001362 /* Enable read GPIOF */
1363 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x20, 0x20);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001364 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301365 if (!Temp)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001366 xgifb_reg_and_or(pVBInfo->P3d4,
1367 0x38,
1368 ~0xE0,
1369 0x80); /* TMDS on chip */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301370 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001371 xgifb_reg_and_or(pVBInfo->P3d4,
1372 0x38,
1373 ~0xE0,
1374 0xA0); /* Only DVO on chip */
1375 /* Disable read GPIOF */
1376 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301377 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001378#if 1
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301379 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001380#endif
1381}
1382
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001383static void XGINew_GetXG27Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301384 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001385{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001386 unsigned char Temp, bCR4A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001387
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301388 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001389 bCR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001390 /* Enable GPIOA/B/C read */
1391 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x07, 0x07);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001392 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x07;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001393 xgifb_reg_set(pVBInfo->P3d4, 0x4A, bCR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001394
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301395 if (Temp <= 0x02) {
1396 pVBInfo->IF_DEF_LVDS = 1;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001397 /* LVDS setting */
1398 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001399 xgifb_reg_set(pVBInfo->P3d4, 0x30, 0x21);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301400 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001401 /* TMDS/DVO setting */
1402 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xA0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301403 }
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001404 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001405
1406}
1407
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001408static unsigned char GetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001409{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001410 unsigned char CR38, CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001411
Aaro Koskinen58839b02011-03-13 12:26:23 +02001412 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001413 /* enable GPIOE read */
1414 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x10, 0x10);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001415 CR38 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301416 temp = 0;
1417 if ((CR38 & 0xE0) > 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001418 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301419 temp &= 0x08;
1420 temp >>= 3;
1421 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001422
Aaro Koskinen8104e322011-03-13 12:26:22 +02001423 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001424
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301425 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001426}
1427
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001428static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001429{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001430 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001431
Aaro Koskinen58839b02011-03-13 12:26:23 +02001432 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001433 /* enable GPIOA/B/C read */
1434 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001435 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301436 if (temp <= 2)
1437 temp &= 0x03;
1438 else
1439 temp = ((temp & 0x04) >> 1) || ((~temp) & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001440
Aaro Koskinen8104e322011-03-13 12:26:22 +02001441 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301442
1443 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001444}
1445
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001446unsigned char XGIInitNew(struct pci_dev *pdev)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001447{
Aaro Koskinenab886ff2011-10-11 21:47:18 +03001448 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001449 struct xgi_hw_device_info *HwDeviceExtension = &xgifb_info->hw_info;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001450 struct vb_device_info VBINF;
1451 struct vb_device_info *pVBInfo = &VBINF;
1452 unsigned char i, temp = 0, temp1;
1453 /* VBIOSVersion[5]; */
1454 volatile unsigned char *pVideoMemory;
1455
1456 /* unsigned long j, k; */
1457
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001458 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
1459
1460 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
1461
1462 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
1463
1464 pVideoMemory = (unsigned char *) pVBInfo->ROMAddr;
1465
1466 /* Newdebugcode(0x99); */
1467
1468
1469 /* if (pVBInfo->ROMAddr == 0) */
1470 /* return(0); */
1471
1472 if (pVBInfo->FBAddr == NULL) {
1473 printk("\n pVBInfo->FBAddr == 0 ");
1474 return 0;
1475 }
1476 printk("1");
1477 if (pVBInfo->BaseAddr == 0) {
1478 printk("\npVBInfo->BaseAddr == 0 ");
1479 return 0;
1480 }
1481 printk("2");
1482
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001483 outb(0x67, (pVBInfo->BaseAddr + 0x12)); /* 3c2 <- 67 ,ynlai */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001484
1485 pVBInfo->ISXPDOS = 0;
1486 printk("3");
1487
1488 printk("4");
1489
1490 /* VBIOSVersion[4] = 0x0; */
1491
1492 /* 09/07/99 modify by domao */
1493
1494 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
1495 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
1496 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
1497 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
1498 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
1499 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
1500 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
1501 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
1502 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
1503 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
1504 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
1505 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
1506 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
1507 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
1508 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
1509 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
1510 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
1511 printk("5");
1512
1513 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001514 /* Run XGI_GetVBType before InitTo330Pointer */
1515 XGI_GetVBType(pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001516
1517 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
1518
1519 /* ReadVBIOSData */
1520 ReadVBIOSTablData(HwDeviceExtension->jChipType, pVBInfo);
1521
1522 /* 1.Openkey */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001523 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001524 printk("6");
1525
1526 /* GetXG21Sense (GPIO) */
1527 if (HwDeviceExtension->jChipType == XG21)
1528 XGINew_GetXG21Sense(HwDeviceExtension, pVBInfo);
1529
1530 if (HwDeviceExtension->jChipType == XG27)
1531 XGINew_GetXG27Sense(HwDeviceExtension, pVBInfo);
1532
1533 printk("7");
1534
1535 /* 2.Reset Extended register */
1536
1537 for (i = 0x06; i < 0x20; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001538 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001539
1540 for (i = 0x21; i <= 0x27; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001541 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001542
1543 /* for(i = 0x06; i <= 0x27; i++) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001544 /* xgifb_reg_set(pVBInfo->P3c4, i, 0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001545
1546 printk("8");
1547
Aaro Koskinen06587332011-03-13 12:26:10 +02001548 for (i = 0x31; i <= 0x3B; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001549 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001550 printk("9");
1551
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001552 /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
1553 if (HwDeviceExtension->jChipType == XG42)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001554 xgifb_reg_set(pVBInfo->P3c4, 0x3B, 0xC0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001555
1556 /* for (i = 0x30; i <= 0x3F; i++) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001557 /* xgifb_reg_set(pVBInfo->P3d4, i, 0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001558
1559 for (i = 0x79; i <= 0x7C; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001560 xgifb_reg_set(pVBInfo->P3d4, i, 0); /* shampoo 0208 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001561
1562 printk("10");
1563
1564 if (HwDeviceExtension->jChipType >= XG20)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001565 xgifb_reg_set(pVBInfo->P3d4, 0x97, *pVBInfo->pXGINew_CR97);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001566
1567 /* 3.SetMemoryClock
1568
Aaro Koskinen2af1a292011-10-11 21:47:31 +03001569 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02001570 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001571
1572 printk("11");
1573
1574 /* 4.SetDefExt1Regs begin */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001575 xgifb_reg_set(pVBInfo->P3c4, 0x07, *pVBInfo->pSR07);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001576 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001577 xgifb_reg_set(pVBInfo->P3c4, 0x40, *pVBInfo->pSR40);
1578 xgifb_reg_set(pVBInfo->P3c4, 0x41, *pVBInfo->pSR41);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001579 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02001580 xgifb_reg_set(pVBInfo->P3c4, 0x11, 0x0F);
1581 xgifb_reg_set(pVBInfo->P3c4, 0x1F, *pVBInfo->pSR1F);
1582 /* xgifb_reg_set(pVBInfo->P3c4, 0x20, 0x20); */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001583 /* alan, 2001/6/26 Frame buffer can read/write SR20 */
1584 xgifb_reg_set(pVBInfo->P3c4, 0x20, 0xA0);
1585 /* Hsuan, 2006/01/01 H/W request for slow corner chip */
1586 xgifb_reg_set(pVBInfo->P3c4, 0x36, 0x70);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001587 if (HwDeviceExtension->jChipType == XG27) /* Alan 12/07/2006 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001588 xgifb_reg_set(pVBInfo->P3c4, 0x36, *pVBInfo->pSR36);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001589
1590 /* SR11 = 0x0F; */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001591 /* xgifb_reg_set(pVBInfo->P3c4, 0x11, SR11); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001592
1593 printk("12");
1594
1595 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001596 u32 Temp;
1597
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001598 /* Set AGP Rate */
1599 /*
Aaro Koskinen58839b02011-03-13 12:26:23 +02001600 temp1 = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001601 temp1 &= 0x02;
1602 if (temp1 == 0x02) {
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001603 outl(0x80000000, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001604 ChipsetID = inl(0x0cfc);
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001605 outl(0x8000002C, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001606 VendorID = inl(0x0cfc);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001607 VendorID &= 0x0000FFFF;
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001608 outl(0x8001002C, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001609 GraphicVendorID = inl(0x0cfc);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001610 GraphicVendorID &= 0x0000FFFF;
1611
1612 if (ChipsetID == 0x7301039)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001613 xgifb_reg_set(pVBInfo->P3d4, 0x5F, 0x09);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001614
1615 ChipsetID &= 0x0000FFFF;
1616
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001617 if ((ChipsetID == 0x700E) ||
1618 (ChipsetID == 0x1022) ||
1619 (ChipsetID == 0x1106) ||
1620 (ChipsetID == 0x10DE)) {
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001621 if (ChipsetID == 0x1106) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001622 if ((VendorID == 0x1019) &&
1623 (GraphicVendorID == 0x1019))
1624 xgifb_reg_set(pVBInfo->P3d4,
1625 0x5F,
1626 0x0D);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001627 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001628 xgifb_reg_set(pVBInfo->P3d4,
1629 0x5F,
1630 0x0B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001631 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001632 xgifb_reg_set(pVBInfo->P3d4,
1633 0x5F,
1634 0x0B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001635 }
1636 }
1637 }
1638 */
1639
1640 printk("13");
1641
Aaro Koskinen06587332011-03-13 12:26:10 +02001642 /* Set AGP customize registers (in SetDefAGPRegs) Start */
1643 for (i = 0x47; i <= 0x4C; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001644 xgifb_reg_set(pVBInfo->P3d4,
1645 i,
1646 pVBInfo->AGPReg[i - 0x47]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001647
Aaro Koskinen06587332011-03-13 12:26:10 +02001648 for (i = 0x70; i <= 0x71; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001649 xgifb_reg_set(pVBInfo->P3d4,
1650 i,
1651 pVBInfo->AGPReg[6 + i - 0x70]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001652
Aaro Koskinen06587332011-03-13 12:26:10 +02001653 for (i = 0x74; i <= 0x77; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001654 xgifb_reg_set(pVBInfo->P3d4,
1655 i,
1656 pVBInfo->AGPReg[8 + i - 0x74]);
Aaro Koskinen06587332011-03-13 12:26:10 +02001657 /* Set AGP customize registers (in SetDefAGPRegs) End */
1658 /* [Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001659 /* outl(0x80000000, 0xcf8); */
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001660 /* ChipsetID = inl(0x0cfc); */
Aaro Koskinen06587332011-03-13 12:26:10 +02001661 /* if (ChipsetID == 0x25308086) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001662 /* xgifb_reg_set(pVBInfo->P3d4, 0x77, 0xF0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001663
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001664 pci_read_config_dword(pdev, 0x50, &Temp);
Aaro Koskinen06587332011-03-13 12:26:10 +02001665 Temp >>= 20;
1666 Temp &= 0xF;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001667
Aaro Koskinen06587332011-03-13 12:26:10 +02001668 if (Temp == 1)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001669 xgifb_reg_set(pVBInfo->P3d4, 0x48, 0x20); /* CR48 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001670 printk("14");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001671 } /* != XG20 */
1672
1673 /* Set PCI */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001674 xgifb_reg_set(pVBInfo->P3c4, 0x23, *pVBInfo->pSR23);
1675 xgifb_reg_set(pVBInfo->P3c4, 0x24, *pVBInfo->pSR24);
1676 xgifb_reg_set(pVBInfo->P3c4, 0x25, pVBInfo->SR25[0]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001677 printk("15");
1678
1679 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1680 /* Set VB */
1681 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001682 /* alan, disable VideoCapture */
1683 xgifb_reg_and_or(pVBInfo->Part0Port, 0x3F, 0xEF, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001684 xgifb_reg_set(pVBInfo->Part1Port, 0x00, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001685 /* chk if BCLK>=100MHz */
1686 temp1 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x7B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001687 temp = (unsigned char) ((temp1 >> 4) & 0x0F);
1688
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001689 xgifb_reg_set(pVBInfo->Part1Port,
1690 0x02,
1691 (*pVBInfo->pCRT2Data_1_2));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001692
1693 printk("16");
1694
Aaro Koskinen8104e322011-03-13 12:26:22 +02001695 xgifb_reg_set(pVBInfo->Part1Port, 0x2E, 0x08); /* use VB */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001696 } /* != XG20 */
1697
Aaro Koskinen8104e322011-03-13 12:26:22 +02001698 xgifb_reg_set(pVBInfo->P3c4, 0x27, 0x1F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001699
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001700 if ((HwDeviceExtension->jChipType == XG42) &&
1701 XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo) != 0) {
1702 /* Not DDR */
1703 xgifb_reg_set(pVBInfo->P3c4,
1704 0x31,
1705 (*pVBInfo->pSR31 & 0x3F) | 0x40);
1706 xgifb_reg_set(pVBInfo->P3c4,
1707 0x32,
1708 (*pVBInfo->pSR32 & 0xFC) | 0x01);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001709 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001710 xgifb_reg_set(pVBInfo->P3c4, 0x31, *pVBInfo->pSR31);
1711 xgifb_reg_set(pVBInfo->P3c4, 0x32, *pVBInfo->pSR32);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001712 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02001713 xgifb_reg_set(pVBInfo->P3c4, 0x33, *pVBInfo->pSR33);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001714 printk("17");
1715
1716 /*
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001717 SetPowerConsume (HwDeviceExtension, pVBInfo->P3c4); */
1718
1719 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1720 if (XGI_BridgeIsOn(pVBInfo) == 1) {
1721 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001722 xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1C);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001723 xgifb_reg_set(pVBInfo->Part4Port,
1724 0x0D,
1725 *pVBInfo->pCRT2Data_4_D);
1726 xgifb_reg_set(pVBInfo->Part4Port,
1727 0x0E,
1728 *pVBInfo->pCRT2Data_4_E);
1729 xgifb_reg_set(pVBInfo->Part4Port,
1730 0x10,
1731 *pVBInfo->pCRT2Data_4_10);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001732 xgifb_reg_set(pVBInfo->Part4Port, 0x0F, 0x3F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001733 }
1734
1735 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
1736 }
1737 } /* != XG20 */
1738 printk("18");
1739
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001740 printk("181");
1741
1742 printk("182");
1743
1744 XGI_SenseCRT1(pVBInfo);
1745
1746 printk("183");
1747 /* XGINew_DetectMonitor(HwDeviceExtension); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001748 if (HwDeviceExtension->jChipType == XG21) {
1749 printk("186");
1750
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001751 xgifb_reg_and_or(pVBInfo->P3d4,
1752 0x32,
1753 ~Monitor1Sense,
1754 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001755 temp = GetXG21FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001756 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x01, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001757 printk("187");
1758
1759 }
1760 if (HwDeviceExtension->jChipType == XG27) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001761 xgifb_reg_and_or(pVBInfo->P3d4,
1762 0x32,
1763 ~Monitor1Sense,
1764 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001765 temp = GetXG27FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001766 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x03, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001767 }
1768 printk("19");
1769
Aaro Koskinen2af1a292011-10-11 21:47:31 +03001770 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001771
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001772 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension,
1773 pVBInfo->P3d4,
1774 pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001775
Aaro Koskinen06587332011-03-13 12:26:10 +02001776 printk("20");
1777 XGINew_SetDRAMSize_340(HwDeviceExtension, pVBInfo);
1778 printk("21");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001779
1780 printk("22");
1781
1782 /* SetDefExt2Regs begin */
1783 /*
1784 AGP = 1;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001785 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x3A);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001786 temp &= 0x30;
1787 if (temp == 0x30)
1788 AGP = 0;
1789
1790 if (AGP == 0)
1791 *pVBInfo->pSR21 &= 0xEF;
1792
Aaro Koskinen8104e322011-03-13 12:26:22 +02001793 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001794 if (AGP == 1)
1795 *pVBInfo->pSR22 &= 0x20;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001796 xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001797 */
1798 /* base = 0x80000000; */
1799 /* OutPortLong(0xcf8, base); */
1800 /* Temp = (InPortLong(0xcfc) & 0xFFFF); */
1801 /* if (Temp == 0x1039) { */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001802 xgifb_reg_set(pVBInfo->P3c4,
1803 0x22,
1804 (unsigned char) ((*pVBInfo->pSR22) & 0xFE));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001805 /* } else { */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001806 /* xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001807 /* } */
1808
Aaro Koskinen8104e322011-03-13 12:26:22 +02001809 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001810
1811 printk("23");
1812
1813 XGINew_ChkSenseStatus(HwDeviceExtension, pVBInfo);
1814 XGINew_SetModeScratch(HwDeviceExtension, pVBInfo);
1815
1816 printk("24");
1817
Aaro Koskinen8104e322011-03-13 12:26:22 +02001818 xgifb_reg_set(pVBInfo->P3d4, 0x8c, 0x87);
1819 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x31);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001820 printk("25");
1821
1822 return 1;
1823} /* end of init */