1 #include <linux/delay.h> /* udelay */
2 #include <linux/vmalloc.h>
7 #include "vb_setmode.h"
9 static const unsigned short XGINew_DDRDRAM_TYPE340[4][5] = {
10 { 2, 13, 9, 64, 0x45},
11 { 2, 12, 9, 32, 0x35},
12 { 2, 12, 8, 16, 0x31},
13 { 2, 11, 8, 8, 0x21} };
15 static const unsigned short XGINew_DDRDRAM_TYPE20[12][5] = {
16 { 2, 14, 11, 128, 0x5D},
17 { 2, 14, 10, 64, 0x59},
18 { 2, 13, 11, 64, 0x4D},
19 { 2, 14, 9, 32, 0x55},
20 { 2, 13, 10, 32, 0x49},
21 { 2, 12, 11, 32, 0x3D},
22 { 2, 14, 8, 16, 0x51},
23 { 2, 13, 9, 16, 0x45},
24 { 2, 12, 10, 16, 0x39},
27 { 2, 12, 8, 4, 0x31} };
29 #define XGIFB_ROM_SIZE 65536
32 XGINew_GetXG20DRAMType(struct xgi_hw_device_info *HwDeviceExtension,
33 struct vb_device_info *pVBInfo)
35 unsigned char data, temp;
37 if (HwDeviceExtension->jChipType < XG20) {
38 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
39 data = *pVBInfo->pSoftSetting & 0x07;
42 data = xgifb_reg_get(pVBInfo->P3c4, 0x39) & 0x02;
44 data = (xgifb_reg_get(pVBInfo->P3c4, 0x3A) &
48 } else if (HwDeviceExtension->jChipType == XG27) {
49 if (*pVBInfo->pSoftSetting & SoftDRAMType) {
50 data = *pVBInfo->pSoftSetting & 0x07;
53 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
54 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
55 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
60 } else if (HwDeviceExtension->jChipType == XG21) {
61 /* Independent GPIO control */
62 xgifb_reg_and(pVBInfo->P3d4, 0xB4, ~0x02);
64 xgifb_reg_or(pVBInfo->P3d4, 0x4A, 0x80); /* Enable GPIOH read */
65 /* GPIOF 0:DVI 1:DVO */
66 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
68 /* for current XG20 & XG21, GPIOH is floating, driver will
69 * fix DDR temporarily */
70 if (temp & 0x01) /* DVI read GPIOH */
74 /* ~HOTPLUG_SUPPORT */
75 xgifb_reg_or(pVBInfo->P3d4, 0xB4, 0x02);
78 data = xgifb_reg_get(pVBInfo->P3d4, 0x97) & 0x01;
87 static void XGINew_DDR1x_MRS_340(unsigned long P3c4,
88 struct vb_device_info *pVBInfo)
90 xgifb_reg_set(P3c4, 0x18, 0x01);
91 xgifb_reg_set(P3c4, 0x19, 0x20);
92 xgifb_reg_set(P3c4, 0x16, 0x00);
93 xgifb_reg_set(P3c4, 0x16, 0x80);
95 if (*pVBInfo->pXGINew_DRAMTypeDefinition != 0x0C) { /* Samsung F Die */
97 xgifb_reg_set(P3c4, 0x18, 0x00);
98 xgifb_reg_set(P3c4, 0x19, 0x20);
99 xgifb_reg_set(P3c4, 0x16, 0x00);
100 xgifb_reg_set(P3c4, 0x16, 0x80);
106 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
107 xgifb_reg_set(P3c4, 0x19, 0x01);
108 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[0]);
109 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[1]);
111 xgifb_reg_set(P3c4, 0x1B, 0x03);
115 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
116 xgifb_reg_set(P3c4, 0x19, 0x00);
117 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[2]);
118 xgifb_reg_set(P3c4, 0x16, pVBInfo->SR16[3]);
119 xgifb_reg_set(P3c4, 0x1B, 0x00);
122 static void XGINew_SetMemoryClock(struct xgi_hw_device_info *HwDeviceExtension,
123 struct vb_device_info *pVBInfo)
126 xgifb_reg_set(pVBInfo->P3c4,
128 pVBInfo->MCLKData[pVBInfo->ram_type].SR28);
129 xgifb_reg_set(pVBInfo->P3c4,
131 pVBInfo->MCLKData[pVBInfo->ram_type].SR29);
132 xgifb_reg_set(pVBInfo->P3c4,
134 pVBInfo->MCLKData[pVBInfo->ram_type].SR2A);
136 xgifb_reg_set(pVBInfo->P3c4,
138 pVBInfo->ECLKData[pVBInfo->ram_type].SR2E);
139 xgifb_reg_set(pVBInfo->P3c4,
141 pVBInfo->ECLKData[pVBInfo->ram_type].SR2F);
142 xgifb_reg_set(pVBInfo->P3c4,
144 pVBInfo->ECLKData[pVBInfo->ram_type].SR30);
146 /* [Vicent] 2004/07/07,
147 * When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
148 /* [Hsuan] 2004/08/20,
149 * Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz,
150 * Set SR32 D[1:0] = 10b */
151 if (HwDeviceExtension->jChipType == XG42) {
152 if ((pVBInfo->MCLKData[pVBInfo->ram_type].SR28 == 0x1C) &&
153 (pVBInfo->MCLKData[pVBInfo->ram_type].SR29 == 0x01) &&
154 (((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x1C) &&
155 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01)) ||
156 ((pVBInfo->ECLKData[pVBInfo->ram_type].SR2E == 0x22) &&
157 (pVBInfo->ECLKData[pVBInfo->ram_type].SR2F == 0x01))))
158 xgifb_reg_set(pVBInfo->P3c4,
160 ((unsigned char) xgifb_reg_get(
161 pVBInfo->P3c4, 0x32) & 0xFC) | 0x02);
165 static void XGINew_DDRII_Bootup_XG27(
166 struct xgi_hw_device_info *HwDeviceExtension,
167 unsigned long P3c4, struct vb_device_info *pVBInfo)
169 unsigned long P3d4 = P3c4 + 0x10;
170 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
171 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
173 /* Set Double Frequency */
174 /* xgifb_reg_set(P3d4, 0x97, 0x11); *//* CR97 */
175 xgifb_reg_set(P3d4, 0x97, *pVBInfo->pXGINew_CR97); /* CR97 */
179 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS2 */
180 xgifb_reg_set(P3c4, 0x19, 0x80); /* Set SR19 */
181 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
183 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
186 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS3 */
187 xgifb_reg_set(P3c4, 0x19, 0xC0); /* Set SR19 */
188 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
190 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
193 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS1 */
194 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
195 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
197 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
200 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Enable */
201 xgifb_reg_set(P3c4, 0x19, 0x0A); /* Set SR19 */
202 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
204 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
205 xgifb_reg_set(P3c4, 0x16, 0x80); /* Set SR16 */
208 xgifb_reg_set(P3c4, 0x1B, 0x04); /* Set SR1B */
210 xgifb_reg_set(P3c4, 0x1B, 0x00); /* Set SR1B */
212 xgifb_reg_set(P3c4, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Reset */
213 xgifb_reg_set(P3c4, 0x19, 0x08); /* Set SR19 */
214 xgifb_reg_set(P3c4, 0x16, 0x00); /* Set SR16 */
217 xgifb_reg_set(P3c4, 0x16, 0x83); /* Set SR16 */
220 xgifb_reg_set(P3c4, 0x18, 0x80); /* Set SR18 */ /* MRS, ODT */
221 xgifb_reg_set(P3c4, 0x19, 0x46); /* Set SR19 */
222 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
224 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
227 xgifb_reg_set(P3c4, 0x18, 0x00); /* Set SR18 */ /* EMRS */
228 xgifb_reg_set(P3c4, 0x19, 0x40); /* Set SR19 */
229 xgifb_reg_set(P3c4, 0x16, 0x20); /* Set SR16 */
231 xgifb_reg_set(P3c4, 0x16, 0xA0); /* Set SR16 */
234 /* Set SR1B refresh control 000:close; 010:open */
235 xgifb_reg_set(P3c4, 0x1B, 0x04);
240 static void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info *HwDeviceExtension,
241 unsigned long P3c4, struct vb_device_info *pVBInfo)
243 unsigned long P3d4 = P3c4 + 0x10;
245 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
246 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
248 xgifb_reg_set(P3d4, 0x97, 0x11); /* CR97 */
251 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS2 */
252 xgifb_reg_set(P3c4, 0x19, 0x80);
253 xgifb_reg_set(P3c4, 0x16, 0x05);
254 xgifb_reg_set(P3c4, 0x16, 0x85);
256 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS3 */
257 xgifb_reg_set(P3c4, 0x19, 0xC0);
258 xgifb_reg_set(P3c4, 0x16, 0x05);
259 xgifb_reg_set(P3c4, 0x16, 0x85);
261 xgifb_reg_set(P3c4, 0x18, 0x00); /* EMRS1 */
262 xgifb_reg_set(P3c4, 0x19, 0x40);
263 xgifb_reg_set(P3c4, 0x16, 0x05);
264 xgifb_reg_set(P3c4, 0x16, 0x85);
266 /* xgifb_reg_set(P3c4, 0x18, 0x52); */ /* MRS1 */
267 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
268 xgifb_reg_set(P3c4, 0x19, 0x02);
269 xgifb_reg_set(P3c4, 0x16, 0x05);
270 xgifb_reg_set(P3c4, 0x16, 0x85);
273 xgifb_reg_set(P3c4, 0x1B, 0x04); /* SR1B */
275 xgifb_reg_set(P3c4, 0x1B, 0x00); /* SR1B */
278 /* xgifb_reg_set(P3c4 ,0x18, 0x52); */ /* MRS2 */
279 xgifb_reg_set(P3c4, 0x18, 0x42); /* MRS1 */
280 xgifb_reg_set(P3c4, 0x19, 0x00);
281 xgifb_reg_set(P3c4, 0x16, 0x05);
282 xgifb_reg_set(P3c4, 0x16, 0x85);
287 static void XGINew_DDR1x_MRS_XG20(unsigned long P3c4,
288 struct vb_device_info *pVBInfo)
290 xgifb_reg_set(P3c4, 0x18, 0x01);
291 xgifb_reg_set(P3c4, 0x19, 0x40);
292 xgifb_reg_set(P3c4, 0x16, 0x00);
293 xgifb_reg_set(P3c4, 0x16, 0x80);
296 xgifb_reg_set(P3c4, 0x18, 0x00);
297 xgifb_reg_set(P3c4, 0x19, 0x40);
298 xgifb_reg_set(P3c4, 0x16, 0x00);
299 xgifb_reg_set(P3c4, 0x16, 0x80);
303 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
304 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
305 xgifb_reg_set(P3c4, 0x19, 0x01);
306 xgifb_reg_set(P3c4, 0x16, 0x03);
307 xgifb_reg_set(P3c4, 0x16, 0x83);
309 xgifb_reg_set(P3c4, 0x1B, 0x03);
311 /* xgifb_reg_set(P3c4, 0x18, 0x31); */
314 pVBInfo->SR15[2][pVBInfo->ram_type]); /* SR18 */
315 xgifb_reg_set(P3c4, 0x19, 0x00);
316 xgifb_reg_set(P3c4, 0x16, 0x03);
317 xgifb_reg_set(P3c4, 0x16, 0x83);
318 xgifb_reg_set(P3c4, 0x1B, 0x00);
321 static void XGINew_DDR1x_DefaultRegister(
322 struct xgi_hw_device_info *HwDeviceExtension,
323 unsigned long Port, struct vb_device_info *pVBInfo)
325 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
327 if (HwDeviceExtension->jChipType >= XG20) {
328 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
331 pVBInfo->CR40[11][pVBInfo->ram_type]); /* CR82 */
334 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
337 pVBInfo->CR40[13][pVBInfo->ram_type]); /* CR86 */
339 xgifb_reg_set(P3d4, 0x98, 0x01);
340 xgifb_reg_set(P3d4, 0x9A, 0x02);
342 XGINew_DDR1x_MRS_XG20(P3c4, pVBInfo);
344 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
346 switch (HwDeviceExtension->jChipType) {
351 pVBInfo->CR40[11][pVBInfo->ram_type]);
355 pVBInfo->CR40[12][pVBInfo->ram_type]);
359 pVBInfo->CR40[13][pVBInfo->ram_type]);
362 xgifb_reg_set(P3d4, 0x82, 0x88);
363 xgifb_reg_set(P3d4, 0x86, 0x00);
364 /* Insert read command for delay */
365 xgifb_reg_get(P3d4, 0x86);
366 xgifb_reg_set(P3d4, 0x86, 0x88);
367 xgifb_reg_get(P3d4, 0x86);
370 pVBInfo->CR40[13][pVBInfo->ram_type]);
371 xgifb_reg_set(P3d4, 0x82, 0x77);
372 xgifb_reg_set(P3d4, 0x85, 0x00);
374 /* Insert read command for delay */
375 xgifb_reg_get(P3d4, 0x85);
376 xgifb_reg_set(P3d4, 0x85, 0x88);
378 /* Insert read command for delay */
379 xgifb_reg_get(P3d4, 0x85);
383 pVBInfo->CR40[12][pVBInfo->ram_type]);
387 pVBInfo->CR40[11][pVBInfo->ram_type]);
391 xgifb_reg_set(P3d4, 0x97, 0x00);
392 xgifb_reg_set(P3d4, 0x98, 0x01);
393 xgifb_reg_set(P3d4, 0x9A, 0x02);
394 XGINew_DDR1x_MRS_340(P3c4, pVBInfo);
398 static void XGINew_DDR2_DefaultRegister(
399 struct xgi_hw_device_info *HwDeviceExtension,
400 unsigned long Port, struct vb_device_info *pVBInfo)
402 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
404 /* keep following setting sequence, each setting in
405 * the same reg insert idle */
406 xgifb_reg_set(P3d4, 0x82, 0x77);
407 xgifb_reg_set(P3d4, 0x86, 0x00);
408 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
409 xgifb_reg_set(P3d4, 0x86, 0x88);
410 xgifb_reg_get(P3d4, 0x86); /* Insert read command for delay */
412 xgifb_reg_set(P3d4, 0x86, pVBInfo->CR40[13][pVBInfo->ram_type]);
413 xgifb_reg_set(P3d4, 0x82, 0x77);
414 xgifb_reg_set(P3d4, 0x85, 0x00);
415 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
416 xgifb_reg_set(P3d4, 0x85, 0x88);
417 xgifb_reg_get(P3d4, 0x85); /* Insert read command for delay */
420 pVBInfo->CR40[12][pVBInfo->ram_type]); /* CR85 */
421 if (HwDeviceExtension->jChipType == XG27)
423 xgifb_reg_set(P3d4, 0x82, pVBInfo->CR40[11][pVBInfo->ram_type]);
425 xgifb_reg_set(P3d4, 0x82, 0xA8); /* CR82 */
427 xgifb_reg_set(P3d4, 0x98, 0x01);
428 xgifb_reg_set(P3d4, 0x9A, 0x02);
429 if (HwDeviceExtension->jChipType == XG27)
430 XGINew_DDRII_Bootup_XG27(HwDeviceExtension, P3c4, pVBInfo);
432 XGINew_DDR2_MRS_XG20(HwDeviceExtension, P3c4, pVBInfo);
435 static void XGINew_SetDRAMDefaultRegister340(
436 struct xgi_hw_device_info *HwDeviceExtension,
437 unsigned long Port, struct vb_device_info *pVBInfo)
439 unsigned char temp, temp1, temp2, temp3, i, j, k;
441 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
443 xgifb_reg_set(P3d4, 0x6D, pVBInfo->CR40[8][pVBInfo->ram_type]);
444 xgifb_reg_set(P3d4, 0x68, pVBInfo->CR40[5][pVBInfo->ram_type]);
445 xgifb_reg_set(P3d4, 0x69, pVBInfo->CR40[6][pVBInfo->ram_type]);
446 xgifb_reg_set(P3d4, 0x6A, pVBInfo->CR40[7][pVBInfo->ram_type]);
449 for (i = 0; i < 4; i++) {
450 /* CR6B DQS fine tune delay */
451 temp = pVBInfo->CR6B[pVBInfo->ram_type][i];
452 for (j = 0; j < 4; j++) {
453 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
455 xgifb_reg_set(P3d4, 0x6B, temp2);
456 /* Insert read command for delay */
457 xgifb_reg_get(P3d4, 0x6B);
464 for (i = 0; i < 4; i++) {
465 /* CR6E DQM fine tune delay */
466 temp = pVBInfo->CR6E[pVBInfo->ram_type][i];
467 for (j = 0; j < 4; j++) {
468 temp1 = ((temp >> (2 * j)) & 0x03) << 2;
470 xgifb_reg_set(P3d4, 0x6E, temp2);
471 /* Insert read command for delay */
472 xgifb_reg_get(P3d4, 0x6E);
479 for (k = 0; k < 4; k++) {
480 /* CR6E_D[1:0] select channel */
481 xgifb_reg_and_or(P3d4, 0x6E, 0xFC, temp3);
483 for (i = 0; i < 8; i++) {
484 /* CR6F DQ fine tune delay */
485 temp = pVBInfo->CR6F[pVBInfo->ram_type][8 * k + i];
486 for (j = 0; j < 4; j++) {
487 temp1 = (temp >> (2 * j)) & 0x03;
489 xgifb_reg_set(P3d4, 0x6F, temp2);
490 /* Insert read command for delay */
491 xgifb_reg_get(P3d4, 0x6F);
501 pVBInfo->CR40[9][pVBInfo->ram_type]); /* CR80 */
504 pVBInfo->CR40[10][pVBInfo->ram_type]); /* CR81 */
507 /* CR89 terminator type select */
508 temp = pVBInfo->CR89[pVBInfo->ram_type][0];
509 for (j = 0; j < 4; j++) {
510 temp1 = (temp >> (2 * j)) & 0x03;
512 xgifb_reg_set(P3d4, 0x89, temp2);
513 xgifb_reg_get(P3d4, 0x89); /* Insert read command for delay */
518 temp = pVBInfo->CR89[pVBInfo->ram_type][1];
521 xgifb_reg_set(P3d4, 0x89, temp2);
523 temp = pVBInfo->CR40[3][pVBInfo->ram_type];
525 temp2 = (temp >> 4) & 0x07;
527 xgifb_reg_set(P3d4, 0x45, temp1); /* CR45 */
528 xgifb_reg_set(P3d4, 0x99, temp2); /* CR99 */
529 xgifb_reg_or(P3d4, 0x40, temp3); /* CR40_D[7] */
532 pVBInfo->CR40[0][pVBInfo->ram_type]); /* CR41 */
534 if (HwDeviceExtension->jChipType == XG27)
535 xgifb_reg_set(P3d4, 0x8F, *pVBInfo->pCR8F); /* CR8F */
537 for (j = 0; j <= 6; j++) /* CR90 - CR96 */
538 xgifb_reg_set(P3d4, (0x90 + j),
539 pVBInfo->CR40[14 + j][pVBInfo->ram_type]);
541 for (j = 0; j <= 2; j++) /* CRC3 - CRC5 */
542 xgifb_reg_set(P3d4, (0xC3 + j),
543 pVBInfo->CR40[21 + j][pVBInfo->ram_type]);
545 for (j = 0; j < 2; j++) /* CR8A - CR8B */
546 xgifb_reg_set(P3d4, (0x8A + j),
547 pVBInfo->CR40[1 + j][pVBInfo->ram_type]);
549 if (HwDeviceExtension->jChipType == XG42)
550 xgifb_reg_set(P3d4, 0x8C, 0x87);
554 pVBInfo->CR40[4][pVBInfo->ram_type]); /* CR59 */
556 xgifb_reg_set(P3d4, 0x83, 0x09); /* CR83 */
557 xgifb_reg_set(P3d4, 0x87, 0x00); /* CR87 */
558 xgifb_reg_set(P3d4, 0xCF, *pVBInfo->pCRCF); /* CRCF */
559 if (pVBInfo->ram_type) {
560 /* xgifb_reg_set(P3c4, 0x17, 0xC0); */ /* SR17 DDRII */
561 xgifb_reg_set(P3c4, 0x17, 0x80); /* SR17 DDRII */
562 if (HwDeviceExtension->jChipType == XG27)
563 xgifb_reg_set(P3c4, 0x17, 0x02); /* SR17 DDRII */
566 xgifb_reg_set(P3c4, 0x17, 0x00); /* SR17 DDR */
568 xgifb_reg_set(P3c4, 0x1A, 0x87); /* SR1A */
570 temp = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
572 XGINew_DDR1x_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
574 xgifb_reg_set(P3d4, 0xB0, 0x80); /* DDRII Dual frequency mode */
575 XGINew_DDR2_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
579 pVBInfo->SR15[3][pVBInfo->ram_type]); /* SR1B */
582 static void XGINew_SetDRAMSizingType(int index,
583 const unsigned short DRAMTYPE_TABLE[][5],
584 struct vb_device_info *pVBInfo)
588 data = DRAMTYPE_TABLE[index][4];
589 xgifb_reg_and_or(pVBInfo->P3c4, 0x13, 0x80, data);
591 /* should delay 50 ns */
594 static unsigned short XGINew_SetDRAMSizeReg(int index,
595 const unsigned short DRAMTYPE_TABLE[][5],
596 struct vb_device_info *pVBInfo)
598 unsigned short data = 0, memsize = 0;
600 unsigned char ChannelNo;
602 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 32;
603 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
611 if (pVBInfo->ram_channel == 3)
614 ChannelNo = pVBInfo->ram_channel;
616 if (ChannelNo * RankSize <= 256) {
617 while ((RankSize >>= 1) > 0)
622 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
623 xgifb_reg_set(pVBInfo->P3c4,
625 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
628 /* data |= pVBInfo->ram_channel << 2; */
629 /* data |= (pVBInfo->ram_bus / 64) << 1; */
630 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
633 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
638 static unsigned short XGINew_SetDRAMSize20Reg(int index,
639 const unsigned short DRAMTYPE_TABLE[][5],
640 struct vb_device_info *pVBInfo)
642 unsigned short data = 0, memsize = 0;
644 unsigned char ChannelNo;
646 RankSize = DRAMTYPE_TABLE[index][3] * pVBInfo->ram_bus / 8;
647 data = xgifb_reg_get(pVBInfo->P3c4, 0x13);
655 if (pVBInfo->ram_channel == 3)
658 ChannelNo = pVBInfo->ram_channel;
660 if (ChannelNo * RankSize <= 256) {
661 while ((RankSize >>= 1) > 0)
666 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
667 xgifb_reg_set(pVBInfo->P3c4,
669 (xgifb_reg_get(pVBInfo->P3c4, 0x14) & 0x0F) |
673 /* data |= pVBInfo->ram_channel << 2; */
674 /* data |= (pVBInfo->ram_bus / 64) << 1; */
675 /* xgifb_reg_set(pVBInfo->P3c4, 0x14, data); */
678 /* XGINew_SetDRAMModeRegister340(pVBInfo); */
683 static int XGINew_ReadWriteRest(unsigned short StopAddr,
684 unsigned short StartAddr, struct vb_device_info *pVBInfo)
687 unsigned long Position = 0;
688 void __iomem *fbaddr = pVBInfo->FBAddr;
690 writel(Position, fbaddr + Position);
692 for (i = StartAddr; i <= StopAddr; i++) {
694 writel(Position, fbaddr + Position);
697 udelay(500); /* [Vicent] 2004/04/16.
698 Fix #1759 Memory Size error in Multi-Adapter. */
702 if (readl(fbaddr + Position) != Position)
705 for (i = StartAddr; i <= StopAddr; i++) {
707 if (readl(fbaddr + Position) != Position)
713 static unsigned char XGINew_CheckFrequence(struct vb_device_info *pVBInfo)
717 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
719 if ((data & 0x10) == 0) {
720 data = xgifb_reg_get(pVBInfo->P3c4, 0x39);
721 data = (data & 0x02) >> 1;
728 static void XGINew_CheckChannel(struct xgi_hw_device_info *HwDeviceExtension,
729 struct vb_device_info *pVBInfo)
733 switch (HwDeviceExtension->jChipType) {
736 data = xgifb_reg_get(pVBInfo->P3d4, 0x97);
738 pVBInfo->ram_channel = 1; /* XG20 "JUST" one channel */
740 if (data == 0) { /* Single_32_16 */
742 if ((HwDeviceExtension->ulVideoMemorySize - 1)
745 pVBInfo->ram_bus = 32; /* 32 bits */
746 /* 22bit + 2 rank + 32bit */
747 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
748 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
751 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
754 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
756 /* 22bit + 1 rank + 32bit */
757 xgifb_reg_set(pVBInfo->P3c4,
760 xgifb_reg_set(pVBInfo->P3c4,
765 if (XGINew_ReadWriteRest(23,
772 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
774 pVBInfo->ram_bus = 16; /* 16 bits */
775 /* 22bit + 2 rank + 16bit */
776 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
777 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
780 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
783 xgifb_reg_set(pVBInfo->P3c4,
789 } else { /* Dual_16_8 */
790 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
792 pVBInfo->ram_bus = 16; /* 16 bits */
793 /* (0x31:12x8x2) 22bit + 2 rank */
794 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
796 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x41);
799 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
802 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
804 /* (0x31:12x8x2) 22bit + 1 rank */
805 xgifb_reg_set(pVBInfo->P3c4,
809 xgifb_reg_set(pVBInfo->P3c4,
814 if (XGINew_ReadWriteRest(22,
821 if ((HwDeviceExtension->ulVideoMemorySize - 1) >
823 pVBInfo->ram_bus = 8; /* 8 bits */
824 /* (0x31:12x8x2) 22bit + 2 rank */
825 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xB1);
827 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
830 if (XGINew_ReadWriteRest(22, 21, pVBInfo) == 1)
832 else /* (0x31:12x8x2) 22bit + 1 rank */
833 xgifb_reg_set(pVBInfo->P3c4,
842 pVBInfo->ram_bus = 16; /* 16 bits */
843 pVBInfo->ram_channel = 1; /* Single channel */
844 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x51); /* 32Mx16 bit*/
848 XG42 SR14 D[3] Reserve
849 D[2] = 1, Dual Channel
852 It's Different from Other XG40 Series.
854 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII, DDR2x */
855 pVBInfo->ram_bus = 32; /* 32 bits */
856 pVBInfo->ram_channel = 2; /* 2 Channel */
857 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
858 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x44);
860 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
863 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
864 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x34);
865 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
868 pVBInfo->ram_channel = 1; /* Single Channel */
869 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
870 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x40);
872 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
875 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
876 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x30);
879 pVBInfo->ram_bus = 64; /* 64 bits */
880 pVBInfo->ram_channel = 1; /* 1 channels */
881 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
882 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x52);
884 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
887 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
888 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x42);
896 if (XGINew_CheckFrequence(pVBInfo) == 1) { /* DDRII */
897 pVBInfo->ram_bus = 32; /* 32 bits */
898 pVBInfo->ram_channel = 3;
899 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
900 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4C);
902 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
905 pVBInfo->ram_channel = 2; /* 2 channels */
906 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x48);
908 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
911 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
912 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x3C);
914 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1) {
915 pVBInfo->ram_channel = 3; /* 4 channels */
917 pVBInfo->ram_channel = 2; /* 2 channels */
918 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x38);
921 pVBInfo->ram_bus = 64; /* 64 bits */
922 pVBInfo->ram_channel = 2; /* 2 channels */
923 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0xA1);
924 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x5A);
926 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1) {
929 xgifb_reg_set(pVBInfo->P3c4, 0x13, 0x21);
930 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x4A);
937 static int XGINew_DDRSizing340(struct xgi_hw_device_info *HwDeviceExtension,
938 struct vb_device_info *pVBInfo)
941 unsigned short memsize, addr;
943 xgifb_reg_set(pVBInfo->P3c4, 0x15, 0x00); /* noninterleaving */
944 xgifb_reg_set(pVBInfo->P3c4, 0x1C, 0x00); /* nontiling */
945 XGINew_CheckChannel(HwDeviceExtension, pVBInfo);
947 if (HwDeviceExtension->jChipType >= XG20) {
948 for (i = 0; i < 12; i++) {
949 XGINew_SetDRAMSizingType(i,
950 XGINew_DDRDRAM_TYPE20,
952 memsize = XGINew_SetDRAMSize20Reg(i,
953 XGINew_DDRDRAM_TYPE20,
958 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
959 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
960 (unsigned long) (1 << addr))
963 if (XGINew_ReadWriteRest(addr, 5, pVBInfo) == 1)
967 for (i = 0; i < 4; i++) {
968 XGINew_SetDRAMSizingType(i,
969 XGINew_DDRDRAM_TYPE340,
971 memsize = XGINew_SetDRAMSizeReg(i,
972 XGINew_DDRDRAM_TYPE340,
978 addr = memsize + (pVBInfo->ram_channel - 2) + 20;
979 if ((HwDeviceExtension->ulVideoMemorySize - 1) <
980 (unsigned long) (1 << addr))
983 if (XGINew_ReadWriteRest(addr, 9, pVBInfo) == 1)
990 static void XGINew_SetDRAMSize_340(struct xgifb_video_info *xgifb_info,
991 struct xgi_hw_device_info *HwDeviceExtension,
992 struct vb_device_info *pVBInfo)
996 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
998 XGISetModeNew(xgifb_info, HwDeviceExtension, 0x2e);
1000 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
1001 /* disable read cache */
1002 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data & 0xDF));
1003 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
1005 /* data = xgifb_reg_get(pVBInfo->P3c4, 0x1); */
1006 /* data |= 0x20 ; */
1007 /* xgifb_reg_set(pVBInfo->P3c4, 0x01, data); *//* Turn OFF Display */
1008 XGINew_DDRSizing340(HwDeviceExtension, pVBInfo);
1009 data = xgifb_reg_get(pVBInfo->P3c4, 0x21);
1010 /* enable read cache */
1011 xgifb_reg_set(pVBInfo->P3c4, 0x21, (unsigned short) (data | 0x20));
1014 static u8 *xgifb_copy_rom(struct pci_dev *dev, size_t *rom_size)
1016 void __iomem *rom_address;
1019 rom_address = pci_map_rom(dev, rom_size);
1020 if (rom_address == NULL)
1023 rom_copy = vzalloc(XGIFB_ROM_SIZE);
1024 if (rom_copy == NULL)
1027 *rom_size = min_t(size_t, *rom_size, XGIFB_ROM_SIZE);
1028 memcpy_fromio(rom_copy, rom_address, *rom_size);
1031 pci_unmap_rom(dev, rom_address);
1035 static void xgifb_read_vbios(struct pci_dev *pdev,
1036 struct vb_device_info *pVBInfo)
1038 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
1042 struct XGI21_LVDSCapStruct *lvds;
1046 if (xgifb_info->chip != XG21)
1048 pVBInfo->IF_DEF_LVDS = 0;
1049 vbios = xgifb_copy_rom(pdev, &vbios_size);
1050 if (vbios == NULL) {
1051 dev_err(&pdev->dev, "video BIOS not available\n");
1054 if (vbios_size <= 0x65)
1057 * The user can ignore the LVDS bit in the BIOS and force the display
1060 if (!(vbios[0x65] & 0x1) &&
1061 (!xgifb_info->display2_force ||
1062 xgifb_info->display2 != XGIFB_DISP_LCD)) {
1066 if (vbios_size <= 0x317)
1068 i = vbios[0x316] | (vbios[0x317] << 8);
1069 if (vbios_size <= i - 1)
1077 * Read the LVDS table index scratch register set by the BIOS.
1079 entry = xgifb_reg_get(xgifb_info->dev_info.P3d4, 0x36);
1083 lvds = &xgifb_info->lvds_data;
1084 if (vbios_size <= i + 24)
1086 lvds->LVDS_Capability = vbios[i] | (vbios[i + 1] << 8);
1087 lvds->LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
1088 lvds->LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
1089 lvds->LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
1090 lvds->LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
1091 lvds->LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
1092 lvds->LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
1093 lvds->LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
1094 lvds->LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
1095 lvds->VCLKData1 = vbios[i + 18];
1096 lvds->VCLKData2 = vbios[i + 19];
1097 lvds->PSC_S1 = vbios[i + 20];
1098 lvds->PSC_S2 = vbios[i + 21];
1099 lvds->PSC_S3 = vbios[i + 22];
1100 lvds->PSC_S4 = vbios[i + 23];
1101 lvds->PSC_S5 = vbios[i + 24];
1103 pVBInfo->IF_DEF_LVDS = 1;
1106 dev_err(&pdev->dev, "video BIOS corrupted\n");
1110 static void XGINew_ChkSenseStatus(struct xgi_hw_device_info *HwDeviceExtension,
1111 struct vb_device_info *pVBInfo)
1113 unsigned short tempbx = 0, temp, tempcx, CR3CData;
1115 temp = xgifb_reg_get(pVBInfo->P3d4, 0x32);
1117 if (temp & Monitor1Sense)
1118 tempbx |= ActiveCRT1;
1119 if (temp & LCDSense)
1120 tempbx |= ActiveLCD;
1121 if (temp & Monitor2Sense)
1122 tempbx |= ActiveCRT2;
1123 if (temp & TVSense) {
1125 if (temp & AVIDEOSense)
1126 tempbx |= (ActiveAVideo << 8);
1127 if (temp & SVIDEOSense)
1128 tempbx |= (ActiveSVideo << 8);
1129 if (temp & SCARTSense)
1130 tempbx |= (ActiveSCART << 8);
1131 if (temp & HiTVSense)
1132 tempbx |= (ActiveHiTV << 8);
1133 if (temp & YPbPrSense)
1134 tempbx |= (ActiveYPbPr << 8);
1137 tempcx = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1138 tempcx |= (xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8);
1140 if (tempbx & tempcx) {
1141 CR3CData = xgifb_reg_get(pVBInfo->P3d4, 0x3c);
1142 if (!(CR3CData & DisplayDeviceFromCMOS)) {
1144 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1149 if (*pVBInfo->pSoftSetting & ModeSoftSetting)
1154 xgifb_reg_set(pVBInfo->P3d4, 0x3d, (tempbx & 0x00FF));
1155 xgifb_reg_set(pVBInfo->P3d4, 0x3e, ((tempbx & 0xFF00) >> 8));
1158 static void XGINew_SetModeScratch(struct xgi_hw_device_info *HwDeviceExtension,
1159 struct vb_device_info *pVBInfo)
1161 unsigned short temp, tempcl = 0, tempch = 0, CR31Data, CR38Data;
1163 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1164 temp |= xgifb_reg_get(pVBInfo->P3d4, 0x3e) << 8;
1165 temp |= (xgifb_reg_get(pVBInfo->P3d4, 0x31) & (DriverMode >> 8)) << 8;
1167 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
1168 if (temp & ActiveCRT2)
1169 tempcl = SetCRT2ToRAMDAC;
1172 if (temp & ActiveLCD) {
1173 tempcl |= SetCRT2ToLCD;
1174 if (temp & DriverMode) {
1175 if (temp & ActiveTV) {
1176 tempch = SetToLCDA | EnableDualEdge;
1177 temp ^= SetCRT2ToLCD;
1179 if ((temp >> 8) & ActiveAVideo)
1180 tempcl |= SetCRT2ToAVIDEO;
1181 if ((temp >> 8) & ActiveSVideo)
1182 tempcl |= SetCRT2ToSVIDEO;
1183 if ((temp >> 8) & ActiveSCART)
1184 tempcl |= SetCRT2ToSCART;
1186 if (pVBInfo->IF_DEF_HiVision == 1) {
1187 if ((temp >> 8) & ActiveHiTV)
1188 tempcl |= SetCRT2ToHiVision;
1191 if (pVBInfo->IF_DEF_YPbPr == 1) {
1192 if ((temp >> 8) & ActiveYPbPr)
1198 if ((temp >> 8) & ActiveAVideo)
1199 tempcl |= SetCRT2ToAVIDEO;
1200 if ((temp >> 8) & ActiveSVideo)
1201 tempcl |= SetCRT2ToSVIDEO;
1202 if ((temp >> 8) & ActiveSCART)
1203 tempcl |= SetCRT2ToSCART;
1205 if (pVBInfo->IF_DEF_HiVision == 1) {
1206 if ((temp >> 8) & ActiveHiTV)
1207 tempcl |= SetCRT2ToHiVision;
1210 if (pVBInfo->IF_DEF_YPbPr == 1) {
1211 if ((temp >> 8) & ActiveYPbPr)
1216 tempcl |= SetSimuScanMode;
1217 if ((!(temp & ActiveCRT1)) && ((temp & ActiveLCD) || (temp & ActiveTV)
1218 || (temp & ActiveCRT2)))
1219 tempcl ^= (SetSimuScanMode | SwitchCRT2);
1220 if ((temp & ActiveLCD) && (temp & ActiveTV))
1221 tempcl ^= (SetSimuScanMode | SwitchCRT2);
1222 xgifb_reg_set(pVBInfo->P3d4, 0x30, tempcl);
1224 CR31Data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
1225 CR31Data &= ~(SetNotSimuMode >> 8);
1226 if (!(temp & ActiveCRT1))
1227 CR31Data |= (SetNotSimuMode >> 8);
1228 CR31Data &= ~(DisableCRT2Display >> 8);
1229 if (!((temp & ActiveLCD) || (temp & ActiveTV) || (temp & ActiveCRT2)))
1230 CR31Data |= (DisableCRT2Display >> 8);
1231 xgifb_reg_set(pVBInfo->P3d4, 0x31, CR31Data);
1233 CR38Data = xgifb_reg_get(pVBInfo->P3d4, 0x38);
1234 CR38Data &= ~SetYPbPr;
1236 xgifb_reg_set(pVBInfo->P3d4, 0x38, CR38Data);
1240 static unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
1242 struct vb_device_info *pVBInfo)
1244 unsigned short temp;
1247 if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN) {
1250 temp = (unsigned short) HwDeviceExtension->ulCRT2LCDType;
1251 switch (HwDeviceExtension->ulCRT2LCDType) {
1279 xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp);
1284 static void XGINew_GetXG21Sense(struct xgi_hw_device_info *HwDeviceExtension,
1285 struct vb_device_info *pVBInfo)
1290 if (pVBInfo->IF_DEF_LVDS) { /* For XG21 LVDS */
1291 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
1293 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
1296 /* Enable GPIOA/B read */
1297 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
1298 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0xC0;
1299 if (Temp == 0xC0) { /* DVI & DVO GPIOA/B pull high */
1300 XGINew_SenseLCD(HwDeviceExtension, pVBInfo);
1301 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
1302 /* Enable read GPIOF */
1303 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x20, 0x20);
1304 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04;
1306 xgifb_reg_and_or(pVBInfo->P3d4,
1309 0x80); /* TMDS on chip */
1311 xgifb_reg_and_or(pVBInfo->P3d4,
1314 0xA0); /* Only DVO on chip */
1315 /* Disable read GPIOF */
1316 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20);
1323 static void XGINew_GetXG27Sense(struct xgi_hw_device_info *HwDeviceExtension,
1324 struct vb_device_info *pVBInfo)
1326 unsigned char Temp, bCR4A;
1328 pVBInfo->IF_DEF_LVDS = 0;
1329 bCR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
1330 /* Enable GPIOA/B/C read */
1331 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x07, 0x07);
1332 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x07;
1333 xgifb_reg_set(pVBInfo->P3d4, 0x4A, bCR4A);
1337 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xC0);
1338 xgifb_reg_set(pVBInfo->P3d4, 0x30, 0x21);
1340 /* TMDS/DVO setting */
1341 xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, 0xA0);
1343 xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense);
1347 static unsigned char GetXG21FPBits(struct vb_device_info *pVBInfo)
1349 unsigned char CR38, CR4A, temp;
1351 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
1352 /* enable GPIOE read */
1353 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x10, 0x10);
1354 CR38 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
1356 if ((CR38 & 0xE0) > 0x80) {
1357 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
1362 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
1367 static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo)
1369 unsigned char CR4A, temp;
1371 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
1372 /* enable GPIOA/B/C read */
1373 xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03);
1374 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
1378 temp = ((temp & 0x04) >> 1) || ((~temp) & 0x01);
1380 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
1385 unsigned char XGIInitNew(struct pci_dev *pdev)
1387 struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
1388 struct xgi_hw_device_info *HwDeviceExtension = &xgifb_info->hw_info;
1389 struct vb_device_info VBINF;
1390 struct vb_device_info *pVBInfo = &VBINF;
1391 unsigned char i, temp = 0, temp1;
1392 /* VBIOSVersion[5]; */
1394 /* unsigned long j, k; */
1396 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress;
1398 pVBInfo->BaseAddr = xgifb_info->vga_base;
1400 /* Newdebugcode(0x99); */
1402 if (pVBInfo->FBAddr == NULL) {
1403 printk("\n pVBInfo->FBAddr == 0 ");
1407 if (pVBInfo->BaseAddr == 0) {
1408 printk("\npVBInfo->BaseAddr == 0 ");
1413 outb(0x67, (pVBInfo->BaseAddr + 0x12)); /* 3c2 <- 67 ,ynlai */
1415 pVBInfo->ISXPDOS = 0;
1420 /* VBIOSVersion[4] = 0x0; */
1422 /* 09/07/99 modify by domao */
1424 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
1425 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
1426 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
1427 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
1428 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
1429 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
1430 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
1431 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
1432 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
1433 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
1434 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
1435 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
1436 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
1437 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
1438 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
1439 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
1440 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
1443 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
1444 /* Run XGI_GetVBType before InitTo330Pointer */
1445 XGI_GetVBType(pVBInfo);
1447 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
1449 xgifb_read_vbios(pdev, pVBInfo);
1452 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
1455 /* GetXG21Sense (GPIO) */
1456 if (HwDeviceExtension->jChipType == XG21)
1457 XGINew_GetXG21Sense(HwDeviceExtension, pVBInfo);
1459 if (HwDeviceExtension->jChipType == XG27)
1460 XGINew_GetXG27Sense(HwDeviceExtension, pVBInfo);
1464 /* 2.Reset Extended register */
1466 for (i = 0x06; i < 0x20; i++)
1467 xgifb_reg_set(pVBInfo->P3c4, i, 0);
1469 for (i = 0x21; i <= 0x27; i++)
1470 xgifb_reg_set(pVBInfo->P3c4, i, 0);
1472 /* for(i = 0x06; i <= 0x27; i++) */
1473 /* xgifb_reg_set(pVBInfo->P3c4, i, 0); */
1477 for (i = 0x31; i <= 0x3B; i++)
1478 xgifb_reg_set(pVBInfo->P3c4, i, 0);
1481 /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
1482 if (HwDeviceExtension->jChipType == XG42)
1483 xgifb_reg_set(pVBInfo->P3c4, 0x3B, 0xC0);
1485 /* for (i = 0x30; i <= 0x3F; i++) */
1486 /* xgifb_reg_set(pVBInfo->P3d4, i, 0); */
1488 for (i = 0x79; i <= 0x7C; i++)
1489 xgifb_reg_set(pVBInfo->P3d4, i, 0); /* shampoo 0208 */
1493 if (HwDeviceExtension->jChipType >= XG20)
1494 xgifb_reg_set(pVBInfo->P3d4, 0x97, *pVBInfo->pXGINew_CR97);
1498 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
1503 /* 4.SetDefExt1Regs begin */
1504 xgifb_reg_set(pVBInfo->P3c4, 0x07, *pVBInfo->pSR07);
1505 if (HwDeviceExtension->jChipType == XG27) {
1506 xgifb_reg_set(pVBInfo->P3c4, 0x40, *pVBInfo->pSR40);
1507 xgifb_reg_set(pVBInfo->P3c4, 0x41, *pVBInfo->pSR41);
1509 xgifb_reg_set(pVBInfo->P3c4, 0x11, 0x0F);
1510 xgifb_reg_set(pVBInfo->P3c4, 0x1F, *pVBInfo->pSR1F);
1511 /* xgifb_reg_set(pVBInfo->P3c4, 0x20, 0x20); */
1512 /* alan, 2001/6/26 Frame buffer can read/write SR20 */
1513 xgifb_reg_set(pVBInfo->P3c4, 0x20, 0xA0);
1514 /* Hsuan, 2006/01/01 H/W request for slow corner chip */
1515 xgifb_reg_set(pVBInfo->P3c4, 0x36, 0x70);
1516 if (HwDeviceExtension->jChipType == XG27) /* Alan 12/07/2006 */
1517 xgifb_reg_set(pVBInfo->P3c4, 0x36, *pVBInfo->pSR36);
1520 /* xgifb_reg_set(pVBInfo->P3c4, 0x11, SR11); */
1524 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1529 temp1 = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
1531 if (temp1 == 0x02) {
1532 outl(0x80000000, 0xcf8);
1533 ChipsetID = inl(0x0cfc);
1534 outl(0x8000002C, 0xcf8);
1535 VendorID = inl(0x0cfc);
1536 VendorID &= 0x0000FFFF;
1537 outl(0x8001002C, 0xcf8);
1538 GraphicVendorID = inl(0x0cfc);
1539 GraphicVendorID &= 0x0000FFFF;
1541 if (ChipsetID == 0x7301039)
1542 xgifb_reg_set(pVBInfo->P3d4, 0x5F, 0x09);
1544 ChipsetID &= 0x0000FFFF;
1546 if ((ChipsetID == 0x700E) ||
1547 (ChipsetID == 0x1022) ||
1548 (ChipsetID == 0x1106) ||
1549 (ChipsetID == 0x10DE)) {
1550 if (ChipsetID == 0x1106) {
1551 if ((VendorID == 0x1019) &&
1552 (GraphicVendorID == 0x1019))
1553 xgifb_reg_set(pVBInfo->P3d4,
1557 xgifb_reg_set(pVBInfo->P3d4,
1561 xgifb_reg_set(pVBInfo->P3d4,
1571 /* Set AGP customize registers (in SetDefAGPRegs) Start */
1572 for (i = 0x47; i <= 0x4C; i++)
1573 xgifb_reg_set(pVBInfo->P3d4,
1575 pVBInfo->AGPReg[i - 0x47]);
1577 for (i = 0x70; i <= 0x71; i++)
1578 xgifb_reg_set(pVBInfo->P3d4,
1580 pVBInfo->AGPReg[6 + i - 0x70]);
1582 for (i = 0x74; i <= 0x77; i++)
1583 xgifb_reg_set(pVBInfo->P3d4,
1585 pVBInfo->AGPReg[8 + i - 0x74]);
1586 /* Set AGP customize registers (in SetDefAGPRegs) End */
1587 /* [Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
1588 /* outl(0x80000000, 0xcf8); */
1589 /* ChipsetID = inl(0x0cfc); */
1590 /* if (ChipsetID == 0x25308086) */
1591 /* xgifb_reg_set(pVBInfo->P3d4, 0x77, 0xF0); */
1593 pci_read_config_dword(pdev, 0x50, &Temp);
1598 xgifb_reg_set(pVBInfo->P3d4, 0x48, 0x20); /* CR48 */
1603 xgifb_reg_set(pVBInfo->P3c4, 0x23, *pVBInfo->pSR23);
1604 xgifb_reg_set(pVBInfo->P3c4, 0x24, *pVBInfo->pSR24);
1605 xgifb_reg_set(pVBInfo->P3c4, 0x25, pVBInfo->SR25[0]);
1608 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1610 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
1611 /* alan, disable VideoCapture */
1612 xgifb_reg_and_or(pVBInfo->Part0Port, 0x3F, 0xEF, 0x00);
1613 xgifb_reg_set(pVBInfo->Part1Port, 0x00, 0x00);
1614 /* chk if BCLK>=100MHz */
1615 temp1 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x7B);
1616 temp = (unsigned char) ((temp1 >> 4) & 0x0F);
1618 xgifb_reg_set(pVBInfo->Part1Port,
1620 (*pVBInfo->pCRT2Data_1_2));
1624 xgifb_reg_set(pVBInfo->Part1Port, 0x2E, 0x08); /* use VB */
1627 xgifb_reg_set(pVBInfo->P3c4, 0x27, 0x1F);
1629 if ((HwDeviceExtension->jChipType == XG42) &&
1630 XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo) != 0) {
1632 xgifb_reg_set(pVBInfo->P3c4,
1634 (*pVBInfo->pSR31 & 0x3F) | 0x40);
1635 xgifb_reg_set(pVBInfo->P3c4,
1637 (*pVBInfo->pSR32 & 0xFC) | 0x01);
1639 xgifb_reg_set(pVBInfo->P3c4, 0x31, *pVBInfo->pSR31);
1640 xgifb_reg_set(pVBInfo->P3c4, 0x32, *pVBInfo->pSR32);
1642 xgifb_reg_set(pVBInfo->P3c4, 0x33, *pVBInfo->pSR33);
1646 SetPowerConsume (HwDeviceExtension, pVBInfo->P3c4); */
1648 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
1649 if (XGI_BridgeIsOn(pVBInfo) == 1) {
1650 if (pVBInfo->IF_DEF_LVDS == 0) {
1651 xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1C);
1652 xgifb_reg_set(pVBInfo->Part4Port,
1654 *pVBInfo->pCRT2Data_4_D);
1655 xgifb_reg_set(pVBInfo->Part4Port,
1657 *pVBInfo->pCRT2Data_4_E);
1658 xgifb_reg_set(pVBInfo->Part4Port,
1660 *pVBInfo->pCRT2Data_4_10);
1661 xgifb_reg_set(pVBInfo->Part4Port, 0x0F, 0x3F);
1664 XGI_LockCRT2(HwDeviceExtension, pVBInfo);
1673 XGI_SenseCRT1(pVBInfo);
1676 /* XGINew_DetectMonitor(HwDeviceExtension); */
1677 if (HwDeviceExtension->jChipType == XG21) {
1680 xgifb_reg_and_or(pVBInfo->P3d4,
1683 Monitor1Sense); /* Z9 default has CRT */
1684 temp = GetXG21FPBits(pVBInfo);
1685 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x01, temp);
1689 if (HwDeviceExtension->jChipType == XG27) {
1690 xgifb_reg_and_or(pVBInfo->P3d4,
1693 Monitor1Sense); /* Z9 default has CRT */
1694 temp = GetXG27FPBits(pVBInfo);
1695 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~0x03, temp);
1699 pVBInfo->ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
1701 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension,
1706 XGINew_SetDRAMSize_340(xgifb_info, HwDeviceExtension, pVBInfo);
1711 /* SetDefExt2Regs begin */
1714 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x3A);
1720 *pVBInfo->pSR21 &= 0xEF;
1722 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
1724 *pVBInfo->pSR22 &= 0x20;
1725 xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22);
1727 /* base = 0x80000000; */
1728 /* OutPortLong(0xcf8, base); */
1729 /* Temp = (InPortLong(0xcfc) & 0xFFFF); */
1730 /* if (Temp == 0x1039) { */
1731 xgifb_reg_set(pVBInfo->P3c4,
1733 (unsigned char) ((*pVBInfo->pSR22) & 0xFE));
1735 /* xgifb_reg_set(pVBInfo->P3c4, 0x22, *pVBInfo->pSR22); */
1738 xgifb_reg_set(pVBInfo->P3c4, 0x21, *pVBInfo->pSR21);
1742 XGINew_ChkSenseStatus(HwDeviceExtension, pVBInfo);
1743 XGINew_SetModeScratch(HwDeviceExtension, pVBInfo);
1747 xgifb_reg_set(pVBInfo->P3d4, 0x8c, 0x87);
1748 xgifb_reg_set(pVBInfo->P3c4, 0x14, 0x31);