blob: 94d5c35e22fbce7af40f176692e70b4a1712efa3 [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>
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02004#include <linux/vmalloc.h>
Aaro Koskinen6048d7612011-10-11 21:47:16 +03005
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02006#include "XGIfb.h"
Peter Hueweb33704d2012-01-15 19:22:11 +01007#include "vgatypes.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02008
9#include "vb_def.h"
10#include "vb_struct.h"
11#include "vb_util.h"
12#include "vb_setmode.h"
13#include "vb_init.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020014
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
Aaro Koskinen02a81dd2011-12-06 00:10:36 +020038#define XGIFB_ROM_SIZE 65536
39
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080040static unsigned char
41XGINew_GetXG20DRAMType(struct xgi_hw_device_info *HwDeviceExtension,
42 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020043{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053044 unsigned char data, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020045
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053046 if (HwDeviceExtension->jChipType < XG20) {
47 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
48 data = *pVBInfo->pSoftSetting & 0x07;
49 return data;
50 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +020051 data = xgifb_reg_get(pVBInfo->P3c4, 0x39) & 0x02;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053052 if (data == 0)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080053 data = (xgifb_reg_get(pVBInfo->P3c4, 0x3A) &
54 0x02) >> 1;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053055 return data;
56 }
57 } else if (HwDeviceExtension->jChipType == XG27) {
58 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
59 data = *pVBInfo->pSoftSetting & 0x07;
60 return data;
61 }
Aaro Koskinen58839b02011-03-13 12:26:23 +020062 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080063 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
64 if ((temp & 0x88) == 0x80)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053065 data = 0; /* DDR */
66 else
67 data = 1; /* DDRII */
68 return data;
69 } else if (HwDeviceExtension->jChipType == XG21) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080070 /* Independent GPIO control */
71 xgifb_reg_and(pVBInfo->P3d4, 0xB4, ~0x02);
Aaro Koskinenc45715b2011-03-13 12:26:15 +020072 udelay(800);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020073 xgifb_reg_or(pVBInfo->P3d4, 0x4A, 0x80); /* Enable GPIOH read */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080074 /* GPIOF 0:DVI 1:DVO */
75 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053076 /* HOTPLUG_SUPPORT */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080077 /* for current XG20 & XG21, GPIOH is floating, driver will
78 * fix DDR temporarily */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053079 if (temp & 0x01) /* DVI read GPIOH */
80 data = 1; /* DDRII */
81 else
82 data = 0; /* DDR */
83 /* ~HOTPLUG_SUPPORT */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +020084 xgifb_reg_or(pVBInfo->P3d4, 0xB4, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053085 return data;
86 } else {
Aaro Koskinen58839b02011-03-13 12:26:23 +020087 data = xgifb_reg_get(pVBInfo->P3d4, 0x97) & 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020088
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053089 if (data == 1)
90 data++;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020091
Prashant P. Shaha24d60f2010-09-02 15:25:38 +053092 return data;
93 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020094}
95
Kenji Toyamabf32fcb2011-04-23 12:11:16 +080096static void XGINew_DDR1x_MRS_340(unsigned long P3c4,
97 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020098{
Aaro Koskinen8104e322011-03-13 12:26:22 +020099 xgifb_reg_set(P3c4, 0x18, 0x01);
100 xgifb_reg_set(P3c4, 0x19, 0x20);
101 xgifb_reg_set(P3c4, 0x16, 0x00);
102 xgifb_reg_set(P3c4, 0x16, 0x80);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200103
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530104 if (*pVBInfo->pXGINew_DRAMTypeDefinition != 0x0C) { /* Samsung F Die */
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200105 mdelay(3);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200106 xgifb_reg_set(P3c4, 0x18, 0x00);
107 xgifb_reg_set(P3c4, 0x19, 0x20);
108 xgifb_reg_set(P3c4, 0x16, 0x00);
109 xgifb_reg_set(P3c4, 0x16, 0x80);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530110 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200111
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200112 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300113 xgifb_reg_set(P3c4,
114 0x18,
115 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200116 xgifb_reg_set(P3c4, 0x19, 0x01);
117 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[0]);
118 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[1]);
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200119 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200120 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200121 udelay(500);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300122 xgifb_reg_set(P3c4,
123 0x18,
124 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200125 xgifb_reg_set(P3c4, 0x19, 0x00);
126 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[2]);
127 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[3]);
128 xgifb_reg_set(P3c4, 0x1B, 0x00);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200129}
130
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200131static void XGINew_SetMemoryClock(struct xgi_hw_device_info *HwDeviceExtension,
132 struct vb_device_info *pVBInfo)
133{
134
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800135 xgifb_reg_set(pVBInfo->P3c4,
136 0x28,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300137 pVBInfo->MCLKData[pVBInfo->ram_type].SR28);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800138 xgifb_reg_set(pVBInfo->P3c4,
139 0x29,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300140 pVBInfo->MCLKData[pVBInfo->ram_type].SR29);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800141 xgifb_reg_set(pVBInfo->P3c4,
142 0x2A,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300143 pVBInfo->MCLKData[pVBInfo->ram_type].SR2A);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200144
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800145 xgifb_reg_set(pVBInfo->P3c4,
146 0x2E,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300147 pVBInfo->ECLKData[pVBInfo->ram_type].SR2E);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800148 xgifb_reg_set(pVBInfo->P3c4,
149 0x2F,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300150 pVBInfo->ECLKData[pVBInfo->ram_type].SR2F);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800151 xgifb_reg_set(pVBInfo->P3c4,
152 0x30,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300153 pVBInfo->ECLKData[pVBInfo->ram_type].SR30);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200154
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800155 /* [Vicent] 2004/07/07,
156 * When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
157 /* [Hsuan] 2004/08/20,
158 * Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz,
159 * Set SR32 D[1:0] = 10b */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200160 if (HwDeviceExtension->jChipType == XG42) {
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300161 if ((pVBInfo->MCLKData[pVBInfo->ram_type].SR28 == 0x1C) &&
162 (pVBInfo->MCLKData[pVBInfo->ram_type].SR29 == 0x01) &&
163 (((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x1C) &&
164 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01)) ||
165 ((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x22) &&
166 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01))))
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800167 xgifb_reg_set(pVBInfo->P3c4,
168 0x32,
169 ((unsigned char) xgifb_reg_get(
170 pVBInfo->P3c4, 0x32) & 0xFC) | 0x02);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200171 }
172}
173
Randy Dunlap89229672010-08-10 08:46:44 -0700174static void XGINew_DDRII_Bootup_XG27(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530175 struct xgi_hw_device_info *HwDeviceExtension,
176 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200177{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530178 unsigned long P3d4 = P3c4 + 0x10;
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300179 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530180 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200181
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530182 /* Set Double Frequency */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200183 /* xgifb_reg_set(P3d4, 0x97, 0x11); *//* CR97 */
184 xgifb_reg_set(P3d4, 0x97, *pVBInfo->pXGINew_CR97); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200185
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200186 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200187
Aaro Koskinen8104e322011-03-13 12:26:22 +0200188 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS2 */
189 xgifb_reg_set(P3c4, 0x19, 0x80); /* Set SR19 */
190 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200191 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200192 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200193 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200194
Aaro Koskinen8104e322011-03-13 12:26:22 +0200195 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS3 */
196 xgifb_reg_set(P3c4, 0x19, 0xC0); /* Set SR19 */
197 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200198 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200199 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200200 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200201
Aaro Koskinen8104e322011-03-13 12:26:22 +0200202 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS1 */
203 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
204 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200205 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200206 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200207 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200208
Aaro Koskinen8104e322011-03-13 12:26:22 +0200209 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Enable */
210 xgifb_reg_set(P3c4, 0x19, 0x0A); /* Set SR19 */
211 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200212 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200213 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
214 xgifb_reg_set(P3c4, 0x16, 0x80); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200215 /* udelay(15); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200216
Aaro Koskinen8104e322011-03-13 12:26:22 +0200217 xgifb_reg_set(P3c4, 0x1B, 0x04); /* Set SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200218 udelay(60);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200219 xgifb_reg_set(P3c4, 0x1B, 0x00); /* Set SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200220
Aaro Koskinen8104e322011-03-13 12:26:22 +0200221 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Reset */
222 xgifb_reg_set(P3c4, 0x19, 0x08); /* Set SR19 */
223 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200224
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200225 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200226 xgifb_reg_set(P3c4, 0x16, 0x83); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200227 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200228
Aaro Koskinen8104e322011-03-13 12:26:22 +0200229 xgifb_reg_set(P3c4, 0x18, 0x80); /* Set SR18 */ /* MRS, ODT */
230 xgifb_reg_set(P3c4, 0x19, 0x46); /* Set SR19 */
231 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200232 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200233 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200234 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Aaro Koskinen8104e322011-03-13 12:26:22 +0200236 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS */
237 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
238 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200239 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200240 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200241 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200242
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800243 /* Set SR1B refresh control 000:close; 010:open */
244 xgifb_reg_set(P3c4, 0x1B, 0x04);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200245 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200246
247}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530248
Randy Dunlap89229672010-08-10 08:46:44 -0700249static void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530250 unsigned long P3c4, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200251{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530252 unsigned long P3d4 = P3c4 + 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200253
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300254 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530255 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200256
Aaro Koskinen8104e322011-03-13 12:26:22 +0200257 xgifb_reg_set(P3d4, 0x97, 0x11); /* CR97 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200258
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200259 udelay(200);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200260 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS2 */
261 xgifb_reg_set(P3c4, 0x19, 0x80);
262 xgifb_reg_set(P3c4, 0x16, 0x05);
263 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200264
Aaro Koskinen8104e322011-03-13 12:26:22 +0200265 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS3 */
266 xgifb_reg_set(P3c4, 0x19, 0xC0);
267 xgifb_reg_set(P3c4, 0x16, 0x05);
268 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200269
Aaro Koskinen8104e322011-03-13 12:26:22 +0200270 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS1 */
271 xgifb_reg_set(P3c4, 0x19, 0x40);
272 xgifb_reg_set(P3c4, 0x16, 0x05);
273 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200274
Aaro Koskinen8104e322011-03-13 12:26:22 +0200275 /* xgifb_reg_set(P3c4, 0x18, 0x52); */ /* MRS1 */
276 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
277 xgifb_reg_set(P3c4, 0x19, 0x02);
278 xgifb_reg_set(P3c4, 0x16, 0x05);
279 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200280
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200281 udelay(15);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200282 xgifb_reg_set(P3c4, 0x1B, 0x04); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200283 udelay(30);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200284 xgifb_reg_set(P3c4, 0x1B, 0x00); /* SR1B */
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200285 udelay(100);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200286
Aaro Koskinen8104e322011-03-13 12:26:22 +0200287 /* xgifb_reg_set(P3c4 ,0x18, 0x52); */ /* MRS2 */
288 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
289 xgifb_reg_set(P3c4, 0x19, 0x00);
290 xgifb_reg_set(P3c4, 0x16, 0x05);
291 xgifb_reg_set(P3c4, 0x16, 0x85);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200292
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200293 udelay(200);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200294}
295
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800296static void XGINew_DDR1x_MRS_XG20(unsigned long P3c4,
297 struct vb_device_info *pVBInfo)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200298{
Aaro Koskinen8104e322011-03-13 12:26:22 +0200299 xgifb_reg_set(P3c4, 0x18, 0x01);
300 xgifb_reg_set(P3c4, 0x19, 0x40);
301 xgifb_reg_set(P3c4, 0x16, 0x00);
302 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200303 udelay(60);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200304
Aaro Koskinen8104e322011-03-13 12:26:22 +0200305 xgifb_reg_set(P3c4, 0x18, 0x00);
306 xgifb_reg_set(P3c4, 0x19, 0x40);
307 xgifb_reg_set(P3c4, 0x16, 0x00);
308 xgifb_reg_set(P3c4, 0x16, 0x80);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200309 udelay(60);
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300310 xgifb_reg_set(P3c4,
311 0x18,
312 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200313 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
314 xgifb_reg_set(P3c4, 0x19, 0x01);
315 xgifb_reg_set(P3c4, 0x16, 0x03);
316 xgifb_reg_set(P3c4, 0x16, 0x83);
Aaro Koskinenc83c6202011-03-13 12:26:14 +0200317 mdelay(1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200318 xgifb_reg_set(P3c4, 0x1B, 0x03);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200319 udelay(500);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200320 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300321 xgifb_reg_set(P3c4,
322 0x18,
323 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200324 xgifb_reg_set(P3c4, 0x19, 0x00);
325 xgifb_reg_set(P3c4, 0x16, 0x03);
326 xgifb_reg_set(P3c4, 0x16, 0x83);
327 xgifb_reg_set(P3c4, 0x1B, 0x00);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +0200328}
329
Randy Dunlap89229672010-08-10 08:46:44 -0700330static void XGINew_DDR1x_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530331 struct xgi_hw_device_info *HwDeviceExtension,
332 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200333{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530334 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200335
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530336 if (HwDeviceExtension->jChipType >= XG20) {
337 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800338 xgifb_reg_set(P3d4,
339 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300340 pVBInfo->CR40[11][pVBInfo->ram_type]); /* CR82 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800341 xgifb_reg_set(P3d4,
342 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300343 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800344 xgifb_reg_set(P3d4,
345 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300346 pVBInfo->CR40[13][pVBInfo->ram_type]); /* CR86 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200347
Aaro Koskinen8104e322011-03-13 12:26:22 +0200348 xgifb_reg_set(P3d4, 0x98, 0x01);
349 xgifb_reg_set(P3d4, 0x9A, 0x02);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200350
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530351 XGINew_DDR1x_MRS_XG20(P3c4, pVBInfo);
352 } else {
353 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200354
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530355 switch (HwDeviceExtension->jChipType) {
356 case XG41:
357 case XG42:
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800358 /* CR82 */
359 xgifb_reg_set(P3d4,
360 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300361 pVBInfo->CR40[11][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800362 /* CR85 */
363 xgifb_reg_set(P3d4,
364 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300365 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800366 /* CR86 */
367 xgifb_reg_set(P3d4,
368 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300369 pVBInfo->CR40[13][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530370 break;
371 default:
Aaro Koskinen8104e322011-03-13 12:26:22 +0200372 xgifb_reg_set(P3d4, 0x82, 0x88);
373 xgifb_reg_set(P3d4, 0x86, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800374 /* Insert read command for delay */
375 xgifb_reg_get(P3d4, 0x86);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200376 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200377 xgifb_reg_get(P3d4, 0x86);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800378 xgifb_reg_set(P3d4,
379 0x86,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300380 pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200381 xgifb_reg_set(P3d4, 0x82, 0x77);
382 xgifb_reg_set(P3d4, 0x85, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800383
384 /* Insert read command for delay */
385 xgifb_reg_get(P3d4, 0x85);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200386 xgifb_reg_set(P3d4, 0x85, 0x88);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800387
388 /* Insert read command for delay */
389 xgifb_reg_get(P3d4, 0x85);
390 /* CR85 */
391 xgifb_reg_set(P3d4,
392 0x85,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300393 pVBInfo->CR40[12][pVBInfo->ram_type]);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800394 /* CR82 */
395 xgifb_reg_set(P3d4,
396 0x82,
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300397 pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530398 break;
399 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200400
Aaro Koskinen8104e322011-03-13 12:26:22 +0200401 xgifb_reg_set(P3d4, 0x97, 0x00);
402 xgifb_reg_set(P3d4, 0x98, 0x01);
403 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530404 XGINew_DDR1x_MRS_340(P3c4, pVBInfo);
405 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200406}
407
Randy Dunlap89229672010-08-10 08:46:44 -0700408static void XGINew_DDR2_DefaultRegister(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530409 struct xgi_hw_device_info *HwDeviceExtension,
410 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200411{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530412 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200413
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800414 /* keep following setting sequence, each setting in
415 * the same reg insert idle */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200416 xgifb_reg_set(P3d4, 0x82, 0x77);
417 xgifb_reg_set(P3d4, 0x86, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200418 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200419 xgifb_reg_set(P3d4, 0x86, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200420 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800421 /* CR86 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300422 xgifb_reg_set(P3d4, 0x86, pVBInfo->CR40[13][pVBInfo->ram_type]);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200423 xgifb_reg_set(P3d4, 0x82, 0x77);
424 xgifb_reg_set(P3d4, 0x85, 0x00);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200425 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200426 xgifb_reg_set(P3d4, 0x85, 0x88);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200427 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300428 xgifb_reg_set(P3d4,
429 0x85,
430 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530431 if (HwDeviceExtension->jChipType == XG27)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800432 /* CR82 */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300433 xgifb_reg_set(P3d4, 0x82, pVBInfo->CR40[11][pVBInfo->ram_type]);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530434 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200435 xgifb_reg_set(P3d4, 0x82, 0xA8); /* CR82 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200436
Aaro Koskinen8104e322011-03-13 12:26:22 +0200437 xgifb_reg_set(P3d4, 0x98, 0x01);
438 xgifb_reg_set(P3d4, 0x9A, 0x02);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530439 if (HwDeviceExtension->jChipType == XG27)
440 XGINew_DDRII_Bootup_XG27(HwDeviceExtension, P3c4, pVBInfo);
441 else
442 XGINew_DDR2_MRS_XG20(HwDeviceExtension, P3c4, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200443}
444
Aaro Koskinene0cc8a62011-03-08 22:16:20 +0200445static void XGINew_SetDRAMDefaultRegister340(
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530446 struct xgi_hw_device_info *HwDeviceExtension,
447 unsigned long Port, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200448{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530449 unsigned char temp, temp1, temp2, temp3, i, j, k;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200450
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530451 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200452
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300453 xgifb_reg_set(P3d4, 0x6D, pVBInfo->CR40[8][pVBInfo->ram_type]);
454 xgifb_reg_set(P3d4, 0x68, pVBInfo->CR40[5][pVBInfo->ram_type]);
455 xgifb_reg_set(P3d4, 0x69, pVBInfo->CR40[6][pVBInfo->ram_type]);
456 xgifb_reg_set(P3d4, 0x6A, pVBInfo->CR40[7][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200457
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530458 temp2 = 0;
459 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800460 /* CR6B DQS fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300461 temp = pVBInfo->CR6B[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530462 for (j = 0; j < 4; j++) {
463 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
464 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200465 xgifb_reg_set(P3d4, 0x6B, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800466 /* Insert read command for delay */
467 xgifb_reg_get(P3d4, 0x6B);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530468 temp2 &= 0xF0;
469 temp2 += 0x10;
470 }
471 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200472
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530473 temp2 = 0;
474 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800475 /* CR6E DQM fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300476 temp = pVBInfo->CR6E[pVBInfo->ram_type][i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530477 for (j = 0; j < 4; j++) {
478 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
479 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200480 xgifb_reg_set(P3d4, 0x6E, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800481 /* Insert read command for delay */
482 xgifb_reg_get(P3d4, 0x6E);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530483 temp2 &= 0xF0;
484 temp2 += 0x10;
485 }
486 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200487
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530488 temp3 = 0;
489 for (k = 0; k < 4; k++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800490 /* CR6E_D[1:0] select channel */
491 xgifb_reg_and_or(P3d4, 0x6E, 0xFC, temp3);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530492 temp2 = 0;
493 for (i = 0; i < 8; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800494 /* CR6F DQ fine tune delay */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300495 temp = pVBInfo->CR6F[pVBInfo->ram_type][8 * k + i];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530496 for (j = 0; j < 4; j++) {
497 temp1 = (temp >> (2 * j)) & 0x03;
498 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200499 xgifb_reg_set(P3d4, 0x6F, temp2);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800500 /* Insert read command for delay */
501 xgifb_reg_get(P3d4, 0x6F);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530502 temp2 &= 0xF8;
503 temp2 += 0x08;
504 }
505 }
506 temp3 += 0x01;
507 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200508
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300509 xgifb_reg_set(P3d4,
510 0x80,
511 pVBInfo->CR40[9][pVBInfo->ram_type]); /* CR80 */
512 xgifb_reg_set(P3d4,
513 0x81,
514 pVBInfo->CR40[10][pVBInfo->ram_type]); /* CR81 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200515
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530516 temp2 = 0x80;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800517 /* CR89 terminator type select */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300518 temp = pVBInfo->CR89[pVBInfo->ram_type][0];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530519 for (j = 0; j < 4; j++) {
520 temp1 = (temp >> (2 * j)) & 0x03;
521 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200522 xgifb_reg_set(P3d4, 0x89, temp2);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200523 xgifb_reg_get(P3d4, 0x89); /* Insert read command for delay */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530524 temp2 &= 0xF0;
525 temp2 += 0x10;
526 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200527
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300528 temp = pVBInfo->CR89[pVBInfo->ram_type][1];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530529 temp1 = temp & 0x03;
530 temp2 |= temp1;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200531 xgifb_reg_set(P3d4, 0x89, temp2);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200532
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300533 temp = pVBInfo->CR40[3][pVBInfo->ram_type];
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530534 temp1 = temp & 0x0F;
535 temp2 = (temp >> 4) & 0x07;
536 temp3 = temp & 0x80;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200537 xgifb_reg_set(P3d4, 0x45, temp1); /* CR45 */
538 xgifb_reg_set(P3d4, 0x99, temp2); /* CR99 */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +0200539 xgifb_reg_or(P3d4, 0x40, temp3); /* CR40_D[7] */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300540 xgifb_reg_set(P3d4,
541 0x41,
542 pVBInfo->CR40[0][pVBInfo->ram_type]); /* CR41 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200543
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530544 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200545 xgifb_reg_set(P3d4, 0x8F, *pVBInfo->pCR8F); /* CR8F */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200546
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800547 for (j = 0; j <= 6; j++) /* CR90 - CR96 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200548 xgifb_reg_set(P3d4, (0x90 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300549 pVBInfo->CR40[14 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200550
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800551 for (j = 0; j <= 2; j++) /* CRC3 - CRC5 */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200552 xgifb_reg_set(P3d4, (0xC3 + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300553 pVBInfo->CR40[21 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200554
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800555 for (j = 0; j < 2; j++) /* CR8A - CR8B */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200556 xgifb_reg_set(P3d4, (0x8A + j),
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300557 pVBInfo->CR40[1 + j][pVBInfo->ram_type]);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200558
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800559 if ((HwDeviceExtension->jChipType == XG41) ||
560 (HwDeviceExtension->jChipType == XG42))
Aaro Koskinen8104e322011-03-13 12:26:22 +0200561 xgifb_reg_set(P3d4, 0x8C, 0x87);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200562
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300563 xgifb_reg_set(P3d4,
564 0x59,
565 pVBInfo->CR40[4][pVBInfo->ram_type]); /* CR59 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200566
Aaro Koskinen8104e322011-03-13 12:26:22 +0200567 xgifb_reg_set(P3d4, 0x83, 0x09); /* CR83 */
568 xgifb_reg_set(P3d4, 0x87, 0x00); /* CR87 */
569 xgifb_reg_set(P3d4, 0xCF, *pVBInfo->pCRCF); /* CRCF */
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300570 if (pVBInfo->ram_type) {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200571 /* xgifb_reg_set(P3c4, 0x17, 0xC0); */ /* SR17 DDRII */
572 xgifb_reg_set(P3c4, 0x17, 0x80); /* SR17 DDRII */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530573 if (HwDeviceExtension->jChipType == XG27)
Aaro Koskinen8104e322011-03-13 12:26:22 +0200574 xgifb_reg_set(P3c4, 0x17, 0x02); /* SR17 DDRII */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200575
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530576 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200577 xgifb_reg_set(P3c4, 0x17, 0x00); /* SR17 DDR */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530578 }
Aaro Koskinen8104e322011-03-13 12:26:22 +0200579 xgifb_reg_set(P3c4, 0x1A, 0x87); /* SR1A */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200580
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530581 temp = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
582 if (temp == 0) {
583 XGINew_DDR1x_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
584 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200585 xgifb_reg_set(P3d4, 0xB0, 0x80); /* DDRII Dual frequency mode */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530586 XGINew_DDR2_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
587 }
Aaro Koskinen2af1a292011-10-11 21:47:31 +0300588 xgifb_reg_set(P3c4,
589 0x1B,
590 pVBInfo->SR15[3][pVBInfo->ram_type]); /* SR1B */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200591}
592
Randy Dunlap89229672010-08-10 08:46:44 -0700593static void XGINew_SetDRAMSizingType(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300594 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530595 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200596{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530597 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200598
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530599 data = DRAMTYPE_TABLE[index][4];
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200600 xgifb_reg_and_or(pVBInfo->P3c4, 0x13, 0x80, data);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200601 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530602 /* should delay 50 ns */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200603}
604
Randy Dunlap89229672010-08-10 08:46:44 -0700605static unsigned short XGINew_SetDRAMSizeReg(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300606 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530607 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200608{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530609 unsigned short data = 0, memsize = 0;
610 int RankSize;
611 unsigned char ChannelNo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200612
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300613 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 32;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200614 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530615 data &= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200616
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530617 if (data == 0x80)
618 RankSize *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200619
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530620 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200621
Aaro Koskinenee055a42011-10-11 21:47:32 +0300622 if (pVBInfo->ram_channel == 3)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530623 ChannelNo = 4;
624 else
Aaro Koskinenee055a42011-10-11 21:47:32 +0300625 ChannelNo = pVBInfo->ram_channel;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200626
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530627 if (ChannelNo * RankSize <= 256) {
628 while ((RankSize >>= 1) > 0)
629 data += 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200630
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530631 memsize = data >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200632
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530633 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800634 xgifb_reg_set(pVBInfo->P3c4,
635 0x14,
636 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
637 (data & 0xF0));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200638
Aaro Koskinenee055a42011-10-11 21:47:32 +0300639 /* data |= pVBInfo->ram_channel << 2; */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300640 /* data |= (pVBInfo->ram_bus / 64) << 1; */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200641 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200642
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530643 /* should delay */
644 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
645 }
646 return memsize;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200647}
648
Randy Dunlap89229672010-08-10 08:46:44 -0700649static unsigned short XGINew_SetDRAMSize20Reg(int index,
Aaro Koskinen4397c7f2011-10-11 21:47:34 +0300650 const unsigned short DRAMTYPE_TABLE[][5],
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530651 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200652{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530653 unsigned short data = 0, memsize = 0;
654 int RankSize;
655 unsigned char ChannelNo;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200656
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300657 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200658 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530659 data &= 0x80;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200660
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530661 if (data == 0x80)
662 RankSize *= 2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200663
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530664 data = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200665
Aaro Koskinenee055a42011-10-11 21:47:32 +0300666 if (pVBInfo->ram_channel == 3)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530667 ChannelNo = 4;
668 else
Aaro Koskinenee055a42011-10-11 21:47:32 +0300669 ChannelNo = pVBInfo->ram_channel;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200670
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530671 if (ChannelNo * RankSize <= 256) {
672 while ((RankSize >>= 1) > 0)
673 data += 0x10;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200674
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530675 memsize = data >> 4;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200676
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530677 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800678 xgifb_reg_set(pVBInfo->P3c4,
679 0x14,
680 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
681 (data & 0xF0));
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200682 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200683
Aaro Koskinenee055a42011-10-11 21:47:32 +0300684 /* data |= pVBInfo->ram_channel << 2; */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300685 /* data |= (pVBInfo->ram_bus / 64) << 1; */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200686 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200687
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530688 /* should delay */
689 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
690 }
691 return memsize;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200692}
693
Randy Dunlap89229672010-08-10 08:46:44 -0700694static int XGINew_ReadWriteRest(unsigned short StopAddr,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530695 unsigned short StartAddr, struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200696{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530697 int i;
698 unsigned long Position = 0;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300699 void __iomem *fbaddr = pVBInfo->FBAddr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200700
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300701 writel(Position, fbaddr + Position);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200702
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530703 for (i = StartAddr; i <= StopAddr; i++) {
704 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300705 writel(Position, fbaddr + Position);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530706 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200707
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800708 udelay(500); /* [Vicent] 2004/04/16.
709 Fix #1759 Memory Size error in Multi-Adapter. */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200710
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530711 Position = 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200712
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300713 if (readl(fbaddr + Position) != Position)
Bill Pembertonfc3678a2010-06-17 13:10:44 -0400714 return 0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530715
716 for (i = StartAddr; i <= StopAddr; i++) {
717 Position = 1 << i;
Aaro Koskinenc44fa622011-09-13 22:49:33 +0300718 if (readl(fbaddr + Position) != Position)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530719 return 0;
720 }
721 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200722}
723
Randy Dunlap89229672010-08-10 08:46:44 -0700724static unsigned char XGINew_CheckFrequence(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200725{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530726 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200727
Aaro Koskinen58839b02011-03-13 12:26:23 +0200728 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200729
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530730 if ((data & 0x10) == 0) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200731 data = xgifb_reg_get(pVBInfo->P3c4, 0x39);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530732 data = (data & 0x02) >> 1;
733 return data;
734 } else {
735 return data & 0x01;
736 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200737}
738
Randy Dunlap89229672010-08-10 08:46:44 -0700739static void XGINew_CheckChannel(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530740 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200741{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530742 unsigned char data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200743
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530744 switch (HwDeviceExtension->jChipType) {
745 case XG20:
746 case XG21:
Aaro Koskinen58839b02011-03-13 12:26:23 +0200747 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530748 data = data & 0x01;
Aaro Koskinenee055a42011-10-11 21:47:32 +0300749 pVBInfo->ram_channel = 1; /* XG20 "JUST" one channel */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200750
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530751 if (data == 0) { /* Single_32_16 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200752
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530753 if ((HwDeviceExtension->ulVideoMemorySize - 1)
754 > 0x1000000) {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200755
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300756 pVBInfo->ram_bus = 32; /* 32 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800757 /* 22bit + 2 rank + 32bit */
758 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200759 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200760 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200761
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530762 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
763 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200764
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800765 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
766 0x800000) {
767 /* 22bit + 1 rank + 32bit */
768 xgifb_reg_set(pVBInfo->P3c4,
769 0x13,
770 0x31);
771 xgifb_reg_set(pVBInfo->P3c4,
772 0x14,
773 0x42);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200774 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200775
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800776 if (XGINew_ReadWriteRest(23,
777 23,
778 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530779 return;
780 }
781 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200782
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800783 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
784 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300785 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800786 /* 22bit + 2 rank + 16bit */
787 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200788 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200789 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200790
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530791 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
792 return;
793 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800794 xgifb_reg_set(pVBInfo->P3c4,
795 0x13,
796 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200797 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530798 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200799
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530800 } else { /* Dual_16_8 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800801 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
802 0x800000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300803 pVBInfo->ram_bus = 16; /* 16 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800804 /* (0x31:12x8x2) 22bit + 2 rank */
805 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
806 /* 0x41:16Mx16 bit*/
807 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200808 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200809
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530810 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
811 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200812
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800813 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
814 0x400000) {
815 /* (0x31:12x8x2) 22bit + 1 rank */
816 xgifb_reg_set(pVBInfo->P3c4,
817 0x13,
818 0x31);
819 /* 0x31:8Mx16 bit*/
820 xgifb_reg_set(pVBInfo->P3c4,
821 0x14,
822 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200823 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200824
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800825 if (XGINew_ReadWriteRest(22,
826 22,
827 pVBInfo) == 1)
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530828 return;
829 }
830 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200831
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800832 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
833 0x400000) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300834 pVBInfo->ram_bus = 8; /* 8 bits */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800835 /* (0x31:12x8x2) 22bit + 2 rank */
836 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
837 /* 0x30:8Mx8 bit*/
838 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200839 udelay(15);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200840
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530841 if (XGINew_ReadWriteRest(22, 21, pVBInfo) == 1)
842 return;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +0800843 else /* (0x31:12x8x2) 22bit + 1 rank */
844 xgifb_reg_set(pVBInfo->P3c4,
845 0x13,
846 0x31);
Aaro Koskinenc45715b2011-03-13 12:26:15 +0200847 udelay(15);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530848 }
849 }
850 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200851
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530852 case XG27:
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300853 pVBInfo->ram_bus = 16; /* 16 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300854 pVBInfo->ram_channel = 1; /* Single channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200855 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x51); /* 32Mx16 bit*/
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530856 break;
857 case XG41:
858 if (XGINew_CheckFrequence(pVBInfo) == 1) {
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300859 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300860 pVBInfo->ram_channel = 3; /* Quad Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200861 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
862 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200863
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530864 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
865 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200866
Aaro Koskinenee055a42011-10-11 21:47:32 +0300867 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200868 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200869
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530870 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
871 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200872
Aaro Koskinen8104e322011-03-13 12:26:22 +0200873 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x49);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200874
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530875 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
876 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200877
Aaro Koskinenee055a42011-10-11 21:47:32 +0300878 pVBInfo->ram_channel = 3;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200879 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
880 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200881
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530882 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
883 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200884
Aaro Koskinen8104e322011-03-13 12:26:22 +0200885 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200886
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530887 if (XGINew_ReadWriteRest(8, 4, pVBInfo) == 1)
888 return;
889 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200890 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x39);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530891 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300892 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300893 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200894 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
895 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200896
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530897 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1)
898 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200899
Aaro Koskinenee055a42011-10-11 21:47:32 +0300900 pVBInfo->ram_channel = 1; /* Single channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200901 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200902
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530903 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
904 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200905
Aaro Koskinen8104e322011-03-13 12:26:22 +0200906 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x53);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200907
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530908 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
909 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200910
Aaro Koskinenee055a42011-10-11 21:47:32 +0300911 pVBInfo->ram_channel = 2; /* Dual channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200912 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
913 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200914
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530915 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
916 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200917
Aaro Koskinenee055a42011-10-11 21:47:32 +0300918 pVBInfo->ram_channel = 1; /* Single channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200919 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200920
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530921 if (XGINew_ReadWriteRest(8, 4, pVBInfo) == 1)
922 return;
923 else
Aaro Koskinen8104e322011-03-13 12:26:22 +0200924 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x43);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530925 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200926
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530927 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200928
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530929 case XG42:
930 /*
931 XG42 SR14 D[3] Reserve
932 D[2] = 1, Dual Channel
933 = 0, Single Channel
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200934
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530935 It's Different from Other XG40 Series.
936 */
937 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII, DDR2x */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300938 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300939 pVBInfo->ram_channel = 2; /* 2 Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200940 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
941 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x44);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200942
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530943 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
944 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200945
Aaro Koskinen8104e322011-03-13 12:26:22 +0200946 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
947 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x34);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530948 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
949 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200950
Aaro Koskinenee055a42011-10-11 21:47:32 +0300951 pVBInfo->ram_channel = 1; /* Single Channel */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200952 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
953 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x40);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200954
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530955 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
956 return;
957 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200958 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
959 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530960 }
961 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300962 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300963 pVBInfo->ram_channel = 1; /* 1 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200964 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
965 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200966
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530967 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
968 return;
969 else {
Aaro Koskinen8104e322011-03-13 12:26:22 +0200970 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
971 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530972 }
973 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200974
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530975 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200976
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530977 default: /* XG40 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200978
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530979 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +0300980 pVBInfo->ram_bus = 32; /* 32 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +0300981 pVBInfo->ram_channel = 3;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200982 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
983 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200984
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530985 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
986 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200987
Aaro Koskinenee055a42011-10-11 21:47:32 +0300988 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +0200989 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200990
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530991 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
992 return;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200993
Aaro Koskinen8104e322011-03-13 12:26:22 +0200994 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
995 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200996
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530997 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1) {
Aaro Koskinenee055a42011-10-11 21:47:32 +0300998 pVBInfo->ram_channel = 3; /* 4 channels */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +0530999 } else {
Aaro Koskinenee055a42011-10-11 21:47:32 +03001000 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001001 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301002 }
1003 } else { /* DDR */
Aaro Koskinen2f0f3952011-10-11 21:47:33 +03001004 pVBInfo->ram_bus = 64; /* 64 bits */
Aaro Koskinenee055a42011-10-11 21:47:32 +03001005 pVBInfo->ram_channel = 2; /* 2 channels */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001006 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
1007 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001008
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301009 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1) {
1010 return;
1011 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001012 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
1013 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301014 }
1015 }
1016 break;
1017 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001018}
1019
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001020static int XGINew_DDRSizing340(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301021 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001022{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301023 int i;
1024 unsigned short memsize, addr;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001025
Aaro Koskinen8104e322011-03-13 12:26:22 +02001026 xgifb_reg_set(pVBInfo->P3c4, 0x15, 0x00); /* noninterleaving */
1027 xgifb_reg_set(pVBInfo->P3c4, 0x1C, 0x00); /* nontiling */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301028 XGINew_CheckChannel(HwDeviceExtension, pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001029
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301030 if (HwDeviceExtension->jChipType >= XG20) {
1031 for (i = 0; i < 12; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001032 XGINew_SetDRAMSizingType(i,
1033 XGINew_DDRDRAM_TYPE20,
1034 pVBInfo);
1035 memsize = XGINew_SetDRAMSize20Reg(i,
1036 XGINew_DDRDRAM_TYPE20,
1037 pVBInfo);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301038 if (memsize == 0)
1039 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001040
Aaro Koskinenee055a42011-10-11 21:47:32 +03001041 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001042 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
1043 (unsigned long) (1 << addr))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301044 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001045
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301046 if (XGINew_ReadWriteRest(addr, 5, pVBInfo) == 1)
1047 return 1;
1048 }
1049 } else {
1050 for (i = 0; i < 4; i++) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001051 XGINew_SetDRAMSizingType(i,
1052 XGINew_DDRDRAM_TYPE340,
1053 pVBInfo);
1054 memsize = XGINew_SetDRAMSizeReg(i,
1055 XGINew_DDRDRAM_TYPE340,
1056 pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001057
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301058 if (memsize == 0)
1059 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001060
Aaro Koskinenee055a42011-10-11 21:47:32 +03001061 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001062 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
1063 (unsigned long) (1 << addr))
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301064 continue;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001065
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301066 if (XGINew_ReadWriteRest(addr, 9, pVBInfo) == 1)
1067 return 1;
1068 }
1069 }
1070 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001071}
1072
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001073static void XGINew_SetDRAMSize_340(struct xgifb_video_info *xgifb_info,
1074 struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301075 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001076{
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001077 unsigned short data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001078
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001079 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001080
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001081 XGISetModeNew(xgifb_info, HwDeviceExtension, 0x2e);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001082
Aaro Koskinen58839b02011-03-13 12:26:23 +02001083 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001084 /* disable read cache */
1085 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data & 0xDF));
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001086 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001087
Aaro Koskinen58839b02011-03-13 12:26:23 +02001088 /* data = xgifb_reg_get(pVBInfo->P3c4, 0x1); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001089 /* data |= 0x20 ; */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001090 /* xgifb_reg_set(pVBInfo->P3c4, 0x01, data); *//* Turn OFF Display */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001091 XGINew_DDRSizing340(HwDeviceExtension, pVBInfo);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001092 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001093 /* enable read cache */
1094 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data | 0x20));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001095}
1096
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001097static u8 *xgifb_copy_rom(struct pci_dev *dev, size_t *rom_size)
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001098{
1099 void __iomem *rom_address;
Aaro Koskinen82986dd2011-12-06 00:10:39 +02001100 u8 *rom_copy;
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001101
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001102 rom_address = pci_map_rom(dev, rom_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001103 if (rom_address == NULL)
1104 return NULL;
1105
1106 rom_copy = vzalloc(XGIFB_ROM_SIZE);
1107 if (rom_copy == NULL)
1108 goto done;
1109
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001110 *rom_size = min_t(size_t, *rom_size, XGIFB_ROM_SIZE);
1111 memcpy_fromio(rom_copy, rom_address, *rom_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001112
1113done:
1114 pci_unmap_rom(dev, rom_address);
1115 return rom_copy;
1116}
1117
Aaro Koskinen4e6f4032011-12-06 00:10:42 +02001118static void xgifb_read_vbios(struct pci_dev *pdev,
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001119 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001120{
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001121 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
Aaro Koskinen82986dd2011-12-06 00:10:39 +02001122 u8 *vbios;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301123 unsigned long i;
Aaro Koskinend1805b32011-12-06 00:10:41 +02001124 unsigned char j;
Aaro Koskinen97f45322011-12-06 00:10:34 +02001125 struct XGI21_LVDSCapStruct *lvds;
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001126 size_t vbios_size;
Aaro Koskinend1805b32011-12-06 00:10:41 +02001127 int entry;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001128
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001129 if (xgifb_info->chip != XG21)
Aaro Koskinenbd761272011-12-06 00:10:31 +02001130 return;
1131 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001132 vbios = xgifb_copy_rom(pdev, &vbios_size);
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001133 if (vbios == NULL) {
1134 dev_err(&pdev->dev, "video BIOS not available\n");
Aaro Koskinenbd761272011-12-06 00:10:31 +02001135 return;
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001136 }
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001137 if (vbios_size <= 0x65)
1138 goto error;
Aaro Koskinen25aa75f2011-12-06 00:10:48 +02001139 /*
1140 * The user can ignore the LVDS bit in the BIOS and force the display
1141 * type.
1142 */
1143 if (!(vbios[0x65] & 0x1) &&
1144 (!xgifb_info->display2_force ||
1145 xgifb_info->display2 != XGIFB_DISP_LCD)) {
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001146 vfree(vbios);
1147 return;
1148 }
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001149 if (vbios_size <= 0x317)
1150 goto error;
Aaro Koskinen4b21d992011-12-06 00:10:33 +02001151 i = vbios[0x316] | (vbios[0x317] << 8);
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001152 if (vbios_size <= i - 1)
1153 goto error;
Aaro Koskinen4b21d992011-12-06 00:10:33 +02001154 j = vbios[i - 1];
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001155 if (j == 0)
1156 goto error;
Aaro Koskinenbd761272011-12-06 00:10:31 +02001157 if (j == 0xff)
1158 j = 1;
Aaro Koskinend1805b32011-12-06 00:10:41 +02001159 /*
1160 * Read the LVDS table index scratch register set by the BIOS.
1161 */
1162 entry = xgifb_reg_get(xgifb_info->dev_info.P3d4, 0x36);
1163 if (entry >= j)
1164 entry = 0;
1165 i += entry * 25;
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001166 lvds = &xgifb_info->lvds_data;
Aaro Koskinend1805b32011-12-06 00:10:41 +02001167 if (vbios_size <= i + 24)
1168 goto error;
1169 lvds->LVDS_Capability = vbios[i] | (vbios[i + 1] << 8);
1170 lvds->LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
1171 lvds->LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
1172 lvds->LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
1173 lvds->LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
1174 lvds->LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
1175 lvds->LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
1176 lvds->LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
1177 lvds->LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
1178 lvds->VCLKData1 = vbios[i + 18];
1179 lvds->VCLKData2 = vbios[i + 19];
1180 lvds->PSC_S1 = vbios[i + 20];
1181 lvds->PSC_S2 = vbios[i + 21];
1182 lvds->PSC_S3 = vbios[i + 22];
1183 lvds->PSC_S4 = vbios[i + 23];
1184 lvds->PSC_S5 = vbios[i + 24];
Aaro Koskinen02a81dd2011-12-06 00:10:36 +02001185 vfree(vbios);
Aaro Koskinen08ce2392011-12-06 00:10:40 +02001186 pVBInfo->IF_DEF_LVDS = 1;
1187 return;
1188error:
1189 dev_err(&pdev->dev, "video BIOS corrupted\n");
1190 vfree(vbios);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001191}
1192
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001193static void XGINew_ChkSenseStatus(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301194 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001195{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301196 unsigned short tempbx = 0, temp, tempcx, CR3CData;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001197
Aaro Koskinen58839b02011-03-13 12:26:23 +02001198 temp = xgifb_reg_get(pVBInfo->P3d4, 0x32);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001199
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301200 if (temp & Monitor1Sense)
1201 tempbx |= ActiveCRT1;
1202 if (temp & LCDSense)
1203 tempbx |= ActiveLCD;
1204 if (temp & Monitor2Sense)
1205 tempbx |= ActiveCRT2;
1206 if (temp & TVSense) {
1207 tempbx |= ActiveTV;
1208 if (temp & AVIDEOSense)
1209 tempbx |= (ActiveAVideo << 8);
1210 if (temp & SVIDEOSense)
1211 tempbx |= (ActiveSVideo << 8);
1212 if (temp & SCARTSense)
1213 tempbx |= (ActiveSCART << 8);
1214 if (temp & HiTVSense)
1215 tempbx |= (ActiveHiTV << 8);
1216 if (temp & YPbPrSense)
1217 tempbx |= (ActiveYPbPr << 8);
1218 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001219
Aaro Koskinen58839b02011-03-13 12:26:23 +02001220 tempcx = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1221 tempcx |= (xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001222
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301223 if (tempbx & tempcx) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001224 CR3CData = xgifb_reg_get(pVBInfo->P3d4, 0x3c);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301225 if (!(CR3CData & DisplayDeviceFromCMOS)) {
1226 tempcx = 0x1FF0;
1227 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1228 tempbx = 0x1FF0;
1229 }
1230 } else {
1231 tempcx = 0x1FF0;
1232 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1233 tempbx = 0x1FF0;
1234 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001235
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301236 tempbx &= tempcx;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001237 xgifb_reg_set(pVBInfo->P3d4, 0x3d, (tempbx & 0x00FF));
1238 xgifb_reg_set(pVBInfo->P3d4, 0x3e, ((tempbx & 0xFF00) >> 8));
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001239}
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301240
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001241static void XGINew_SetModeScratch(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301242 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001243{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301244 unsigned short temp, tempcl = 0, tempch = 0, CR31Data, CR38Data;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001245
Aaro Koskinen58839b02011-03-13 12:26:23 +02001246 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1247 temp |= xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8;
1248 temp |= (xgifb_reg_get(pVBInfo->P3d4, 0x31) & (DriverMode >> 8)) << 8;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001249
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301250 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
1251 if (temp & ActiveCRT2)
1252 tempcl = SetCRT2ToRAMDAC;
1253 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001254
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301255 if (temp & ActiveLCD) {
1256 tempcl |= SetCRT2ToLCD;
1257 if (temp & DriverMode) {
1258 if (temp & ActiveTV) {
1259 tempch = SetToLCDA | EnableDualEdge;
1260 temp ^= SetCRT2ToLCD;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001261
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301262 if ((temp >> 8) & ActiveAVideo)
1263 tempcl |= SetCRT2ToAVIDEO;
1264 if ((temp >> 8) & ActiveSVideo)
1265 tempcl |= SetCRT2ToSVIDEO;
1266 if ((temp >> 8) & ActiveSCART)
1267 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001268
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301269 if (pVBInfo->IF_DEF_HiVision == 1) {
1270 if ((temp >> 8) & ActiveHiTV)
Peter Huewe599801f2012-02-09 21:11:45 +01001271 tempcl |= SetCRT2ToHiVision;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301272 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001273
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301274 if (pVBInfo->IF_DEF_YPbPr == 1) {
1275 if ((temp >> 8) & ActiveYPbPr)
1276 tempch |= SetYPbPr;
1277 }
1278 }
1279 }
1280 } else {
1281 if ((temp >> 8) & ActiveAVideo)
1282 tempcl |= SetCRT2ToAVIDEO;
1283 if ((temp >> 8) & ActiveSVideo)
1284 tempcl |= SetCRT2ToSVIDEO;
1285 if ((temp >> 8) & ActiveSCART)
1286 tempcl |= SetCRT2ToSCART;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001287
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301288 if (pVBInfo->IF_DEF_HiVision == 1) {
1289 if ((temp >> 8) & ActiveHiTV)
Peter Huewe599801f2012-02-09 21:11:45 +01001290 tempcl |= SetCRT2ToHiVision;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301291 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001292
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301293 if (pVBInfo->IF_DEF_YPbPr == 1) {
1294 if ((temp >> 8) & ActiveYPbPr)
1295 tempch |= SetYPbPr;
1296 }
1297 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001298
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301299 tempcl |= SetSimuScanMode;
1300 if ((!(temp & ActiveCRT1)) && ((temp & ActiveLCD) || (temp & ActiveTV)
1301 || (temp & ActiveCRT2)))
Peter Huewe6896b942012-02-09 21:11:46 +01001302 tempcl ^= (SetSimuScanMode | SwitchCRT2);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301303 if ((temp & ActiveLCD) && (temp & ActiveTV))
Peter Huewe6896b942012-02-09 21:11:46 +01001304 tempcl ^= (SetSimuScanMode | SwitchCRT2);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001305 xgifb_reg_set(pVBInfo->P3d4, 0x30, tempcl);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001306
Aaro Koskinen58839b02011-03-13 12:26:23 +02001307 CR31Data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301308 CR31Data &= ~(SetNotSimuMode >> 8);
1309 if (!(temp & ActiveCRT1))
1310 CR31Data |= (SetNotSimuMode >> 8);
1311 CR31Data &= ~(DisableCRT2Display >> 8);
1312 if (!((temp & ActiveLCD) || (temp & ActiveTV) || (temp & ActiveCRT2)))
1313 CR31Data |= (DisableCRT2Display >> 8);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001314 xgifb_reg_set(pVBInfo->P3d4, 0x31, CR31Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001315
Aaro Koskinen58839b02011-03-13 12:26:23 +02001316 CR38Data = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301317 CR38Data &= ~SetYPbPr;
1318 CR38Data |= tempch;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001319 xgifb_reg_set(pVBInfo->P3d4, 0x38, CR38Data);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001320
1321}
1322
Aaro Koskinen40544b02011-11-13 00:09:25 +02001323static unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
1324 *HwDeviceExtension,
1325 struct vb_device_info *pVBInfo)
1326{
1327 unsigned short temp;
1328
1329 /* add lcd sense */
1330 if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN) {
1331 return 0;
1332 } else {
1333 temp = (unsigned short) HwDeviceExtension->ulCRT2LCDType;
1334 switch (HwDeviceExtension->ulCRT2LCDType) {
1335 case LCD_INVALID:
1336 case LCD_800x600:
1337 case LCD_1024x768:
1338 case LCD_1280x1024:
1339 break;
1340
1341 case LCD_640x480:
1342 case LCD_1024x600:
1343 case LCD_1152x864:
1344 case LCD_1280x960:
1345 case LCD_1152x768:
1346 temp = 0;
1347 break;
1348
1349 case LCD_1400x1050:
1350 case LCD_1280x768:
1351 case LCD_1600x1200:
1352 break;
1353
1354 case LCD_1920x1440:
1355 case LCD_2048x1536:
1356 temp = 0;
1357 break;
1358
1359 default:
1360 break;
1361 }
1362 xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp);
1363 return 1;
1364 }
1365}
1366
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001367static void XGINew_GetXG21Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301368 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001369{
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301370 unsigned char Temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001371
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001372#if 1
Aaro Koskinenc4ffaa42011-12-06 00:10:35 +02001373 if (pVBInfo->IF_DEF_LVDS) { /* For XG21 LVDS */
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001374 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001375 /* LVDS on chip */
1376 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301377 } else {
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001378#endif
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001379 /* Enable GPIOA/B read */
1380 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001381 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0xC0;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301382 if (Temp == 0xC0) { /* DVI & DVO GPIOA/B pull high */
1383 XGINew_SenseLCD(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001384 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001385 /* Enable read GPIOF */
1386 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x20, 0x20);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001387 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04;
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301388 if (!Temp)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001389 xgifb_reg_and_or(pVBInfo->P3d4,
1390 0x38,
1391 ~0xE0,
1392 0x80); /* TMDS on chip */
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301393 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001394 xgifb_reg_and_or(pVBInfo->P3d4,
1395 0x38,
1396 ~0xE0,
1397 0xA0); /* Only DVO on chip */
1398 /* Disable read GPIOF */
1399 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301400 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001401#if 1
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301402 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001403#endif
1404}
1405
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001406static void XGINew_GetXG27Sense(struct xgi_hw_device_info *HwDeviceExtension,
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301407 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001408{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001409 unsigned char Temp, bCR4A;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001410
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301411 pVBInfo->IF_DEF_LVDS = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001412 bCR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001413 /* Enable GPIOA/B/C read */
1414 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x07, 0x07);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001415 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x07;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001416 xgifb_reg_set(pVBInfo->P3d4, 0x4A, bCR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001417
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301418 if (Temp <= 0x02) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001419 /* LVDS setting */
1420 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001421 xgifb_reg_set(pVBInfo->P3d4, 0x30, 0x21);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301422 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001423 /* TMDS/DVO setting */
1424 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xA0);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301425 }
Aaro Koskinenb9bf6e42011-03-13 12:26:24 +02001426 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001427
1428}
1429
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001430static unsigned char GetXG21FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001431{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001432 unsigned char CR38, CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001433
Aaro Koskinen58839b02011-03-13 12:26:23 +02001434 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001435 /* enable GPIOE read */
1436 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x10, 0x10);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001437 CR38 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301438 temp = 0;
1439 if ((CR38 & 0xE0) > 0x80) {
Aaro Koskinen58839b02011-03-13 12:26:23 +02001440 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301441 temp &= 0x08;
1442 temp >>= 3;
1443 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001444
Aaro Koskinen8104e322011-03-13 12:26:22 +02001445 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001446
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301447 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001448}
1449
Aaro Koskinene0cc8a62011-03-08 22:16:20 +02001450static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001451{
Bill Pemberton108afbf2010-06-17 13:10:47 -04001452 unsigned char CR4A, temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001453
Aaro Koskinen58839b02011-03-13 12:26:23 +02001454 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001455 /* enable GPIOA/B/C read */
1456 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
Aaro Koskinen58839b02011-03-13 12:26:23 +02001457 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301458 if (temp <= 2)
1459 temp &= 0x03;
1460 else
1461 temp = ((temp & 0x04) >> 1) || ((~temp) & 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001462
Aaro Koskinen8104e322011-03-13 12:26:22 +02001463 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
Prashant P. Shaha24d60f2010-09-02 15:25:38 +05301464
1465 return temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02001466}
1467
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001468unsigned char XGIInitNew(struct pci_dev *pdev)
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001469{
Aaro Koskinenab886ff2011-10-11 21:47:18 +03001470 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001471 struct xgi_hw_device_info *HwDeviceExtension = &xgifb_info->hw_info;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001472 struct vb_device_info VBINF;
1473 struct vb_device_info *pVBInfo = &VBINF;
1474 unsigned char i, temp = 0, temp1;
1475 /* VBIOSVersion[5]; */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001476
1477 /* unsigned long j, k; */
1478
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001479 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
1480
1481 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
1482
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001483 /* Newdebugcode(0x99); */
1484
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001485 if (pVBInfo->FBAddr == NULL) {
1486 printk("\n pVBInfo->FBAddr == 0 ");
1487 return 0;
1488 }
1489 printk("1");
1490 if (pVBInfo->BaseAddr == 0) {
1491 printk("\npVBInfo->BaseAddr == 0 ");
1492 return 0;
1493 }
1494 printk("2");
1495
Aaro Koskinenefdf4ee2011-03-13 12:26:20 +02001496 outb(0x67, (pVBInfo->BaseAddr + 0x12)); /* 3c2 <- 67 ,ynlai */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001497
1498 pVBInfo->ISXPDOS = 0;
1499 printk("3");
1500
1501 printk("4");
1502
1503 /* VBIOSVersion[4] = 0x0; */
1504
1505 /* 09/07/99 modify by domao */
1506
1507 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
1508 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
1509 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
1510 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
1511 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
1512 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
1513 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
1514 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
1515 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
1516 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
1517 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
1518 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
Peter Huewe6896b942012-02-09 21:11:46 +01001519 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
1520 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
1521 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
1522 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
1523 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001524 printk("5");
1525
1526 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001527 /* Run XGI_GetVBType before InitTo330Pointer */
1528 XGI_GetVBType(pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001529
1530 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
1531
Aaro Koskinen4e6f4032011-12-06 00:10:42 +02001532 xgifb_read_vbios(pdev, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001533
1534 /* 1.Openkey */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001535 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001536 printk("6");
1537
1538 /* GetXG21Sense (GPIO) */
1539 if (HwDeviceExtension->jChipType == XG21)
1540 XGINew_GetXG21Sense(HwDeviceExtension, pVBInfo);
1541
1542 if (HwDeviceExtension->jChipType == XG27)
1543 XGINew_GetXG27Sense(HwDeviceExtension, pVBInfo);
1544
1545 printk("7");
1546
1547 /* 2.Reset Extended register */
1548
1549 for (i = 0x06; i < 0x20; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001550 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001551
1552 for (i = 0x21; i <= 0x27; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001553 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001554
1555 /* for(i = 0x06; i <= 0x27; i++) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001556 /* xgifb_reg_set(pVBInfo->P3c4, i, 0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001557
1558 printk("8");
1559
Aaro Koskinen06587332011-03-13 12:26:10 +02001560 for (i = 0x31; i <= 0x3B; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001561 xgifb_reg_set(pVBInfo->P3c4, i, 0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001562 printk("9");
1563
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001564 /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
1565 if (HwDeviceExtension->jChipType == XG42)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001566 xgifb_reg_set(pVBInfo->P3c4, 0x3B, 0xC0);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001567
1568 /* for (i = 0x30; i <= 0x3F; i++) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001569 /* xgifb_reg_set(pVBInfo->P3d4, i, 0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001570
1571 for (i = 0x79; i <= 0x7C; i++)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001572 xgifb_reg_set(pVBInfo->P3d4, i, 0); /* shampoo 0208 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001573
1574 printk("10");
1575
1576 if (HwDeviceExtension->jChipType >= XG20)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001577 xgifb_reg_set(pVBInfo->P3d4, 0x97, *pVBInfo->pXGINew_CR97);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001578
1579 /* 3.SetMemoryClock
1580
Aaro Koskinen2af1a292011-10-11 21:47:31 +03001581 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Aaro Koskinenfd0ad472011-03-13 12:26:09 +02001582 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001583
1584 printk("11");
1585
1586 /* 4.SetDefExt1Regs begin */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001587 xgifb_reg_set(pVBInfo->P3c4, 0x07, *pVBInfo->pSR07);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001588 if (HwDeviceExtension->jChipType == XG27) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001589 xgifb_reg_set(pVBInfo->P3c4, 0x40, *pVBInfo->pSR40);
1590 xgifb_reg_set(pVBInfo->P3c4, 0x41, *pVBInfo->pSR41);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001591 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02001592 xgifb_reg_set(pVBInfo->P3c4, 0x11, 0x0F);
1593 xgifb_reg_set(pVBInfo->P3c4, 0x1F, *pVBInfo->pSR1F);
1594 /* xgifb_reg_set(pVBInfo->P3c4, 0x20, 0x20); */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001595 /* alan, 2001/6/26 Frame buffer can read/write SR20 */
1596 xgifb_reg_set(pVBInfo->P3c4, 0x20, 0xA0);
1597 /* Hsuan, 2006/01/01 H/W request for slow corner chip */
1598 xgifb_reg_set(pVBInfo->P3c4, 0x36, 0x70);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001599 if (HwDeviceExtension->jChipType == XG27) /* Alan 12/07/2006 */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001600 xgifb_reg_set(pVBInfo->P3c4, 0x36, *pVBInfo->pSR36);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001601
1602 /* SR11 = 0x0F; */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001603 /* xgifb_reg_set(pVBInfo->P3c4, 0x11, SR11); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001604
1605 printk("12");
1606
1607 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001608 u32 Temp;
1609
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001610 /* Set AGP Rate */
1611 /*
Aaro Koskinen58839b02011-03-13 12:26:23 +02001612 temp1 = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001613 temp1 &= 0x02;
1614 if (temp1 == 0x02) {
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001615 outl(0x80000000, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001616 ChipsetID = inl(0x0cfc);
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001617 outl(0x8000002C, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001618 VendorID = inl(0x0cfc);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001619 VendorID &= 0x0000FFFF;
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001620 outl(0x8001002C, 0xcf8);
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001621 GraphicVendorID = inl(0x0cfc);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001622 GraphicVendorID &= 0x0000FFFF;
1623
1624 if (ChipsetID == 0x7301039)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001625 xgifb_reg_set(pVBInfo->P3d4, 0x5F, 0x09);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001626
1627 ChipsetID &= 0x0000FFFF;
1628
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001629 if ((ChipsetID == 0x700E) ||
1630 (ChipsetID == 0x1022) ||
1631 (ChipsetID == 0x1106) ||
1632 (ChipsetID == 0x10DE)) {
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001633 if (ChipsetID == 0x1106) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001634 if ((VendorID == 0x1019) &&
1635 (GraphicVendorID == 0x1019))
1636 xgifb_reg_set(pVBInfo->P3d4,
1637 0x5F,
1638 0x0D);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001639 else
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001640 xgifb_reg_set(pVBInfo->P3d4,
1641 0x5F,
1642 0x0B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001643 } else {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001644 xgifb_reg_set(pVBInfo->P3d4,
1645 0x5F,
1646 0x0B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001647 }
1648 }
1649 }
1650 */
1651
1652 printk("13");
1653
Aaro Koskinen06587332011-03-13 12:26:10 +02001654 /* Set AGP customize registers (in SetDefAGPRegs) Start */
1655 for (i = 0x47; i <= 0x4C; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001656 xgifb_reg_set(pVBInfo->P3d4,
1657 i,
1658 pVBInfo->AGPReg[i - 0x47]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001659
Aaro Koskinen06587332011-03-13 12:26:10 +02001660 for (i = 0x70; i <= 0x71; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001661 xgifb_reg_set(pVBInfo->P3d4,
1662 i,
1663 pVBInfo->AGPReg[6 + i - 0x70]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001664
Aaro Koskinen06587332011-03-13 12:26:10 +02001665 for (i = 0x74; i <= 0x77; i++)
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001666 xgifb_reg_set(pVBInfo->P3d4,
1667 i,
1668 pVBInfo->AGPReg[8 + i - 0x74]);
Aaro Koskinen06587332011-03-13 12:26:10 +02001669 /* Set AGP customize registers (in SetDefAGPRegs) End */
1670 /* [Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
Aaro Koskinen3d2a60a2011-03-13 12:26:21 +02001671 /* outl(0x80000000, 0xcf8); */
Aaro Koskinenf5b571f2011-03-13 12:26:19 +02001672 /* ChipsetID = inl(0x0cfc); */
Aaro Koskinen06587332011-03-13 12:26:10 +02001673 /* if (ChipsetID == 0x25308086) */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001674 /* xgifb_reg_set(pVBInfo->P3d4, 0x77, 0xF0); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001675
Aaro Koskinen6048d7612011-10-11 21:47:16 +03001676 pci_read_config_dword(pdev, 0x50, &Temp);
Aaro Koskinen06587332011-03-13 12:26:10 +02001677 Temp >>= 20;
1678 Temp &= 0xF;
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001679
Aaro Koskinen06587332011-03-13 12:26:10 +02001680 if (Temp == 1)
Aaro Koskinen8104e322011-03-13 12:26:22 +02001681 xgifb_reg_set(pVBInfo->P3d4, 0x48, 0x20); /* CR48 */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001682 printk("14");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001683 } /* != XG20 */
1684
1685 /* Set PCI */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001686 xgifb_reg_set(pVBInfo->P3c4, 0x23, *pVBInfo->pSR23);
1687 xgifb_reg_set(pVBInfo->P3c4, 0x24, *pVBInfo->pSR24);
1688 xgifb_reg_set(pVBInfo->P3c4, 0x25, pVBInfo->SR25[0]);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001689 printk("15");
1690
1691 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1692 /* Set VB */
1693 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001694 /* alan, disable VideoCapture */
1695 xgifb_reg_and_or(pVBInfo->Part0Port, 0x3F, 0xEF, 0x00);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001696 xgifb_reg_set(pVBInfo->Part1Port, 0x00, 0x00);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001697 /* chk if BCLK>=100MHz */
1698 temp1 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x7B);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001699 temp = (unsigned char) ((temp1 >> 4) & 0x0F);
1700
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001701 xgifb_reg_set(pVBInfo->Part1Port,
1702 0x02,
1703 (*pVBInfo->pCRT2Data_1_2));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001704
1705 printk("16");
1706
Aaro Koskinen8104e322011-03-13 12:26:22 +02001707 xgifb_reg_set(pVBInfo->Part1Port, 0x2E, 0x08); /* use VB */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001708 } /* != XG20 */
1709
Aaro Koskinen8104e322011-03-13 12:26:22 +02001710 xgifb_reg_set(pVBInfo->P3c4, 0x27, 0x1F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001711
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001712 if ((HwDeviceExtension->jChipType == XG42) &&
1713 XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo) != 0) {
1714 /* Not DDR */
1715 xgifb_reg_set(pVBInfo->P3c4,
1716 0x31,
1717 (*pVBInfo->pSR31 & 0x3F) | 0x40);
1718 xgifb_reg_set(pVBInfo->P3c4,
1719 0x32,
1720 (*pVBInfo->pSR32 & 0xFC) | 0x01);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001721 } else {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001722 xgifb_reg_set(pVBInfo->P3c4, 0x31, *pVBInfo->pSR31);
1723 xgifb_reg_set(pVBInfo->P3c4, 0x32, *pVBInfo->pSR32);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001724 }
Aaro Koskinen8104e322011-03-13 12:26:22 +02001725 xgifb_reg_set(pVBInfo->P3c4, 0x33, *pVBInfo->pSR33);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001726 printk("17");
1727
1728 /*
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001729 SetPowerConsume (HwDeviceExtension, pVBInfo->P3c4); */
1730
1731 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1732 if (XGI_BridgeIsOn(pVBInfo) == 1) {
1733 if (pVBInfo->IF_DEF_LVDS == 0) {
Aaro Koskinen8104e322011-03-13 12:26:22 +02001734 xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1C);
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001735 xgifb_reg_set(pVBInfo->Part4Port,
1736 0x0D,
1737 *pVBInfo->pCRT2Data_4_D);
1738 xgifb_reg_set(pVBInfo->Part4Port,
1739 0x0E,
1740 *pVBInfo->pCRT2Data_4_E);
1741 xgifb_reg_set(pVBInfo->Part4Port,
1742 0x10,
1743 *pVBInfo->pCRT2Data_4_10);
Aaro Koskinen8104e322011-03-13 12:26:22 +02001744 xgifb_reg_set(pVBInfo->Part4Port, 0x0F, 0x3F);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001745 }
1746
1747 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
1748 }
1749 } /* != XG20 */
1750 printk("18");
1751
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001752 printk("181");
1753
1754 printk("182");
1755
1756 XGI_SenseCRT1(pVBInfo);
1757
1758 printk("183");
1759 /* XGINew_DetectMonitor(HwDeviceExtension); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001760 if (HwDeviceExtension->jChipType == XG21) {
1761 printk("186");
1762
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001763 xgifb_reg_and_or(pVBInfo->P3d4,
1764 0x32,
1765 ~Monitor1Sense,
1766 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001767 temp = GetXG21FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001768 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x01, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001769 printk("187");
1770
1771 }
1772 if (HwDeviceExtension->jChipType == XG27) {
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001773 xgifb_reg_and_or(pVBInfo->P3d4,
1774 0x32,
1775 ~Monitor1Sense,
1776 Monitor1Sense); /* Z9 default has CRT */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001777 temp = GetXG27FPBits(pVBInfo);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +02001778 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x03, temp);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001779 }
1780 printk("19");
1781
Aaro Koskinen2af1a292011-10-11 21:47:31 +03001782 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001783
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001784 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension,
1785 pVBInfo->P3d4,
1786 pVBInfo);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001787
Aaro Koskinen06587332011-03-13 12:26:10 +02001788 printk("20");
Aaro Koskinenfab04b92011-12-06 00:10:45 +02001789 XGINew_SetDRAMSize_340(xgifb_info, HwDeviceExtension, pVBInfo);
Aaro Koskinen06587332011-03-13 12:26:10 +02001790 printk("21");
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001791
1792 printk("22");
1793
1794 /* SetDefExt2Regs begin */
1795 /*
1796 AGP = 1;
Aaro Koskinen58839b02011-03-13 12:26:23 +02001797 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x3A);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001798 temp &= 0x30;
1799 if (temp == 0x30)
1800 AGP = 0;
1801
1802 if (AGP == 0)
1803 *pVBInfo->pSR21 &= 0xEF;
1804
Aaro Koskinen8104e322011-03-13 12:26:22 +02001805 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001806 if (AGP == 1)
1807 *pVBInfo->pSR22 &= 0x20;
Aaro Koskinen8104e322011-03-13 12:26:22 +02001808 xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001809 */
1810 /* base = 0x80000000; */
1811 /* OutPortLong(0xcf8, base); */
1812 /* Temp = (InPortLong(0xcfc) & 0xFFFF); */
1813 /* if (Temp == 0x1039) { */
Kenji Toyamabf32fcb2011-04-23 12:11:16 +08001814 xgifb_reg_set(pVBInfo->P3c4,
1815 0x22,
1816 (unsigned char) ((*pVBInfo->pSR22) & 0xFE));
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001817 /* } else { */
Aaro Koskinen8104e322011-03-13 12:26:22 +02001818 /* xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22); */
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001819 /* } */
1820
Aaro Koskinen8104e322011-03-13 12:26:22 +02001821 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001822
1823 printk("23");
1824
1825 XGINew_ChkSenseStatus(HwDeviceExtension, pVBInfo);
1826 XGINew_SetModeScratch(HwDeviceExtension, pVBInfo);
1827
1828 printk("24");
1829
Aaro Koskinen8104e322011-03-13 12:26:22 +02001830 xgifb_reg_set(pVBInfo->P3d4, 0x8c, 0x87);
1831 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x31);
Aaro Koskinenb9ebf5e2011-03-13 12:26:06 +02001832 printk("25");
1833
1834 return 1;
1835} /* end of init */