1 #include <linux/delay.h>
2 #include <linux/vmalloc.h>
7 #include "vb_setmode.h"
9 static const unsigned short XGINew_DDRDRAM_TYPE340
[4][2] = {
15 static const unsigned short XGINew_DDRDRAM_TYPE20
[12][2] = {
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 data
= xgifb_reg_get(pVBInfo
->P3c4
, 0x39) & 0x02;
40 data
= (xgifb_reg_get(pVBInfo
->P3c4
, 0x3A) &
43 } else if (HwDeviceExtension
->jChipType
== XG27
) {
44 temp
= xgifb_reg_get(pVBInfo
->P3c4
, 0x3B);
45 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
46 if (((temp
& 0x88) == 0x80) || ((temp
& 0x88) == 0x08))
51 } else if (HwDeviceExtension
->jChipType
== XG21
) {
52 /* Independent GPIO control */
53 xgifb_reg_and(pVBInfo
->P3d4
, 0xB4, ~0x02);
55 xgifb_reg_or(pVBInfo
->P3d4
, 0x4A, 0x80); /* Enable GPIOH read */
56 /* GPIOF 0:DVI 1:DVO */
57 temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48);
59 /* for current XG20 & XG21, GPIOH is floating, driver will
60 * fix DDR temporarily */
61 if (temp
& 0x01) /* DVI read GPIOH */
65 /* ~HOTPLUG_SUPPORT */
66 xgifb_reg_or(pVBInfo
->P3d4
, 0xB4, 0x02);
69 data
= xgifb_reg_get(pVBInfo
->P3d4
, 0x97) & 0x01;
78 static void XGINew_DDR1x_MRS_340(unsigned long P3c4
,
79 struct vb_device_info
*pVBInfo
)
81 xgifb_reg_set(P3c4
, 0x18, 0x01);
82 xgifb_reg_set(P3c4
, 0x19, 0x20);
83 xgifb_reg_set(P3c4
, 0x16, 0x00);
84 xgifb_reg_set(P3c4
, 0x16, 0x80);
87 xgifb_reg_set(P3c4
, 0x18, 0x00);
88 xgifb_reg_set(P3c4
, 0x19, 0x20);
89 xgifb_reg_set(P3c4
, 0x16, 0x00);
90 xgifb_reg_set(P3c4
, 0x16, 0x80);
95 pVBInfo
->SR15
[2][pVBInfo
->ram_type
]); /* SR18 */
96 xgifb_reg_set(P3c4
, 0x19, 0x01);
97 xgifb_reg_set(P3c4
, 0x16, 0x03);
98 xgifb_reg_set(P3c4
, 0x16, 0x83);
100 xgifb_reg_set(P3c4
, 0x1B, 0x03);
104 pVBInfo
->SR15
[2][pVBInfo
->ram_type
]); /* SR18 */
105 xgifb_reg_set(P3c4
, 0x19, 0x00);
106 xgifb_reg_set(P3c4
, 0x16, 0x03);
107 xgifb_reg_set(P3c4
, 0x16, 0x83);
108 xgifb_reg_set(P3c4
, 0x1B, 0x00);
111 static void XGINew_SetMemoryClock(struct xgi_hw_device_info
*HwDeviceExtension
,
112 struct vb_device_info
*pVBInfo
)
115 xgifb_reg_set(pVBInfo
->P3c4
,
117 pVBInfo
->MCLKData
[pVBInfo
->ram_type
].SR28
);
118 xgifb_reg_set(pVBInfo
->P3c4
,
120 pVBInfo
->MCLKData
[pVBInfo
->ram_type
].SR29
);
121 xgifb_reg_set(pVBInfo
->P3c4
,
123 pVBInfo
->MCLKData
[pVBInfo
->ram_type
].SR2A
);
125 xgifb_reg_set(pVBInfo
->P3c4
,
127 XGI340_ECLKData
[pVBInfo
->ram_type
].SR2E
);
128 xgifb_reg_set(pVBInfo
->P3c4
,
130 XGI340_ECLKData
[pVBInfo
->ram_type
].SR2F
);
131 xgifb_reg_set(pVBInfo
->P3c4
,
133 XGI340_ECLKData
[pVBInfo
->ram_type
].SR30
);
136 static void XGINew_DDRII_Bootup_XG27(
137 struct xgi_hw_device_info
*HwDeviceExtension
,
138 unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
140 unsigned long P3d4
= P3c4
+ 0x10;
141 pVBInfo
->ram_type
= XGINew_GetXG20DRAMType(HwDeviceExtension
, pVBInfo
);
142 XGINew_SetMemoryClock(HwDeviceExtension
, pVBInfo
);
144 /* Set Double Frequency */
145 xgifb_reg_set(P3d4
, 0x97, pVBInfo
->XGINew_CR97
); /* CR97 */
149 xgifb_reg_set(P3c4
, 0x18, 0x00); /* Set SR18 */ /* EMRS2 */
150 xgifb_reg_set(P3c4
, 0x19, 0x80); /* Set SR19 */
151 xgifb_reg_set(P3c4
, 0x16, 0x20); /* Set SR16 */
153 xgifb_reg_set(P3c4
, 0x16, 0xA0); /* Set SR16 */
156 xgifb_reg_set(P3c4
, 0x18, 0x00); /* Set SR18 */ /* EMRS3 */
157 xgifb_reg_set(P3c4
, 0x19, 0xC0); /* Set SR19 */
158 xgifb_reg_set(P3c4
, 0x16, 0x20); /* Set SR16 */
160 xgifb_reg_set(P3c4
, 0x16, 0xA0); /* Set SR16 */
163 xgifb_reg_set(P3c4
, 0x18, 0x00); /* Set SR18 */ /* EMRS1 */
164 xgifb_reg_set(P3c4
, 0x19, 0x40); /* Set SR19 */
165 xgifb_reg_set(P3c4
, 0x16, 0x20); /* Set SR16 */
167 xgifb_reg_set(P3c4
, 0x16, 0xA0); /* Set SR16 */
170 xgifb_reg_set(P3c4
, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Enable */
171 xgifb_reg_set(P3c4
, 0x19, 0x0A); /* Set SR19 */
172 xgifb_reg_set(P3c4
, 0x16, 0x00); /* Set SR16 */
174 xgifb_reg_set(P3c4
, 0x16, 0x00); /* Set SR16 */
175 xgifb_reg_set(P3c4
, 0x16, 0x80); /* Set SR16 */
177 xgifb_reg_set(P3c4
, 0x1B, 0x04); /* Set SR1B */
179 xgifb_reg_set(P3c4
, 0x1B, 0x00); /* Set SR1B */
181 xgifb_reg_set(P3c4
, 0x18, 0x42); /* Set SR18 */ /* MRS, DLL Reset */
182 xgifb_reg_set(P3c4
, 0x19, 0x08); /* Set SR19 */
183 xgifb_reg_set(P3c4
, 0x16, 0x00); /* Set SR16 */
186 xgifb_reg_set(P3c4
, 0x16, 0x83); /* Set SR16 */
189 xgifb_reg_set(P3c4
, 0x18, 0x80); /* Set SR18 */ /* MRS, ODT */
190 xgifb_reg_set(P3c4
, 0x19, 0x46); /* Set SR19 */
191 xgifb_reg_set(P3c4
, 0x16, 0x20); /* Set SR16 */
193 xgifb_reg_set(P3c4
, 0x16, 0xA0); /* Set SR16 */
196 xgifb_reg_set(P3c4
, 0x18, 0x00); /* Set SR18 */ /* EMRS */
197 xgifb_reg_set(P3c4
, 0x19, 0x40); /* Set SR19 */
198 xgifb_reg_set(P3c4
, 0x16, 0x20); /* Set SR16 */
200 xgifb_reg_set(P3c4
, 0x16, 0xA0); /* Set SR16 */
203 /* Set SR1B refresh control 000:close; 010:open */
204 xgifb_reg_set(P3c4
, 0x1B, 0x04);
209 static void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info
*HwDeviceExtension
,
210 unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
212 unsigned long P3d4
= P3c4
+ 0x10;
214 pVBInfo
->ram_type
= XGINew_GetXG20DRAMType(HwDeviceExtension
, pVBInfo
);
215 XGINew_SetMemoryClock(HwDeviceExtension
, pVBInfo
);
217 xgifb_reg_set(P3d4
, 0x97, 0x11); /* CR97 */
220 xgifb_reg_set(P3c4
, 0x18, 0x00); /* EMRS2 */
221 xgifb_reg_set(P3c4
, 0x19, 0x80);
222 xgifb_reg_set(P3c4
, 0x16, 0x05);
223 xgifb_reg_set(P3c4
, 0x16, 0x85);
225 xgifb_reg_set(P3c4
, 0x18, 0x00); /* EMRS3 */
226 xgifb_reg_set(P3c4
, 0x19, 0xC0);
227 xgifb_reg_set(P3c4
, 0x16, 0x05);
228 xgifb_reg_set(P3c4
, 0x16, 0x85);
230 xgifb_reg_set(P3c4
, 0x18, 0x00); /* EMRS1 */
231 xgifb_reg_set(P3c4
, 0x19, 0x40);
232 xgifb_reg_set(P3c4
, 0x16, 0x05);
233 xgifb_reg_set(P3c4
, 0x16, 0x85);
235 xgifb_reg_set(P3c4
, 0x18, 0x42); /* MRS1 */
236 xgifb_reg_set(P3c4
, 0x19, 0x02);
237 xgifb_reg_set(P3c4
, 0x16, 0x05);
238 xgifb_reg_set(P3c4
, 0x16, 0x85);
241 xgifb_reg_set(P3c4
, 0x1B, 0x04); /* SR1B */
243 xgifb_reg_set(P3c4
, 0x1B, 0x00); /* SR1B */
246 xgifb_reg_set(P3c4
, 0x18, 0x42); /* MRS1 */
247 xgifb_reg_set(P3c4
, 0x19, 0x00);
248 xgifb_reg_set(P3c4
, 0x16, 0x05);
249 xgifb_reg_set(P3c4
, 0x16, 0x85);
254 static void XGINew_DDR1x_MRS_XG20(unsigned long P3c4
,
255 struct vb_device_info
*pVBInfo
)
257 xgifb_reg_set(P3c4
, 0x18, 0x01);
258 xgifb_reg_set(P3c4
, 0x19, 0x40);
259 xgifb_reg_set(P3c4
, 0x16, 0x00);
260 xgifb_reg_set(P3c4
, 0x16, 0x80);
263 xgifb_reg_set(P3c4
, 0x18, 0x00);
264 xgifb_reg_set(P3c4
, 0x19, 0x40);
265 xgifb_reg_set(P3c4
, 0x16, 0x00);
266 xgifb_reg_set(P3c4
, 0x16, 0x80);
270 pVBInfo
->SR15
[2][pVBInfo
->ram_type
]); /* SR18 */
271 xgifb_reg_set(P3c4
, 0x19, 0x01);
272 xgifb_reg_set(P3c4
, 0x16, 0x03);
273 xgifb_reg_set(P3c4
, 0x16, 0x83);
275 xgifb_reg_set(P3c4
, 0x1B, 0x03);
279 pVBInfo
->SR15
[2][pVBInfo
->ram_type
]); /* SR18 */
280 xgifb_reg_set(P3c4
, 0x19, 0x00);
281 xgifb_reg_set(P3c4
, 0x16, 0x03);
282 xgifb_reg_set(P3c4
, 0x16, 0x83);
283 xgifb_reg_set(P3c4
, 0x1B, 0x00);
286 static void XGINew_DDR1x_DefaultRegister(
287 struct xgi_hw_device_info
*HwDeviceExtension
,
288 unsigned long Port
, struct vb_device_info
*pVBInfo
)
290 unsigned long P3d4
= Port
, P3c4
= Port
- 0x10;
292 if (HwDeviceExtension
->jChipType
>= XG20
) {
293 XGINew_SetMemoryClock(HwDeviceExtension
, pVBInfo
);
296 pVBInfo
->CR40
[11][pVBInfo
->ram_type
]); /* CR82 */
299 pVBInfo
->CR40
[12][pVBInfo
->ram_type
]); /* CR85 */
302 pVBInfo
->CR40
[13][pVBInfo
->ram_type
]); /* CR86 */
304 xgifb_reg_set(P3d4
, 0x98, 0x01);
305 xgifb_reg_set(P3d4
, 0x9A, 0x02);
307 XGINew_DDR1x_MRS_XG20(P3c4
, pVBInfo
);
309 XGINew_SetMemoryClock(HwDeviceExtension
, pVBInfo
);
311 switch (HwDeviceExtension
->jChipType
) {
316 pVBInfo
->CR40
[11][pVBInfo
->ram_type
]);
320 pVBInfo
->CR40
[12][pVBInfo
->ram_type
]);
324 pVBInfo
->CR40
[13][pVBInfo
->ram_type
]);
327 xgifb_reg_set(P3d4
, 0x82, 0x88);
328 xgifb_reg_set(P3d4
, 0x86, 0x00);
329 /* Insert read command for delay */
330 xgifb_reg_get(P3d4
, 0x86);
331 xgifb_reg_set(P3d4
, 0x86, 0x88);
332 xgifb_reg_get(P3d4
, 0x86);
335 pVBInfo
->CR40
[13][pVBInfo
->ram_type
]);
336 xgifb_reg_set(P3d4
, 0x82, 0x77);
337 xgifb_reg_set(P3d4
, 0x85, 0x00);
339 /* Insert read command for delay */
340 xgifb_reg_get(P3d4
, 0x85);
341 xgifb_reg_set(P3d4
, 0x85, 0x88);
343 /* Insert read command for delay */
344 xgifb_reg_get(P3d4
, 0x85);
348 pVBInfo
->CR40
[12][pVBInfo
->ram_type
]);
352 pVBInfo
->CR40
[11][pVBInfo
->ram_type
]);
356 xgifb_reg_set(P3d4
, 0x97, 0x00);
357 xgifb_reg_set(P3d4
, 0x98, 0x01);
358 xgifb_reg_set(P3d4
, 0x9A, 0x02);
359 XGINew_DDR1x_MRS_340(P3c4
, pVBInfo
);
363 static void XGINew_DDR2_DefaultRegister(
364 struct xgi_hw_device_info
*HwDeviceExtension
,
365 unsigned long Port
, struct vb_device_info
*pVBInfo
)
367 unsigned long P3d4
= Port
, P3c4
= Port
- 0x10;
369 /* keep following setting sequence, each setting in
370 * the same reg insert idle */
371 xgifb_reg_set(P3d4
, 0x82, 0x77);
372 xgifb_reg_set(P3d4
, 0x86, 0x00);
373 xgifb_reg_get(P3d4
, 0x86); /* Insert read command for delay */
374 xgifb_reg_set(P3d4
, 0x86, 0x88);
375 xgifb_reg_get(P3d4
, 0x86); /* Insert read command for delay */
377 xgifb_reg_set(P3d4
, 0x86, pVBInfo
->CR40
[13][pVBInfo
->ram_type
]);
378 xgifb_reg_set(P3d4
, 0x82, 0x77);
379 xgifb_reg_set(P3d4
, 0x85, 0x00);
380 xgifb_reg_get(P3d4
, 0x85); /* Insert read command for delay */
381 xgifb_reg_set(P3d4
, 0x85, 0x88);
382 xgifb_reg_get(P3d4
, 0x85); /* Insert read command for delay */
385 pVBInfo
->CR40
[12][pVBInfo
->ram_type
]); /* CR85 */
386 if (HwDeviceExtension
->jChipType
== XG27
)
388 xgifb_reg_set(P3d4
, 0x82, pVBInfo
->CR40
[11][pVBInfo
->ram_type
]);
390 xgifb_reg_set(P3d4
, 0x82, 0xA8); /* CR82 */
392 xgifb_reg_set(P3d4
, 0x98, 0x01);
393 xgifb_reg_set(P3d4
, 0x9A, 0x02);
394 if (HwDeviceExtension
->jChipType
== XG27
)
395 XGINew_DDRII_Bootup_XG27(HwDeviceExtension
, P3c4
, pVBInfo
);
397 XGINew_DDR2_MRS_XG20(HwDeviceExtension
, P3c4
, pVBInfo
);
400 static void XGI_SetDRAM_Helper(unsigned long P3d4
, u8 seed
, u8 temp2
, u8 reg
,
401 u8 shift_factor
, u8 mask1
, u8 mask2
)
404 for (j
= 0; j
< 4; j
++) {
405 temp2
|= (((seed
>> (2 * j
)) & 0x03) << shift_factor
);
406 xgifb_reg_set(P3d4
, reg
, temp2
);
407 xgifb_reg_get(P3d4
, reg
);
413 static void XGINew_SetDRAMDefaultRegister340(
414 struct xgi_hw_device_info
*HwDeviceExtension
,
415 unsigned long Port
, struct vb_device_info
*pVBInfo
)
417 unsigned char temp
, temp1
, temp2
, temp3
, j
, k
;
419 unsigned long P3d4
= Port
, P3c4
= Port
- 0x10;
421 xgifb_reg_set(P3d4
, 0x6D, pVBInfo
->CR40
[8][pVBInfo
->ram_type
]);
422 xgifb_reg_set(P3d4
, 0x68, pVBInfo
->CR40
[5][pVBInfo
->ram_type
]);
423 xgifb_reg_set(P3d4
, 0x69, pVBInfo
->CR40
[6][pVBInfo
->ram_type
]);
424 xgifb_reg_set(P3d4
, 0x6A, pVBInfo
->CR40
[7][pVBInfo
->ram_type
]);
426 /* CR6B DQS fine tune delay */
428 XGI_SetDRAM_Helper(P3d4
, temp
, 0, 0x6B, 2, 0xF0, 0x10);
430 /* CR6E DQM fine tune delay */
431 XGI_SetDRAM_Helper(P3d4
, 0, 0, 0x6E, 2, 0xF0, 0x10);
434 for (k
= 0; k
< 4; k
++) {
435 /* CR6E_D[1:0] select channel */
436 xgifb_reg_and_or(P3d4
, 0x6E, 0xFC, temp3
);
437 XGI_SetDRAM_Helper(P3d4
, 0, 0, 0x6F, 0, 0xF8, 0x08);
443 pVBInfo
->CR40
[9][pVBInfo
->ram_type
]); /* CR80 */
446 pVBInfo
->CR40
[10][pVBInfo
->ram_type
]); /* CR81 */
449 /* CR89 terminator type select */
450 XGI_SetDRAM_Helper(P3d4
, 0, temp2
, 0x89, 0, 0xF0, 0x10);
455 xgifb_reg_set(P3d4
, 0x89, temp2
);
457 temp
= pVBInfo
->CR40
[3][pVBInfo
->ram_type
];
459 temp2
= (temp
>> 4) & 0x07;
461 xgifb_reg_set(P3d4
, 0x45, temp1
); /* CR45 */
462 xgifb_reg_set(P3d4
, 0x99, temp2
); /* CR99 */
463 xgifb_reg_or(P3d4
, 0x40, temp3
); /* CR40_D[7] */
466 pVBInfo
->CR40
[0][pVBInfo
->ram_type
]); /* CR41 */
468 if (HwDeviceExtension
->jChipType
== XG27
)
469 xgifb_reg_set(P3d4
, 0x8F, XG27_CR8F
); /* CR8F */
471 for (j
= 0; j
<= 6; j
++) /* CR90 - CR96 */
472 xgifb_reg_set(P3d4
, (0x90 + j
),
473 pVBInfo
->CR40
[14 + j
][pVBInfo
->ram_type
]);
475 for (j
= 0; j
<= 2; j
++) /* CRC3 - CRC5 */
476 xgifb_reg_set(P3d4
, (0xC3 + j
),
477 pVBInfo
->CR40
[21 + j
][pVBInfo
->ram_type
]);
479 for (j
= 0; j
< 2; j
++) /* CR8A - CR8B */
480 xgifb_reg_set(P3d4
, (0x8A + j
),
481 pVBInfo
->CR40
[1 + j
][pVBInfo
->ram_type
]);
483 if (HwDeviceExtension
->jChipType
== XG42
)
484 xgifb_reg_set(P3d4
, 0x8C, 0x87);
488 pVBInfo
->CR40
[4][pVBInfo
->ram_type
]); /* CR59 */
490 xgifb_reg_set(P3d4
, 0x83, 0x09); /* CR83 */
491 xgifb_reg_set(P3d4
, 0x87, 0x00); /* CR87 */
492 xgifb_reg_set(P3d4
, 0xCF, XG40_CRCF
); /* CRCF */
493 if (pVBInfo
->ram_type
) {
494 xgifb_reg_set(P3c4
, 0x17, 0x80); /* SR17 DDRII */
495 if (HwDeviceExtension
->jChipType
== XG27
)
496 xgifb_reg_set(P3c4
, 0x17, 0x02); /* SR17 DDRII */
499 xgifb_reg_set(P3c4
, 0x17, 0x00); /* SR17 DDR */
501 xgifb_reg_set(P3c4
, 0x1A, 0x87); /* SR1A */
503 temp
= XGINew_GetXG20DRAMType(HwDeviceExtension
, pVBInfo
);
505 XGINew_DDR1x_DefaultRegister(HwDeviceExtension
, P3d4
, pVBInfo
);
507 xgifb_reg_set(P3d4
, 0xB0, 0x80); /* DDRII Dual frequency mode */
508 XGINew_DDR2_DefaultRegister(HwDeviceExtension
, P3d4
, pVBInfo
);
512 pVBInfo
->SR15
[3][pVBInfo
->ram_type
]); /* SR1B */
516 static unsigned short XGINew_SetDRAMSize20Reg(
517 unsigned short dram_size
,
518 struct vb_device_info
*pVBInfo
)
520 unsigned short data
= 0, memsize
= 0;
522 unsigned char ChannelNo
;
524 RankSize
= dram_size
* pVBInfo
->ram_bus
/ 8;
525 data
= xgifb_reg_get(pVBInfo
->P3c4
, 0x13);
533 if (pVBInfo
->ram_channel
== 3)
536 ChannelNo
= pVBInfo
->ram_channel
;
538 if (ChannelNo
* RankSize
<= 256) {
539 while ((RankSize
>>= 1) > 0)
544 /* Fix DRAM Sizing Error */
545 xgifb_reg_set(pVBInfo
->P3c4
,
547 (xgifb_reg_get(pVBInfo
->P3c4
, 0x14) & 0x0F) |
554 static int XGINew_ReadWriteRest(unsigned short StopAddr
,
555 unsigned short StartAddr
, struct vb_device_info
*pVBInfo
)
558 unsigned long Position
= 0;
559 void __iomem
*fbaddr
= pVBInfo
->FBAddr
;
561 writel(Position
, fbaddr
+ Position
);
563 for (i
= StartAddr
; i
<= StopAddr
; i
++) {
565 writel(Position
, fbaddr
+ Position
);
568 udelay(500); /* Fix #1759 Memory Size error in Multi-Adapter. */
572 if (readl(fbaddr
+ Position
) != Position
)
575 for (i
= StartAddr
; i
<= StopAddr
; i
++) {
577 if (readl(fbaddr
+ Position
) != Position
)
583 static unsigned char XGINew_CheckFrequence(struct vb_device_info
*pVBInfo
)
587 data
= xgifb_reg_get(pVBInfo
->P3d4
, 0x97);
589 if ((data
& 0x10) == 0) {
590 data
= xgifb_reg_get(pVBInfo
->P3c4
, 0x39);
591 data
= (data
& 0x02) >> 1;
598 static void XGINew_CheckChannel(struct xgi_hw_device_info
*HwDeviceExtension
,
599 struct vb_device_info
*pVBInfo
)
603 switch (HwDeviceExtension
->jChipType
) {
606 data
= xgifb_reg_get(pVBInfo
->P3d4
, 0x97);
608 pVBInfo
->ram_channel
= 1; /* XG20 "JUST" one channel */
610 if (data
== 0) { /* Single_32_16 */
612 if ((HwDeviceExtension
->ulVideoMemorySize
- 1)
615 pVBInfo
->ram_bus
= 32; /* 32 bits */
616 /* 22bit + 2 rank + 32bit */
617 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xB1);
618 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x52);
621 if (XGINew_ReadWriteRest(24, 23, pVBInfo
) == 1)
624 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) >
626 /* 22bit + 1 rank + 32bit */
627 xgifb_reg_set(pVBInfo
->P3c4
,
630 xgifb_reg_set(pVBInfo
->P3c4
,
635 if (XGINew_ReadWriteRest(23,
642 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) >
644 pVBInfo
->ram_bus
= 16; /* 16 bits */
645 /* 22bit + 2 rank + 16bit */
646 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xB1);
647 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x41);
650 if (XGINew_ReadWriteRest(23, 22, pVBInfo
) == 1)
653 xgifb_reg_set(pVBInfo
->P3c4
,
659 } else { /* Dual_16_8 */
660 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) >
662 pVBInfo
->ram_bus
= 16; /* 16 bits */
663 /* (0x31:12x8x2) 22bit + 2 rank */
664 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xB1);
666 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x41);
669 if (XGINew_ReadWriteRest(23, 22, pVBInfo
) == 1)
672 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) >
674 /* (0x31:12x8x2) 22bit + 1 rank */
675 xgifb_reg_set(pVBInfo
->P3c4
,
679 xgifb_reg_set(pVBInfo
->P3c4
,
684 if (XGINew_ReadWriteRest(22,
691 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) >
693 pVBInfo
->ram_bus
= 8; /* 8 bits */
694 /* (0x31:12x8x2) 22bit + 2 rank */
695 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xB1);
697 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x30);
700 if (XGINew_ReadWriteRest(22, 21, pVBInfo
) == 1)
702 else /* (0x31:12x8x2) 22bit + 1 rank */
703 xgifb_reg_set(pVBInfo
->P3c4
,
712 pVBInfo
->ram_bus
= 16; /* 16 bits */
713 pVBInfo
->ram_channel
= 1; /* Single channel */
714 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x51); /* 32Mx16 bit*/
718 XG42 SR14 D[3] Reserve
719 D[2] = 1, Dual Channel
722 It's Different from Other XG40 Series.
724 if (XGINew_CheckFrequence(pVBInfo
) == 1) { /* DDRII, DDR2x */
725 pVBInfo
->ram_bus
= 32; /* 32 bits */
726 pVBInfo
->ram_channel
= 2; /* 2 Channel */
727 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xA1);
728 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x44);
730 if (XGINew_ReadWriteRest(24, 23, pVBInfo
) == 1)
733 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0x21);
734 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x34);
735 if (XGINew_ReadWriteRest(23, 22, pVBInfo
) == 1)
738 pVBInfo
->ram_channel
= 1; /* Single Channel */
739 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xA1);
740 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x40);
742 if (XGINew_ReadWriteRest(23, 22, pVBInfo
) == 1)
745 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0x21);
746 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x30);
749 pVBInfo
->ram_bus
= 64; /* 64 bits */
750 pVBInfo
->ram_channel
= 1; /* 1 channels */
751 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xA1);
752 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x52);
754 if (XGINew_ReadWriteRest(24, 23, pVBInfo
) == 1)
757 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0x21);
758 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x42);
766 if (XGINew_CheckFrequence(pVBInfo
) == 1) { /* DDRII */
767 pVBInfo
->ram_bus
= 32; /* 32 bits */
768 pVBInfo
->ram_channel
= 3;
769 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xA1);
770 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x4C);
772 if (XGINew_ReadWriteRest(25, 23, pVBInfo
) == 1)
775 pVBInfo
->ram_channel
= 2; /* 2 channels */
776 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x48);
778 if (XGINew_ReadWriteRest(24, 23, pVBInfo
) == 1)
781 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0x21);
782 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x3C);
784 if (XGINew_ReadWriteRest(24, 23, pVBInfo
) == 1) {
785 pVBInfo
->ram_channel
= 3; /* 4 channels */
787 pVBInfo
->ram_channel
= 2; /* 2 channels */
788 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x38);
791 pVBInfo
->ram_bus
= 64; /* 64 bits */
792 pVBInfo
->ram_channel
= 2; /* 2 channels */
793 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0xA1);
794 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x5A);
796 if (XGINew_ReadWriteRest(25, 24, pVBInfo
) == 1) {
799 xgifb_reg_set(pVBInfo
->P3c4
, 0x13, 0x21);
800 xgifb_reg_set(pVBInfo
->P3c4
, 0x14, 0x4A);
807 static int XGINew_DDRSizing340(struct xgi_hw_device_info
*HwDeviceExtension
,
808 struct vb_device_info
*pVBInfo
)
811 unsigned short memsize
, start_addr
;
812 const unsigned short (*dram_table
)[2];
814 xgifb_reg_set(pVBInfo
->P3c4
, 0x15, 0x00); /* noninterleaving */
815 xgifb_reg_set(pVBInfo
->P3c4
, 0x1C, 0x00); /* nontiling */
816 XGINew_CheckChannel(HwDeviceExtension
, pVBInfo
);
818 if (HwDeviceExtension
->jChipType
>= XG20
) {
819 dram_table
= XGINew_DDRDRAM_TYPE20
;
820 size
= ARRAY_SIZE(XGINew_DDRDRAM_TYPE20
);
823 dram_table
= XGINew_DDRDRAM_TYPE340
;
824 size
= ARRAY_SIZE(XGINew_DDRDRAM_TYPE340
);
828 for (i
= 0; i
< size
; i
++) {
829 /* SetDRAMSizingType */
830 xgifb_reg_and_or(pVBInfo
->P3c4
, 0x13, 0x80, dram_table
[i
][1]);
831 udelay(15); /* should delay 50 ns */
833 memsize
= XGINew_SetDRAMSize20Reg(dram_table
[i
][0], pVBInfo
);
838 memsize
+= (pVBInfo
->ram_channel
- 2) + 20;
839 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) <
840 (unsigned long) (1 << memsize
))
843 if (XGINew_ReadWriteRest(memsize
, start_addr
, pVBInfo
) == 1)
849 static void XGINew_SetDRAMSize_340(struct xgifb_video_info
*xgifb_info
,
850 struct xgi_hw_device_info
*HwDeviceExtension
,
851 struct vb_device_info
*pVBInfo
)
855 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
857 XGISetModeNew(xgifb_info
, HwDeviceExtension
, 0x2e);
859 data
= xgifb_reg_get(pVBInfo
->P3c4
, 0x21);
860 /* disable read cache */
861 xgifb_reg_set(pVBInfo
->P3c4
, 0x21, (unsigned short) (data
& 0xDF));
862 XGI_DisplayOff(xgifb_info
, HwDeviceExtension
, pVBInfo
);
864 XGINew_DDRSizing340(HwDeviceExtension
, pVBInfo
);
865 data
= xgifb_reg_get(pVBInfo
->P3c4
, 0x21);
866 /* enable read cache */
867 xgifb_reg_set(pVBInfo
->P3c4
, 0x21, (unsigned short) (data
| 0x20));
870 static u8
*xgifb_copy_rom(struct pci_dev
*dev
, size_t *rom_size
)
872 void __iomem
*rom_address
;
875 rom_address
= pci_map_rom(dev
, rom_size
);
876 if (rom_address
== NULL
)
879 rom_copy
= vzalloc(XGIFB_ROM_SIZE
);
880 if (rom_copy
== NULL
)
883 *rom_size
= min_t(size_t, *rom_size
, XGIFB_ROM_SIZE
);
884 memcpy_fromio(rom_copy
, rom_address
, *rom_size
);
887 pci_unmap_rom(dev
, rom_address
);
891 static void xgifb_read_vbios(struct pci_dev
*pdev
,
892 struct vb_device_info
*pVBInfo
)
894 struct xgifb_video_info
*xgifb_info
= pci_get_drvdata(pdev
);
898 struct XGI21_LVDSCapStruct
*lvds
;
902 if (xgifb_info
->chip
!= XG21
)
904 pVBInfo
->IF_DEF_LVDS
= 0;
905 vbios
= xgifb_copy_rom(pdev
, &vbios_size
);
907 dev_err(&pdev
->dev
, "Video BIOS not available\n");
910 if (vbios_size
<= 0x65)
913 * The user can ignore the LVDS bit in the BIOS and force the display
916 if (!(vbios
[0x65] & 0x1) &&
917 (!xgifb_info
->display2_force
||
918 xgifb_info
->display2
!= XGIFB_DISP_LCD
)) {
922 if (vbios_size
<= 0x317)
924 i
= vbios
[0x316] | (vbios
[0x317] << 8);
925 if (vbios_size
<= i
- 1)
933 * Read the LVDS table index scratch register set by the BIOS.
935 entry
= xgifb_reg_get(xgifb_info
->dev_info
.P3d4
, 0x36);
939 lvds
= &xgifb_info
->lvds_data
;
940 if (vbios_size
<= i
+ 24)
942 lvds
->LVDS_Capability
= vbios
[i
] | (vbios
[i
+ 1] << 8);
943 lvds
->LVDSHT
= vbios
[i
+ 2] | (vbios
[i
+ 3] << 8);
944 lvds
->LVDSVT
= vbios
[i
+ 4] | (vbios
[i
+ 5] << 8);
945 lvds
->LVDSHDE
= vbios
[i
+ 6] | (vbios
[i
+ 7] << 8);
946 lvds
->LVDSVDE
= vbios
[i
+ 8] | (vbios
[i
+ 9] << 8);
947 lvds
->LVDSHFP
= vbios
[i
+ 10] | (vbios
[i
+ 11] << 8);
948 lvds
->LVDSVFP
= vbios
[i
+ 12] | (vbios
[i
+ 13] << 8);
949 lvds
->LVDSHSYNC
= vbios
[i
+ 14] | (vbios
[i
+ 15] << 8);
950 lvds
->LVDSVSYNC
= vbios
[i
+ 16] | (vbios
[i
+ 17] << 8);
951 lvds
->VCLKData1
= vbios
[i
+ 18];
952 lvds
->VCLKData2
= vbios
[i
+ 19];
953 lvds
->PSC_S1
= vbios
[i
+ 20];
954 lvds
->PSC_S2
= vbios
[i
+ 21];
955 lvds
->PSC_S3
= vbios
[i
+ 22];
956 lvds
->PSC_S4
= vbios
[i
+ 23];
957 lvds
->PSC_S5
= vbios
[i
+ 24];
959 pVBInfo
->IF_DEF_LVDS
= 1;
962 dev_err(&pdev
->dev
, "Video BIOS corrupted\n");
966 static void XGINew_ChkSenseStatus(struct xgi_hw_device_info
*HwDeviceExtension
,
967 struct vb_device_info
*pVBInfo
)
969 unsigned short tempbx
= 0, temp
, tempcx
, CR3CData
;
971 temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x32);
973 if (temp
& Monitor1Sense
)
974 tempbx
|= ActiveCRT1
;
977 if (temp
& Monitor2Sense
)
978 tempbx
|= ActiveCRT2
;
979 if (temp
& TVSense
) {
981 if (temp
& AVIDEOSense
)
982 tempbx
|= (ActiveAVideo
<< 8);
983 if (temp
& SVIDEOSense
)
984 tempbx
|= (ActiveSVideo
<< 8);
985 if (temp
& SCARTSense
)
986 tempbx
|= (ActiveSCART
<< 8);
987 if (temp
& HiTVSense
)
988 tempbx
|= (ActiveHiTV
<< 8);
989 if (temp
& YPbPrSense
)
990 tempbx
|= (ActiveYPbPr
<< 8);
993 tempcx
= xgifb_reg_get(pVBInfo
->P3d4
, 0x3d);
994 tempcx
|= (xgifb_reg_get(pVBInfo
->P3d4
, 0x3e) << 8);
996 if (tempbx
& tempcx
) {
997 CR3CData
= xgifb_reg_get(pVBInfo
->P3d4
, 0x3c);
998 if (!(CR3CData
& DisplayDeviceFromCMOS
))
1005 xgifb_reg_set(pVBInfo
->P3d4
, 0x3d, (tempbx
& 0x00FF));
1006 xgifb_reg_set(pVBInfo
->P3d4
, 0x3e, ((tempbx
& 0xFF00) >> 8));
1009 static void XGINew_SetModeScratch(struct xgi_hw_device_info
*HwDeviceExtension
,
1010 struct vb_device_info
*pVBInfo
)
1012 unsigned short temp
, tempcl
= 0, tempch
= 0, CR31Data
, CR38Data
;
1014 temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x3d);
1015 temp
|= xgifb_reg_get(pVBInfo
->P3d4
, 0x3e) << 8;
1016 temp
|= (xgifb_reg_get(pVBInfo
->P3d4
, 0x31) & (DriverMode
>> 8)) << 8;
1018 if (pVBInfo
->IF_DEF_CRT2Monitor
== 1) {
1019 if (temp
& ActiveCRT2
)
1020 tempcl
= SetCRT2ToRAMDAC
;
1023 if (temp
& ActiveLCD
) {
1024 tempcl
|= SetCRT2ToLCD
;
1025 if (temp
& DriverMode
) {
1026 if (temp
& ActiveTV
) {
1027 tempch
= SetToLCDA
| EnableDualEdge
;
1028 temp
^= SetCRT2ToLCD
;
1030 if ((temp
>> 8) & ActiveAVideo
)
1031 tempcl
|= SetCRT2ToAVIDEO
;
1032 if ((temp
>> 8) & ActiveSVideo
)
1033 tempcl
|= SetCRT2ToSVIDEO
;
1034 if ((temp
>> 8) & ActiveSCART
)
1035 tempcl
|= SetCRT2ToSCART
;
1037 if (pVBInfo
->IF_DEF_HiVision
== 1) {
1038 if ((temp
>> 8) & ActiveHiTV
)
1039 tempcl
|= SetCRT2ToHiVision
;
1042 if (pVBInfo
->IF_DEF_YPbPr
== 1) {
1043 if ((temp
>> 8) & ActiveYPbPr
)
1049 if ((temp
>> 8) & ActiveAVideo
)
1050 tempcl
|= SetCRT2ToAVIDEO
;
1051 if ((temp
>> 8) & ActiveSVideo
)
1052 tempcl
|= SetCRT2ToSVIDEO
;
1053 if ((temp
>> 8) & ActiveSCART
)
1054 tempcl
|= SetCRT2ToSCART
;
1056 if (pVBInfo
->IF_DEF_HiVision
== 1) {
1057 if ((temp
>> 8) & ActiveHiTV
)
1058 tempcl
|= SetCRT2ToHiVision
;
1061 if (pVBInfo
->IF_DEF_YPbPr
== 1) {
1062 if ((temp
>> 8) & ActiveYPbPr
)
1067 tempcl
|= SetSimuScanMode
;
1068 if ((!(temp
& ActiveCRT1
)) && ((temp
& ActiveLCD
) || (temp
& ActiveTV
)
1069 || (temp
& ActiveCRT2
)))
1070 tempcl
^= (SetSimuScanMode
| SwitchCRT2
);
1071 if ((temp
& ActiveLCD
) && (temp
& ActiveTV
))
1072 tempcl
^= (SetSimuScanMode
| SwitchCRT2
);
1073 xgifb_reg_set(pVBInfo
->P3d4
, 0x30, tempcl
);
1075 CR31Data
= xgifb_reg_get(pVBInfo
->P3d4
, 0x31);
1076 CR31Data
&= ~(SetNotSimuMode
>> 8);
1077 if (!(temp
& ActiveCRT1
))
1078 CR31Data
|= (SetNotSimuMode
>> 8);
1079 CR31Data
&= ~(DisableCRT2Display
>> 8);
1080 if (!((temp
& ActiveLCD
) || (temp
& ActiveTV
) || (temp
& ActiveCRT2
)))
1081 CR31Data
|= (DisableCRT2Display
>> 8);
1082 xgifb_reg_set(pVBInfo
->P3d4
, 0x31, CR31Data
);
1084 CR38Data
= xgifb_reg_get(pVBInfo
->P3d4
, 0x38);
1085 CR38Data
&= ~SetYPbPr
;
1087 xgifb_reg_set(pVBInfo
->P3d4
, 0x38, CR38Data
);
1091 static unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
1093 struct vb_device_info
*pVBInfo
)
1095 unsigned short temp
;
1098 if (HwDeviceExtension
->ulCRT2LCDType
== LCD_UNKNOWN
) {
1101 temp
= (unsigned short) HwDeviceExtension
->ulCRT2LCDType
;
1102 switch (HwDeviceExtension
->ulCRT2LCDType
) {
1130 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x36, 0xF0, temp
);
1135 static void XGINew_GetXG21Sense(struct xgi_hw_device_info
*HwDeviceExtension
,
1136 struct vb_device_info
*pVBInfo
)
1140 if (pVBInfo
->IF_DEF_LVDS
) { /* For XG21 LVDS */
1141 xgifb_reg_or(pVBInfo
->P3d4
, 0x32, LCDSense
);
1143 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x38, ~0xE0, 0xC0);
1145 /* Enable GPIOA/B read */
1146 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x4A, ~0x03, 0x03);
1147 Temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48) & 0xC0;
1148 if (Temp
== 0xC0) { /* DVI & DVO GPIOA/B pull high */
1149 XGINew_SenseLCD(HwDeviceExtension
, pVBInfo
);
1150 xgifb_reg_or(pVBInfo
->P3d4
, 0x32, LCDSense
);
1151 /* Enable read GPIOF */
1152 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x4A, ~0x20, 0x20);
1153 Temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48) & 0x04;
1155 xgifb_reg_and_or(pVBInfo
->P3d4
,
1158 0x80); /* TMDS on chip */
1160 xgifb_reg_and_or(pVBInfo
->P3d4
,
1163 0xA0); /* Only DVO on chip */
1164 /* Disable read GPIOF */
1165 xgifb_reg_and(pVBInfo
->P3d4
, 0x4A, ~0x20);
1170 static void XGINew_GetXG27Sense(struct xgi_hw_device_info
*HwDeviceExtension
,
1171 struct vb_device_info
*pVBInfo
)
1173 unsigned char Temp
, bCR4A
;
1175 pVBInfo
->IF_DEF_LVDS
= 0;
1176 bCR4A
= xgifb_reg_get(pVBInfo
->P3d4
, 0x4A);
1177 /* Enable GPIOA/B/C read */
1178 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x4A, ~0x07, 0x07);
1179 Temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48) & 0x07;
1180 xgifb_reg_set(pVBInfo
->P3d4
, 0x4A, bCR4A
);
1184 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x38, ~0xE0, 0xC0);
1185 xgifb_reg_set(pVBInfo
->P3d4
, 0x30, 0x21);
1187 /* TMDS/DVO setting */
1188 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x38, ~0xE0, 0xA0);
1190 xgifb_reg_or(pVBInfo
->P3d4
, 0x32, LCDSense
);
1194 static unsigned char GetXG21FPBits(struct vb_device_info
*pVBInfo
)
1196 unsigned char CR38
, CR4A
, temp
;
1198 CR4A
= xgifb_reg_get(pVBInfo
->P3d4
, 0x4A);
1199 /* enable GPIOE read */
1200 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x4A, ~0x10, 0x10);
1201 CR38
= xgifb_reg_get(pVBInfo
->P3d4
, 0x38);
1203 if ((CR38
& 0xE0) > 0x80) {
1204 temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48);
1209 xgifb_reg_set(pVBInfo
->P3d4
, 0x4A, CR4A
);
1214 static unsigned char GetXG27FPBits(struct vb_device_info
*pVBInfo
)
1216 unsigned char CR4A
, temp
;
1218 CR4A
= xgifb_reg_get(pVBInfo
->P3d4
, 0x4A);
1219 /* enable GPIOA/B/C read */
1220 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x4A, ~0x03, 0x03);
1221 temp
= xgifb_reg_get(pVBInfo
->P3d4
, 0x48);
1225 temp
= ((temp
& 0x04) >> 1) | ((~temp
) & 0x01);
1227 xgifb_reg_set(pVBInfo
->P3d4
, 0x4A, CR4A
);
1232 unsigned char XGIInitNew(struct pci_dev
*pdev
)
1234 struct xgifb_video_info
*xgifb_info
= pci_get_drvdata(pdev
);
1235 struct xgi_hw_device_info
*HwDeviceExtension
= &xgifb_info
->hw_info
;
1236 struct vb_device_info VBINF
;
1237 struct vb_device_info
*pVBInfo
= &VBINF
;
1238 unsigned char i
, temp
= 0, temp1
;
1240 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1242 if (pVBInfo
->FBAddr
== NULL
) {
1243 dev_dbg(&pdev
->dev
, "pVBInfo->FBAddr == 0\n");
1247 XGIRegInit(pVBInfo
, xgifb_info
->vga_base
);
1249 outb(0x67, pVBInfo
->P3c2
);
1251 if (HwDeviceExtension
->jChipType
< XG20
)
1252 /* Run XGI_GetVBType before InitTo330Pointer */
1253 XGI_GetVBType(pVBInfo
);
1255 InitTo330Pointer(HwDeviceExtension
->jChipType
, pVBInfo
);
1257 xgifb_read_vbios(pdev
, pVBInfo
);
1260 xgifb_reg_set(pVBInfo
->P3c4
, 0x05, 0x86);
1262 /* GetXG21Sense (GPIO) */
1263 if (HwDeviceExtension
->jChipType
== XG21
)
1264 XGINew_GetXG21Sense(HwDeviceExtension
, pVBInfo
);
1266 if (HwDeviceExtension
->jChipType
== XG27
)
1267 XGINew_GetXG27Sense(HwDeviceExtension
, pVBInfo
);
1269 /* Reset Extended register */
1271 for (i
= 0x06; i
< 0x20; i
++)
1272 xgifb_reg_set(pVBInfo
->P3c4
, i
, 0);
1274 for (i
= 0x21; i
<= 0x27; i
++)
1275 xgifb_reg_set(pVBInfo
->P3c4
, i
, 0);
1277 for (i
= 0x31; i
<= 0x3B; i
++)
1278 xgifb_reg_set(pVBInfo
->P3c4
, i
, 0);
1280 /* Auto over driver for XG42 */
1281 if (HwDeviceExtension
->jChipType
== XG42
)
1282 xgifb_reg_set(pVBInfo
->P3c4
, 0x3B, 0xC0);
1284 for (i
= 0x79; i
<= 0x7C; i
++)
1285 xgifb_reg_set(pVBInfo
->P3d4
, i
, 0);
1287 if (HwDeviceExtension
->jChipType
>= XG20
)
1288 xgifb_reg_set(pVBInfo
->P3d4
, 0x97, pVBInfo
->XGINew_CR97
);
1290 /* SetDefExt1Regs begin */
1291 xgifb_reg_set(pVBInfo
->P3c4
, 0x07, XGI330_SR07
);
1292 if (HwDeviceExtension
->jChipType
== XG27
) {
1293 xgifb_reg_set(pVBInfo
->P3c4
, 0x40, XG27_SR40
);
1294 xgifb_reg_set(pVBInfo
->P3c4
, 0x41, XG27_SR41
);
1296 xgifb_reg_set(pVBInfo
->P3c4
, 0x11, 0x0F);
1297 xgifb_reg_set(pVBInfo
->P3c4
, 0x1F, XGI330_SR1F
);
1298 /* Frame buffer can read/write SR20 */
1299 xgifb_reg_set(pVBInfo
->P3c4
, 0x20, 0xA0);
1300 /* H/W request for slow corner chip */
1301 xgifb_reg_set(pVBInfo
->P3c4
, 0x36, 0x70);
1302 if (HwDeviceExtension
->jChipType
== XG27
)
1303 xgifb_reg_set(pVBInfo
->P3c4
, 0x36, XG27_SR36
);
1305 if (HwDeviceExtension
->jChipType
< XG20
) {
1308 /* Set AGP customize registers (in SetDefAGPRegs) Start */
1309 for (i
= 0x47; i
<= 0x4C; i
++)
1310 xgifb_reg_set(pVBInfo
->P3d4
,
1312 XGI340_AGPReg
[i
- 0x47]);
1314 for (i
= 0x70; i
<= 0x71; i
++)
1315 xgifb_reg_set(pVBInfo
->P3d4
,
1317 XGI340_AGPReg
[6 + i
- 0x70]);
1319 for (i
= 0x74; i
<= 0x77; i
++)
1320 xgifb_reg_set(pVBInfo
->P3d4
,
1322 XGI340_AGPReg
[8 + i
- 0x74]);
1324 pci_read_config_dword(pdev
, 0x50, &Temp
);
1329 xgifb_reg_set(pVBInfo
->P3d4
, 0x48, 0x20); /* CR48 */
1333 xgifb_reg_set(pVBInfo
->P3c4
, 0x23, XGI330_SR23
);
1334 xgifb_reg_set(pVBInfo
->P3c4
, 0x24, XGI330_SR24
);
1335 xgifb_reg_set(pVBInfo
->P3c4
, 0x25, 0);
1337 if (HwDeviceExtension
->jChipType
< XG20
) {
1339 XGI_UnLockCRT2(HwDeviceExtension
, pVBInfo
);
1340 /* disable VideoCapture */
1341 xgifb_reg_and_or(pVBInfo
->Part0Port
, 0x3F, 0xEF, 0x00);
1342 xgifb_reg_set(pVBInfo
->Part1Port
, 0x00, 0x00);
1343 /* chk if BCLK>=100MHz */
1344 temp1
= xgifb_reg_get(pVBInfo
->P3d4
, 0x7B);
1345 temp
= (unsigned char) ((temp1
>> 4) & 0x0F);
1347 xgifb_reg_set(pVBInfo
->Part1Port
,
1348 0x02, XGI330_CRT2Data_1_2
);
1350 xgifb_reg_set(pVBInfo
->Part1Port
, 0x2E, 0x08); /* use VB */
1353 xgifb_reg_set(pVBInfo
->P3c4
, 0x27, 0x1F);
1355 if ((HwDeviceExtension
->jChipType
== XG42
) &&
1356 XGINew_GetXG20DRAMType(HwDeviceExtension
, pVBInfo
) != 0) {
1358 xgifb_reg_set(pVBInfo
->P3c4
,
1360 (XGI330_SR31
& 0x3F) | 0x40);
1361 xgifb_reg_set(pVBInfo
->P3c4
,
1363 (XGI330_SR32
& 0xFC) | 0x01);
1365 xgifb_reg_set(pVBInfo
->P3c4
, 0x31, XGI330_SR31
);
1366 xgifb_reg_set(pVBInfo
->P3c4
, 0x32, XGI330_SR32
);
1368 xgifb_reg_set(pVBInfo
->P3c4
, 0x33, XGI330_SR33
);
1370 if (HwDeviceExtension
->jChipType
< XG20
) {
1371 if (XGI_BridgeIsOn(pVBInfo
) == 1) {
1372 if (pVBInfo
->IF_DEF_LVDS
== 0) {
1373 xgifb_reg_set(pVBInfo
->Part2Port
, 0x00, 0x1C);
1374 xgifb_reg_set(pVBInfo
->Part4Port
,
1375 0x0D, XGI330_CRT2Data_4_D
);
1376 xgifb_reg_set(pVBInfo
->Part4Port
,
1377 0x0E, XGI330_CRT2Data_4_E
);
1378 xgifb_reg_set(pVBInfo
->Part4Port
,
1379 0x10, XGI330_CRT2Data_4_10
);
1380 xgifb_reg_set(pVBInfo
->Part4Port
, 0x0F, 0x3F);
1383 XGI_LockCRT2(HwDeviceExtension
, pVBInfo
);
1387 XGI_SenseCRT1(pVBInfo
);
1389 if (HwDeviceExtension
->jChipType
== XG21
) {
1391 xgifb_reg_and_or(pVBInfo
->P3d4
,
1394 Monitor1Sense
); /* Z9 default has CRT */
1395 temp
= GetXG21FPBits(pVBInfo
);
1396 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x37, ~0x01, temp
);
1399 if (HwDeviceExtension
->jChipType
== XG27
) {
1400 xgifb_reg_and_or(pVBInfo
->P3d4
,
1403 Monitor1Sense
); /* Z9 default has CRT */
1404 temp
= GetXG27FPBits(pVBInfo
);
1405 xgifb_reg_and_or(pVBInfo
->P3d4
, 0x37, ~0x03, temp
);
1408 pVBInfo
->ram_type
= XGINew_GetXG20DRAMType(HwDeviceExtension
, pVBInfo
);
1410 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension
,
1414 XGINew_SetDRAMSize_340(xgifb_info
, HwDeviceExtension
, pVBInfo
);
1416 xgifb_reg_set(pVBInfo
->P3c4
, 0x22, 0xfa);
1417 xgifb_reg_set(pVBInfo
->P3c4
, 0x21, 0xa3);
1419 XGINew_ChkSenseStatus(HwDeviceExtension
, pVBInfo
);
1420 XGINew_SetModeScratch(HwDeviceExtension
, pVBInfo
);
1422 xgifb_reg_set(pVBInfo
->P3d4
, 0x8c, 0x87);
This page took 0.348235 seconds and 5 git commands to generate.