initial commit with v2.6.9
[linux-2.6.9-moxart.git] / drivers / video / aty / radeon_base.c
blob325b83b3017c330c82e81e190ba17de86c9279fa
1 /*
2 * drivers/video/radeonfb.c
3 * framebuffer driver for ATI Radeon chipset video boards
5 * Copyright 2003 Ben. Herrenschmidt <benh@kernel.crashing.org>
6 * Copyright 2000 Ani Joshi <ajoshi@kernel.crashing.org>
8 * i2c bits from Luca Tettamanti <kronos@kronoz.cjb.net>
9 *
10 * Special thanks to ATI DevRel team for their hardware donations.
12 * ...Insert GPL boilerplate here...
14 * Significant portions of this driver apdated from XFree86 Radeon
15 * driver which has the following copyright notice:
17 * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
18 * VA Linux Systems Inc., Fremont, California.
20 * All Rights Reserved.
22 * Permission is hereby granted, free of charge, to any person obtaining
23 * a copy of this software and associated documentation files (the
24 * "Software"), to deal in the Software without restriction, including
25 * without limitation on the rights to use, copy, modify, merge,
26 * publish, distribute, sublicense, and/or sell copies of the Software,
27 * and to permit persons to whom the Software is furnished to do so,
28 * subject to the following conditions:
30 * The above copyright notice and this permission notice (including the
31 * next paragraph) shall be included in all copies or substantial
32 * portions of the Software.
34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37 * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
38 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
39 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
41 * DEALINGS IN THE SOFTWARE.
43 * XFree86 driver authors:
45 * Kevin E. Martin <martin@xfree86.org>
46 * Rickard E. Faith <faith@valinux.com>
47 * Alan Hourihane <alanh@fairlite.demon.co.uk>
52 #define RADEON_VERSION "0.2.0"
54 #include <linux/config.h>
55 #include <linux/module.h>
56 #include <linux/moduleparam.h>
57 #include <linux/kernel.h>
58 #include <linux/errno.h>
59 #include <linux/string.h>
60 #include <linux/mm.h>
61 #include <linux/tty.h>
62 #include <linux/slab.h>
63 #include <linux/delay.h>
64 #include <linux/fb.h>
65 #include <linux/ioport.h>
66 #include <linux/init.h>
67 #include <linux/pci.h>
68 #include <linux/vmalloc.h>
69 #include <linux/device.h>
70 #include <linux/i2c.h>
72 #include <asm/io.h>
73 #include <asm/uaccess.h>
75 #ifdef CONFIG_PPC_OF
77 #include <asm/prom.h>
78 #include <asm/pci-bridge.h>
79 #include "../macmodes.h"
81 #ifdef CONFIG_PMAC_BACKLIGHT
82 #include <asm/backlight.h>
83 #endif
85 #ifdef CONFIG_BOOTX_TEXT
86 #include <asm/btext.h>
87 #endif
89 #endif /* CONFIG_PPC_OF */
91 #ifdef CONFIG_MTRR
92 #include <asm/mtrr.h>
93 #endif
95 #include <video/radeon.h>
96 #include <linux/radeonfb.h>
98 #include "../edid.h" // MOVE THAT TO include/video
99 #include "ati_ids.h"
100 #include "radeonfb.h"
102 #define MAX_MAPPED_VRAM (2048*2048*4)
103 #define MIN_MAPPED_VRAM (1024*768*1)
105 #define CHIP_DEF(id, family, flags) \
106 { PCI_VENDOR_ID_ATI, id, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (flags) | (CHIP_FAMILY_##family) }
108 static struct pci_device_id radeonfb_pci_table[] = {
109 /* Mobility M6 */
110 CHIP_DEF(PCI_CHIP_RADEON_LY, RV100, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
111 CHIP_DEF(PCI_CHIP_RADEON_LZ, RV100, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
112 /* Radeon VE/7000 */
113 CHIP_DEF(PCI_CHIP_RV100_QY, RV100, CHIP_HAS_CRTC2),
114 CHIP_DEF(PCI_CHIP_RV100_QZ, RV100, CHIP_HAS_CRTC2),
115 /* Radeon IGP320M (U1) */
116 CHIP_DEF(PCI_CHIP_RS100_4336, RS100, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
117 /* Radeon IGP320 (A3) */
118 CHIP_DEF(PCI_CHIP_RS100_4136, RS100, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
119 /* IGP330M/340M/350M (U2) */
120 CHIP_DEF(PCI_CHIP_RS200_4337, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
121 /* IGP330/340/350 (A4) */
122 CHIP_DEF(PCI_CHIP_RS200_4137, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
123 /* Mobility 7000 IGP */
124 CHIP_DEF(PCI_CHIP_RS250_4437, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
125 /* 7000 IGP (A4+) */
126 CHIP_DEF(PCI_CHIP_RS250_4237, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
127 /* 8500 AIW */
128 CHIP_DEF(PCI_CHIP_R200_BB, R200, CHIP_HAS_CRTC2),
129 CHIP_DEF(PCI_CHIP_R200_BC, R200, CHIP_HAS_CRTC2),
130 /* 8700/8800 */
131 CHIP_DEF(PCI_CHIP_R200_QH, R200, CHIP_HAS_CRTC2),
132 /* 8500 */
133 CHIP_DEF(PCI_CHIP_R200_QL, R200, CHIP_HAS_CRTC2),
134 /* 9100 */
135 CHIP_DEF(PCI_CHIP_R200_QM, R200, CHIP_HAS_CRTC2),
136 /* Mobility M7 */
137 CHIP_DEF(PCI_CHIP_RADEON_LW, RV200, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
138 CHIP_DEF(PCI_CHIP_RADEON_LX, RV200, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
139 /* 7500 */
140 CHIP_DEF(PCI_CHIP_RV200_QW, RV200, CHIP_HAS_CRTC2),
141 CHIP_DEF(PCI_CHIP_RV200_QX, RV200, CHIP_HAS_CRTC2),
142 /* Mobility M9 */
143 CHIP_DEF(PCI_CHIP_RV250_Ld, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
144 CHIP_DEF(PCI_CHIP_RV250_Le, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
145 CHIP_DEF(PCI_CHIP_RV250_Lf, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
146 CHIP_DEF(PCI_CHIP_RV250_Lg, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
147 /* 9000/Pro */
148 CHIP_DEF(PCI_CHIP_RV250_If, RV250, CHIP_HAS_CRTC2),
149 CHIP_DEF(PCI_CHIP_RV250_Ig, RV250, CHIP_HAS_CRTC2),
150 /* Mobility 9100 IGP (U3) */
151 CHIP_DEF(PCI_CHIP_RS300_5835, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
152 /* 9100 IGP (A5) */
153 CHIP_DEF(PCI_CHIP_RS300_5834, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
154 /* Mobility 9200 (M9+) */
155 CHIP_DEF(PCI_CHIP_RV280_5C61, RV280, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
156 CHIP_DEF(PCI_CHIP_RV280_5C63, RV280, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
157 /* 9200 */
158 CHIP_DEF(PCI_CHIP_RV280_5960, RV280, CHIP_HAS_CRTC2),
159 CHIP_DEF(PCI_CHIP_RV280_5961, RV280, CHIP_HAS_CRTC2),
160 CHIP_DEF(PCI_CHIP_RV280_5962, RV280, CHIP_HAS_CRTC2),
161 CHIP_DEF(PCI_CHIP_RV280_5964, RV280, CHIP_HAS_CRTC2),
162 /* 9500 */
163 CHIP_DEF(PCI_CHIP_R300_AD, R300, CHIP_HAS_CRTC2),
164 CHIP_DEF(PCI_CHIP_R300_AE, R300, CHIP_HAS_CRTC2),
165 /* 9600TX / FireGL Z1 */
166 CHIP_DEF(PCI_CHIP_R300_AF, R300, CHIP_HAS_CRTC2),
167 CHIP_DEF(PCI_CHIP_R300_AG, R300, CHIP_HAS_CRTC2),
168 /* 9700/9500/Pro/FireGL X1 */
169 CHIP_DEF(PCI_CHIP_R300_ND, R300, CHIP_HAS_CRTC2),
170 CHIP_DEF(PCI_CHIP_R300_NE, R300, CHIP_HAS_CRTC2),
171 CHIP_DEF(PCI_CHIP_R300_NF, R300, CHIP_HAS_CRTC2),
172 CHIP_DEF(PCI_CHIP_R300_NG, R300, CHIP_HAS_CRTC2),
173 /* Mobility M10/M11 */
174 CHIP_DEF(PCI_CHIP_RV350_NP, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
175 CHIP_DEF(PCI_CHIP_RV350_NQ, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
176 CHIP_DEF(PCI_CHIP_RV350_NR, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
177 CHIP_DEF(PCI_CHIP_RV350_NS, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
178 CHIP_DEF(PCI_CHIP_RV350_NT, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
179 CHIP_DEF(PCI_CHIP_RV350_NV, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
180 /* 9600/FireGL T2 */
181 CHIP_DEF(PCI_CHIP_RV350_AP, RV350, CHIP_HAS_CRTC2),
182 CHIP_DEF(PCI_CHIP_RV350_AQ, RV350, CHIP_HAS_CRTC2),
183 CHIP_DEF(PCI_CHIP_RV360_AR, RV350, CHIP_HAS_CRTC2),
184 CHIP_DEF(PCI_CHIP_RV350_AS, RV350, CHIP_HAS_CRTC2),
185 CHIP_DEF(PCI_CHIP_RV350_AT, RV350, CHIP_HAS_CRTC2),
186 CHIP_DEF(PCI_CHIP_RV350_AV, RV350, CHIP_HAS_CRTC2),
187 /* 9800/Pro/FileGL X2 */
188 CHIP_DEF(PCI_CHIP_R350_AH, R350, CHIP_HAS_CRTC2),
189 CHIP_DEF(PCI_CHIP_R350_AI, R350, CHIP_HAS_CRTC2),
190 CHIP_DEF(PCI_CHIP_R350_AJ, R350, CHIP_HAS_CRTC2),
191 CHIP_DEF(PCI_CHIP_R350_AK, R350, CHIP_HAS_CRTC2),
192 CHIP_DEF(PCI_CHIP_R350_NH, R350, CHIP_HAS_CRTC2),
193 CHIP_DEF(PCI_CHIP_R350_NI, R350, CHIP_HAS_CRTC2),
194 CHIP_DEF(PCI_CHIP_R360_NJ, R350, CHIP_HAS_CRTC2),
195 CHIP_DEF(PCI_CHIP_R350_NK, R350, CHIP_HAS_CRTC2),
196 /* Original Radeon/7200 */
197 CHIP_DEF(PCI_CHIP_RADEON_QD, RADEON, 0),
198 CHIP_DEF(PCI_CHIP_RADEON_QE, RADEON, 0),
199 CHIP_DEF(PCI_CHIP_RADEON_QF, RADEON, 0),
200 CHIP_DEF(PCI_CHIP_RADEON_QG, RADEON, 0),
201 { 0, }
203 MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
206 typedef struct {
207 u16 reg;
208 u32 val;
209 } reg_val;
212 /* these common regs are cleared before mode setting so they do not
213 * interfere with anything
215 static reg_val common_regs[] = {
216 { OVR_CLR, 0 },
217 { OVR_WID_LEFT_RIGHT, 0 },
218 { OVR_WID_TOP_BOTTOM, 0 },
219 { OV0_SCALE_CNTL, 0 },
220 { SUBPIC_CNTL, 0 },
221 { VIPH_CONTROL, 0 },
222 { I2C_CNTL_1, 0 },
223 { GEN_INT_CNTL, 0 },
224 { CAP0_TRIG_CNTL, 0 },
225 { CAP1_TRIG_CNTL, 0 },
229 * globals
232 static char *mode_option;
233 static char *monitor_layout;
234 static int noaccel = 0;
235 static int nomodeset = 0;
236 static int ignore_edid = 0;
237 static int mirror = 0;
238 static int panel_yres = 0;
239 static int force_dfp = 0;
240 static int force_measure_pll = 0;
241 #ifdef CONFIG_MTRR
242 static int nomtrr = 0;
243 #endif
246 * prototypes
250 #ifdef CONFIG_PPC_OF
252 #ifdef CONFIG_PMAC_BACKLIGHT
253 static int radeon_set_backlight_enable(int on, int level, void *data);
254 static int radeon_set_backlight_level(int level, void *data);
255 static struct backlight_controller radeon_backlight_controller = {
256 radeon_set_backlight_enable,
257 radeon_set_backlight_level
259 #endif /* CONFIG_PMAC_BACKLIGHT */
261 #endif /* CONFIG_PPC_OF */
263 static void __devexit radeon_unmap_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
265 // leave it disabled and unassigned
266 struct resource *r = &dev->resource[PCI_ROM_RESOURCE];
268 if (!rinfo->bios_seg)
269 return;
270 iounmap(rinfo->bios_seg);
272 /* Release the ROM resource if we used it in the first place */
273 if (r->parent && r->flags & PCI_ROM_ADDRESS_ENABLE) {
274 release_resource(r);
275 r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
276 r->end -= r->start;
277 r->start = 0;
279 /* This will disable and set address to unassigned */
280 pci_write_config_dword(dev, dev->rom_base_reg, 0);
283 static int __devinit radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
285 void __iomem *rom;
286 struct resource *r;
287 u16 dptr;
288 u8 rom_type;
290 /* If this is a primary card, there is a shadow copy of the
291 * ROM somewhere in the first meg. We will just ignore the copy
292 * and use the ROM directly.
295 /* Fix from ATI for problem with Radeon hardware not leaving ROM enabled */
296 unsigned int temp;
297 temp = INREG(MPP_TB_CONFIG);
298 temp &= 0x00ffffffu;
299 temp |= 0x04 << 24;
300 OUTREG(MPP_TB_CONFIG, temp);
301 temp = INREG(MPP_TB_CONFIG);
303 /* no need to search for the ROM, just ask the card where it is. */
304 r = &dev->resource[PCI_ROM_RESOURCE];
306 /* assign the ROM an address if it doesn't have one */
307 if (r->parent == NULL)
308 pci_assign_resource(dev, PCI_ROM_RESOURCE);
310 /* enable if needed */
311 if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) {
312 pci_write_config_dword(dev, dev->rom_base_reg,
313 r->start | PCI_ROM_ADDRESS_ENABLE);
314 r->flags |= PCI_ROM_ADDRESS_ENABLE;
317 rom = ioremap(r->start, r->end - r->start + 1);
318 if (!rom) {
319 printk(KERN_ERR "radeonfb: ROM failed to map\n");
320 return -ENOMEM;
323 rinfo->bios_seg = rom;
325 /* Very simple test to make sure it appeared */
326 if (BIOS_IN16(0) != 0xaa55) {
327 printk(KERN_ERR "radeonfb: Invalid ROM signature %x should be 0xaa55\n",
328 BIOS_IN16(0));
329 goto failed;
331 /* Look for the PCI data to check the ROM type */
332 dptr = BIOS_IN16(0x18);
334 /* Check the PCI data signature. If it's wrong, we still assume a normal x86 ROM
335 * for now, until I've verified this works everywhere. The goal here is more
336 * to phase out Open Firmware images.
338 * Currently, we only look at the first PCI data, we could iteratre and deal with
339 * them all, and we should use fb_bios_start relative to start of image and not
340 * relative start of ROM, but so far, I never found a dual-image ATI card
342 * typedef struct {
343 * u32 signature; + 0x00
344 * u16 vendor; + 0x04
345 * u16 device; + 0x06
346 * u16 reserved_1; + 0x08
347 * u16 dlen; + 0x0a
348 * u8 drevision; + 0x0c
349 * u8 class_hi; + 0x0d
350 * u16 class_lo; + 0x0e
351 * u16 ilen; + 0x10
352 * u16 irevision; + 0x12
353 * u8 type; + 0x14
354 * u8 indicator; + 0x15
355 * u16 reserved_2; + 0x16
356 * } pci_data_t;
358 if (BIOS_IN32(dptr) != (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P')) {
359 printk(KERN_WARNING "radeonfb: PCI DATA signature in ROM incorrect: %08x\n",
360 BIOS_IN32(dptr));
361 goto anyway;
363 rom_type = BIOS_IN8(dptr + 0x14);
364 switch(rom_type) {
365 case 0:
366 printk(KERN_INFO "radeonfb: Found Intel x86 BIOS ROM Image\n");
367 break;
368 case 1:
369 printk(KERN_INFO "radeonfb: Found Open Firmware ROM Image\n");
370 goto failed;
371 case 2:
372 printk(KERN_INFO "radeonfb: Found HP PA-RISC ROM Image\n");
373 goto failed;
374 default:
375 printk(KERN_INFO "radeonfb: Found unknown type %d ROM Image\n", rom_type);
376 goto failed;
378 anyway:
379 /* Locate the flat panel infos, do some sanity checking !!! */
380 rinfo->fp_bios_start = BIOS_IN16(0x48);
381 return 0;
383 failed:
384 rinfo->bios_seg = NULL;
385 radeon_unmap_ROM(rinfo, dev);
386 return -ENXIO;
389 #ifdef CONFIG_X86
390 static int __devinit radeon_find_mem_vbios(struct radeonfb_info *rinfo)
392 /* I simplified this code as we used to miss the signatures in
393 * a lot of case. It's now closer to XFree, we just don't check
394 * for signatures at all... Something better will have to be done
395 * if we end up having conflicts
397 u32 segstart;
398 void __iomem *rom_base = NULL;
400 for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
401 rom_base = ioremap(segstart, 0x10000);
402 if (rom_base == NULL)
403 return -ENOMEM;
404 if (readb(rom_base) == 0x55 && readb(rom_base + 1) == 0xaa)
405 break;
406 iounmap(rom_base);
407 rom_base = NULL;
409 if (rom_base == NULL)
410 return -ENXIO;
412 /* Locate the flat panel infos, do some sanity checking !!! */
413 rinfo->bios_seg = rom_base;
414 rinfo->fp_bios_start = BIOS_IN16(0x48);
416 return 0;
418 #endif
420 #ifdef CONFIG_PPC_OF
422 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
423 * tree. Hopefully, ATI OF driver is kind enough to fill these
425 static int __devinit radeon_read_xtal_OF (struct radeonfb_info *rinfo)
427 struct device_node *dp;
428 u32 *val;
430 dp = pci_device_to_OF_node(rinfo->pdev);
431 if (dp == NULL) {
432 printk(KERN_WARNING "radeonfb: Cannot match card to OF node !\n");
433 return -ENODEV;
435 val = (u32 *) get_property(dp, "ATY,RefCLK", NULL);
436 if (!val || !*val) {
437 printk(KERN_WARNING "radeonfb: No ATY,RefCLK property !\n");
438 return -EINVAL;
441 rinfo->pll.ref_clk = (*val) / 10;
443 val = (u32 *) get_property(dp, "ATY,SCLK", NULL);
444 if (val && *val)
445 rinfo->pll.sclk = (*val) / 10;
447 val = (u32 *) get_property(dp, "ATY,MCLK", NULL);
448 if (val && *val)
449 rinfo->pll.mclk = (*val) / 10;
451 return 0;
453 #endif /* CONFIG_PPC_OF */
456 * Read PLL infos from chip registers
458 static int __devinit radeon_probe_pll_params(struct radeonfb_info *rinfo)
460 unsigned char ppll_div_sel;
461 unsigned Ns, Nm, M;
462 unsigned sclk, mclk, tmp, ref_div;
463 int hTotal, vTotal, num, denom, m, n;
464 unsigned long long hz, vclk;
465 long xtal;
466 struct timeval start_tv, stop_tv;
467 long total_secs, total_usecs;
468 int i;
470 /* Ugh, we cut interrupts, bad bad bad, but we want some precision
471 * here, so... --BenH
474 /* Flush PCI buffers ? */
475 tmp = INREG(DEVICE_ID);
477 local_irq_disable();
479 for(i=0; i<1000000; i++)
480 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
481 break;
483 do_gettimeofday(&start_tv);
485 for(i=0; i<1000000; i++)
486 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) != 0)
487 break;
489 for(i=0; i<1000000; i++)
490 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
491 break;
493 do_gettimeofday(&stop_tv);
495 local_irq_enable();
497 total_secs = stop_tv.tv_sec - start_tv.tv_sec;
498 if (total_secs > 10)
499 return -1;
500 total_usecs = stop_tv.tv_usec - start_tv.tv_usec;
501 total_usecs += total_secs * 1000000;
502 if (total_usecs < 0)
503 total_usecs = -total_usecs;
504 hz = 1000000/total_usecs;
506 hTotal = ((INREG(CRTC_H_TOTAL_DISP) & 0x1ff) + 1) * 8;
507 vTotal = ((INREG(CRTC_V_TOTAL_DISP) & 0x3ff) + 1);
508 vclk = (long long)hTotal * (long long)vTotal * hz;
510 switch((INPLL(PPLL_REF_DIV) & 0x30000) >> 16) {
511 case 0:
512 default:
513 num = 1;
514 denom = 1;
515 break;
516 case 1:
517 n = ((INPLL(X_MPLL_REF_FB_DIV) >> 16) & 0xff);
518 m = (INPLL(X_MPLL_REF_FB_DIV) & 0xff);
519 num = 2*n;
520 denom = 2*m;
521 break;
522 case 2:
523 n = ((INPLL(X_MPLL_REF_FB_DIV) >> 8) & 0xff);
524 m = (INPLL(X_MPLL_REF_FB_DIV) & 0xff);
525 num = 2*n;
526 denom = 2*m;
527 break;
530 OUTREG8(CLOCK_CNTL_INDEX, 1);
531 ppll_div_sel = INREG8(CLOCK_CNTL_DATA + 1) & 0x3;
533 n = (INPLL(PPLL_DIV_0 + ppll_div_sel) & 0x7ff);
534 m = (INPLL(PPLL_REF_DIV) & 0x3ff);
536 num *= n;
537 denom *= m;
539 switch ((INPLL(PPLL_DIV_0 + ppll_div_sel) >> 16) & 0x7) {
540 case 1:
541 denom *= 2;
542 break;
543 case 2:
544 denom *= 4;
545 break;
546 case 3:
547 denom *= 8;
548 break;
549 case 4:
550 denom *= 3;
551 break;
552 case 6:
553 denom *= 6;
554 break;
555 case 7:
556 denom *= 12;
557 break;
560 vclk *= denom;
561 do_div(vclk, 1000 * num);
562 xtal = vclk;
564 if ((xtal > 26900) && (xtal < 27100))
565 xtal = 2700;
566 else if ((xtal > 14200) && (xtal < 14400))
567 xtal = 1432;
568 else if ((xtal > 29400) && (xtal < 29600))
569 xtal = 2950;
570 else {
571 printk(KERN_WARNING "xtal calculation failed: %ld\n", xtal);
572 return -1;
575 tmp = INPLL(X_MPLL_REF_FB_DIV);
576 ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
578 Ns = (tmp & 0xff0000) >> 16;
579 Nm = (tmp & 0xff00) >> 8;
580 M = (tmp & 0xff);
581 sclk = round_div((2 * Ns * xtal), (2 * M));
582 mclk = round_div((2 * Nm * xtal), (2 * M));
584 /* we're done, hopefully these are sane values */
585 rinfo->pll.ref_clk = xtal;
586 rinfo->pll.ref_div = ref_div;
587 rinfo->pll.sclk = sclk;
588 rinfo->pll.mclk = mclk;
590 return 0;
594 * Retreive PLL infos by different means (BIOS, Open Firmware, register probing...)
596 static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
598 #ifdef CONFIG_PPC_OF
600 * Retreive PLL infos from Open Firmware first
602 if (!force_measure_pll && radeon_read_xtal_OF(rinfo) == 0) {
603 printk(KERN_INFO "radeonfb: Retreived PLL infos from Open Firmware\n");
604 rinfo->pll.ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
605 /* FIXME: Max clock may be higher on newer chips */
606 rinfo->pll.ppll_min = 12000;
607 rinfo->pll.ppll_max = 35000;
608 goto found;
610 #endif /* CONFIG_PPC_OF */
613 * Check out if we have an X86 which gave us some PLL informations
614 * and if yes, retreive them
616 if (!force_measure_pll && rinfo->bios_seg) {
617 u16 pll_info_block = BIOS_IN16(rinfo->fp_bios_start + 0x30);
619 rinfo->pll.sclk = BIOS_IN16(pll_info_block + 0x08);
620 rinfo->pll.mclk = BIOS_IN16(pll_info_block + 0x0a);
621 rinfo->pll.ref_clk = BIOS_IN16(pll_info_block + 0x0e);
622 rinfo->pll.ref_div = BIOS_IN16(pll_info_block + 0x10);
623 rinfo->pll.ppll_min = BIOS_IN32(pll_info_block + 0x12);
624 rinfo->pll.ppll_max = BIOS_IN32(pll_info_block + 0x16);
626 printk(KERN_INFO "radeonfb: Retreived PLL infos from BIOS\n");
627 goto found;
631 * We didn't get PLL parameters from either OF or BIOS, we try to
632 * probe them
634 if (radeon_probe_pll_params(rinfo) == 0) {
635 printk(KERN_INFO "radeonfb: Retreived PLL infos from registers\n");
636 /* FIXME: Max clock may be higher on newer chips */
637 rinfo->pll.ppll_min = 12000;
638 rinfo->pll.ppll_max = 35000;
639 goto found;
643 * Neither of the above worked, we have a few default values, though
644 * that's mostly incomplete
646 switch (rinfo->chipset) {
647 case PCI_DEVICE_ID_ATI_RADEON_QW:
648 case PCI_DEVICE_ID_ATI_RADEON_QX:
649 rinfo->pll.ppll_max = 35000;
650 rinfo->pll.ppll_min = 12000;
651 rinfo->pll.mclk = 23000;
652 rinfo->pll.sclk = 23000;
653 rinfo->pll.ref_clk = 2700;
654 break;
655 case PCI_DEVICE_ID_ATI_RADEON_QL:
656 case PCI_DEVICE_ID_ATI_RADEON_QN:
657 case PCI_DEVICE_ID_ATI_RADEON_QO:
658 case PCI_DEVICE_ID_ATI_RADEON_Ql:
659 case PCI_DEVICE_ID_ATI_RADEON_BB:
660 rinfo->pll.ppll_max = 35000;
661 rinfo->pll.ppll_min = 12000;
662 rinfo->pll.mclk = 27500;
663 rinfo->pll.sclk = 27500;
664 rinfo->pll.ref_clk = 2700;
665 break;
666 case PCI_DEVICE_ID_ATI_RADEON_Id:
667 case PCI_DEVICE_ID_ATI_RADEON_Ie:
668 case PCI_DEVICE_ID_ATI_RADEON_If:
669 case PCI_DEVICE_ID_ATI_RADEON_Ig:
670 rinfo->pll.ppll_max = 35000;
671 rinfo->pll.ppll_min = 12000;
672 rinfo->pll.mclk = 25000;
673 rinfo->pll.sclk = 25000;
674 rinfo->pll.ref_clk = 2700;
675 break;
676 case PCI_DEVICE_ID_ATI_RADEON_ND:
677 case PCI_DEVICE_ID_ATI_RADEON_NE:
678 case PCI_DEVICE_ID_ATI_RADEON_NF:
679 case PCI_DEVICE_ID_ATI_RADEON_NG:
680 rinfo->pll.ppll_max = 40000;
681 rinfo->pll.ppll_min = 20000;
682 rinfo->pll.mclk = 27000;
683 rinfo->pll.sclk = 27000;
684 rinfo->pll.ref_clk = 2700;
685 break;
686 case PCI_DEVICE_ID_ATI_RADEON_QD:
687 case PCI_DEVICE_ID_ATI_RADEON_QE:
688 case PCI_DEVICE_ID_ATI_RADEON_QF:
689 case PCI_DEVICE_ID_ATI_RADEON_QG:
690 default:
691 rinfo->pll.ppll_max = 35000;
692 rinfo->pll.ppll_min = 12000;
693 rinfo->pll.mclk = 16600;
694 rinfo->pll.sclk = 16600;
695 rinfo->pll.ref_clk = 2700;
696 break;
698 rinfo->pll.ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
700 printk(KERN_INFO "radeonfb: Used default PLL infos\n");
702 found:
704 * Some methods fail to retreive SCLK and MCLK values, we apply default
705 * settings in this case (200Mhz). If that really happne often, we could
706 * fetch from registers instead...
708 if (rinfo->pll.mclk == 0)
709 rinfo->pll.mclk = 20000;
710 if (rinfo->pll.sclk == 0)
711 rinfo->pll.sclk = 20000;
713 printk("radeonfb: Reference=%d.%02d MHz (RefDiv=%d) Memory=%d.%02d Mhz, System=%d.%02d MHz\n",
714 rinfo->pll.ref_clk / 100, rinfo->pll.ref_clk % 100,
715 rinfo->pll.ref_div,
716 rinfo->pll.mclk / 100, rinfo->pll.mclk % 100,
717 rinfo->pll.sclk / 100, rinfo->pll.sclk % 100);
720 static int radeonfb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
722 struct radeonfb_info *rinfo = info->par;
723 struct fb_var_screeninfo v;
724 int nom, den;
725 unsigned int pitch;
727 if (radeon_match_mode(rinfo, &v, var))
728 return -EINVAL;
730 switch (v.bits_per_pixel) {
731 case 0 ... 8:
732 v.bits_per_pixel = 8;
733 break;
734 case 9 ... 16:
735 v.bits_per_pixel = 16;
736 break;
737 case 17 ... 24:
738 #if 0 /* Doesn't seem to work */
739 v.bits_per_pixel = 24;
740 break;
741 #endif
742 return -EINVAL;
743 case 25 ... 32:
744 v.bits_per_pixel = 32;
745 break;
746 default:
747 return -EINVAL;
750 switch (var_to_depth(&v)) {
751 case 8:
752 nom = den = 1;
753 v.red.offset = v.green.offset = v.blue.offset = 0;
754 v.red.length = v.green.length = v.blue.length = 8;
755 v.transp.offset = v.transp.length = 0;
756 break;
757 case 15:
758 nom = 2;
759 den = 1;
760 v.red.offset = 10;
761 v.green.offset = 5;
762 v.blue.offset = 0;
763 v.red.length = v.green.length = v.blue.length = 5;
764 v.transp.offset = v.transp.length = 0;
765 break;
766 case 16:
767 nom = 2;
768 den = 1;
769 v.red.offset = 11;
770 v.green.offset = 5;
771 v.blue.offset = 0;
772 v.red.length = 5;
773 v.green.length = 6;
774 v.blue.length = 5;
775 v.transp.offset = v.transp.length = 0;
776 break;
777 case 24:
778 nom = 4;
779 den = 1;
780 v.red.offset = 16;
781 v.green.offset = 8;
782 v.blue.offset = 0;
783 v.red.length = v.blue.length = v.green.length = 8;
784 v.transp.offset = v.transp.length = 0;
785 break;
786 case 32:
787 nom = 4;
788 den = 1;
789 v.red.offset = 16;
790 v.green.offset = 8;
791 v.blue.offset = 0;
792 v.red.length = v.blue.length = v.green.length = 8;
793 v.transp.offset = 24;
794 v.transp.length = 8;
795 break;
796 default:
797 printk ("radeonfb: mode %dx%dx%d rejected, color depth invalid\n",
798 var->xres, var->yres, var->bits_per_pixel);
799 return -EINVAL;
802 if (v.yres_virtual < v.yres)
803 v.yres_virtual = v.yres;
804 if (v.xres_virtual < v.xres)
805 v.xres_virtual = v.xres;
808 /* XXX I'm adjusting xres_virtual to the pitch, that may help XFree
809 * with some panels, though I don't quite like this solution
811 if (rinfo->info->flags & FBINFO_HWACCEL_DISABLED) {
812 v.xres_virtual = v.xres_virtual & ~7ul;
813 } else {
814 pitch = ((v.xres_virtual * ((v.bits_per_pixel + 1) / 8) + 0x3f)
815 & ~(0x3f)) >> 6;
816 v.xres_virtual = (pitch << 6) / ((v.bits_per_pixel + 1) / 8);
819 if (((v.xres_virtual * v.yres_virtual * nom) / den) > rinfo->mapped_vram)
820 return -EINVAL;
822 if (v.xres_virtual < v.xres)
823 v.xres = v.xres_virtual;
825 if (v.xoffset < 0)
826 v.xoffset = 0;
827 if (v.yoffset < 0)
828 v.yoffset = 0;
830 if (v.xoffset > v.xres_virtual - v.xres)
831 v.xoffset = v.xres_virtual - v.xres - 1;
833 if (v.yoffset > v.yres_virtual - v.yres)
834 v.yoffset = v.yres_virtual - v.yres - 1;
836 v.red.msb_right = v.green.msb_right = v.blue.msb_right =
837 v.transp.offset = v.transp.length =
838 v.transp.msb_right = 0;
840 memcpy(var, &v, sizeof(v));
842 return 0;
846 static int radeonfb_pan_display (struct fb_var_screeninfo *var,
847 struct fb_info *info)
849 struct radeonfb_info *rinfo = info->par;
851 if ((var->xoffset + var->xres > var->xres_virtual)
852 || (var->yoffset + var->yres > var->yres_virtual))
853 return -EINVAL;
855 if (rinfo->asleep)
856 return 0;
858 radeon_fifo_wait(2);
859 OUTREG(CRTC_OFFSET, ((var->yoffset * var->xres_virtual + var->xoffset)
860 * var->bits_per_pixel / 8) & ~7);
861 return 0;
865 static int radeonfb_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
866 unsigned long arg, struct fb_info *info)
868 struct radeonfb_info *rinfo = info->par;
869 unsigned int tmp;
870 u32 value = 0;
871 int rc;
873 switch (cmd) {
875 * TODO: set mirror accordingly for non-Mobility chipsets with 2 CRTC's
876 * and do something better using 2nd CRTC instead of just hackish
877 * routing to second output
879 case FBIO_RADEON_SET_MIRROR:
880 if (!rinfo->is_mobility)
881 return -EINVAL;
883 rc = get_user(value, (__u32 __user *)arg);
885 if (rc)
886 return rc;
888 radeon_fifo_wait(2);
889 if (value & 0x01) {
890 tmp = INREG(LVDS_GEN_CNTL);
892 tmp |= (LVDS_ON | LVDS_BLON);
893 } else {
894 tmp = INREG(LVDS_GEN_CNTL);
896 tmp &= ~(LVDS_ON | LVDS_BLON);
899 OUTREG(LVDS_GEN_CNTL, tmp);
901 if (value & 0x02) {
902 tmp = INREG(CRTC_EXT_CNTL);
903 tmp |= CRTC_CRT_ON;
905 mirror = 1;
906 } else {
907 tmp = INREG(CRTC_EXT_CNTL);
908 tmp &= ~CRTC_CRT_ON;
910 mirror = 0;
913 OUTREG(CRTC_EXT_CNTL, tmp);
915 break;
916 case FBIO_RADEON_GET_MIRROR:
917 if (!rinfo->is_mobility)
918 return -EINVAL;
920 tmp = INREG(LVDS_GEN_CNTL);
921 if ((LVDS_ON | LVDS_BLON) & tmp)
922 value |= 0x01;
924 tmp = INREG(CRTC_EXT_CNTL);
925 if (CRTC_CRT_ON & tmp)
926 value |= 0x02;
928 return put_user(value, (__u32 __user *)arg);
929 default:
930 return -EINVAL;
933 return -EINVAL;
937 static int radeon_screen_blank (struct radeonfb_info *rinfo, int blank)
939 u32 val = INREG(CRTC_EXT_CNTL);
940 u32 val2 = 0;
942 if (rinfo->mon1_type == MT_LCD)
943 val2 = INREG(LVDS_GEN_CNTL) & ~LVDS_DISPLAY_DIS;
945 /* reset it */
946 val &= ~(CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS |
947 CRTC_VSYNC_DIS);
949 switch (blank) {
950 case VESA_NO_BLANKING:
951 break;
952 case VESA_VSYNC_SUSPEND:
953 val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS);
954 break;
955 case VESA_HSYNC_SUSPEND:
956 val |= (CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS);
957 break;
958 case VESA_POWERDOWN:
959 val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS |
960 CRTC_HSYNC_DIS);
961 val2 |= (LVDS_DISPLAY_DIS);
962 break;
965 radeon_fifo_wait(1);
966 switch (rinfo->mon1_type) {
967 case MT_LCD:
968 OUTREG(LVDS_GEN_CNTL, val2);
969 break;
970 case MT_CRT:
971 default:
972 OUTREG(CRTC_EXT_CNTL, val);
973 break;
976 return 0;
979 int radeonfb_blank (int blank, struct fb_info *info)
981 struct radeonfb_info *rinfo = info->par;
983 if (rinfo->asleep)
984 return 0;
986 #ifdef CONFIG_PMAC_BACKLIGHT
987 if (rinfo->mon1_type == MT_LCD && _machine == _MACH_Pmac && blank)
988 set_backlight_enable(0);
989 #endif
991 radeon_screen_blank(rinfo, blank);
993 #ifdef CONFIG_PMAC_BACKLIGHT
994 if (rinfo->mon1_type == MT_LCD && _machine == _MACH_Pmac && !blank)
995 set_backlight_enable(1);
996 #endif
998 return 0;
1001 static int radeonfb_setcolreg (unsigned regno, unsigned red, unsigned green,
1002 unsigned blue, unsigned transp, struct fb_info *info)
1004 struct radeonfb_info *rinfo = info->par;
1005 u32 pindex;
1006 unsigned int i;
1008 if (regno > 255)
1009 return 1;
1011 red >>= 8;
1012 green >>= 8;
1013 blue >>= 8;
1014 rinfo->palette[regno].red = red;
1015 rinfo->palette[regno].green = green;
1016 rinfo->palette[regno].blue = blue;
1018 /* default */
1019 pindex = regno;
1021 if (!rinfo->asleep) {
1022 u32 dac_cntl2, vclk_cntl = 0;
1024 radeon_fifo_wait(9);
1025 if (rinfo->is_mobility) {
1026 vclk_cntl = INPLL(VCLK_ECP_CNTL);
1027 OUTPLL(VCLK_ECP_CNTL, vclk_cntl & ~PIXCLK_DAC_ALWAYS_ONb);
1030 /* Make sure we are on first palette */
1031 if (rinfo->has_CRTC2) {
1032 dac_cntl2 = INREG(DAC_CNTL2);
1033 dac_cntl2 &= ~DAC2_PALETTE_ACCESS_CNTL;
1034 OUTREG(DAC_CNTL2, dac_cntl2);
1037 if (rinfo->bpp == 16) {
1038 pindex = regno * 8;
1040 if (rinfo->depth == 16 && regno > 63)
1041 return 1;
1042 if (rinfo->depth == 15 && regno > 31)
1043 return 1;
1045 /* For 565, the green component is mixed one order below */
1046 if (rinfo->depth == 16) {
1047 OUTREG(PALETTE_INDEX, pindex>>1);
1048 OUTREG(PALETTE_DATA, (rinfo->palette[regno>>1].red << 16) |
1049 (green << 8) | (rinfo->palette[regno>>1].blue));
1050 green = rinfo->palette[regno<<1].green;
1054 if (rinfo->depth != 16 || regno < 32) {
1055 OUTREG(PALETTE_INDEX, pindex);
1056 OUTREG(PALETTE_DATA, (red << 16) | (green << 8) | blue);
1058 if (rinfo->is_mobility)
1059 OUTPLL(VCLK_ECP_CNTL, vclk_cntl);
1061 if (regno < 16) {
1062 u32 *pal = info->pseudo_palette;
1063 switch (rinfo->depth) {
1064 case 15:
1065 pal[regno] = (regno << 10) | (regno << 5) | regno;
1066 break;
1067 case 16:
1068 pal[regno] = (regno << 11) | (regno << 5) | regno;
1069 break;
1070 case 24:
1071 pal[regno] = (regno << 16) | (regno << 8) | regno;
1072 break;
1073 case 32:
1074 i = (regno << 8) | regno;
1075 pal[regno] = (i << 16) | i;
1076 break;
1079 return 0;
1083 static void radeon_save_state (struct radeonfb_info *rinfo, struct radeon_regs *save)
1085 /* CRTC regs */
1086 save->crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
1087 save->crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
1088 save->crtc_more_cntl = INREG(CRTC_MORE_CNTL);
1089 save->dac_cntl = INREG(DAC_CNTL);
1090 save->crtc_h_total_disp = INREG(CRTC_H_TOTAL_DISP);
1091 save->crtc_h_sync_strt_wid = INREG(CRTC_H_SYNC_STRT_WID);
1092 save->crtc_v_total_disp = INREG(CRTC_V_TOTAL_DISP);
1093 save->crtc_v_sync_strt_wid = INREG(CRTC_V_SYNC_STRT_WID);
1094 save->crtc_pitch = INREG(CRTC_PITCH);
1095 save->surface_cntl = INREG(SURFACE_CNTL);
1097 /* FP regs */
1098 save->fp_crtc_h_total_disp = INREG(FP_CRTC_H_TOTAL_DISP);
1099 save->fp_crtc_v_total_disp = INREG(FP_CRTC_V_TOTAL_DISP);
1100 save->fp_gen_cntl = INREG(FP_GEN_CNTL);
1101 save->fp_h_sync_strt_wid = INREG(FP_H_SYNC_STRT_WID);
1102 save->fp_horz_stretch = INREG(FP_HORZ_STRETCH);
1103 save->fp_v_sync_strt_wid = INREG(FP_V_SYNC_STRT_WID);
1104 save->fp_vert_stretch = INREG(FP_VERT_STRETCH);
1105 save->lvds_gen_cntl = INREG(LVDS_GEN_CNTL);
1106 save->lvds_pll_cntl = INREG(LVDS_PLL_CNTL);
1107 save->tmds_crc = INREG(TMDS_CRC); save->tmds_transmitter_cntl = INREG(TMDS_TRANSMITTER_CNTL);
1108 save->vclk_ecp_cntl = INPLL(VCLK_ECP_CNTL);
1112 static void radeon_write_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *mode)
1114 int i;
1116 radeon_fifo_wait(20);
1118 /* Workaround from XFree */
1119 if (rinfo->is_mobility) {
1120 /* A temporal workaround for the occational blanking on certain laptop panels.
1121 This appears to related to the PLL divider registers (fail to lock?).
1122 It occurs even when all dividers are the same with their old settings.
1123 In this case we really don't need to fiddle with PLL registers.
1124 By doing this we can avoid the blanking problem with some panels.
1126 if ((mode->ppll_ref_div == (INPLL(PPLL_REF_DIV) & PPLL_REF_DIV_MASK)) &&
1127 (mode->ppll_div_3 == (INPLL(PPLL_DIV_3) &
1128 (PPLL_POST3_DIV_MASK | PPLL_FB3_DIV_MASK)))) {
1129 /* We still have to force a switch to PPLL div 3 thanks to
1130 * an XFree86 driver bug which will switch it away in some cases
1131 * even when using UseFDev */
1132 OUTREGP(CLOCK_CNTL_INDEX, PPLL_DIV_SEL_MASK, ~PPLL_DIV_SEL_MASK);
1133 return;
1137 /* Swich VCKL clock input to CPUCLK so it stays fed while PPLL updates*/
1138 OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_CPUCLK, ~VCLK_SRC_SEL_MASK);
1140 /* Reset PPLL & enable atomic update */
1141 OUTPLLP(PPLL_CNTL,
1142 PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN,
1143 ~(PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
1145 /* Switch to PPLL div 3 */
1146 OUTREGP(CLOCK_CNTL_INDEX, PPLL_DIV_SEL_MASK, ~PPLL_DIV_SEL_MASK);
1148 /* Set PPLL ref. div */
1149 if (rinfo->family == CHIP_FAMILY_R300 ||
1150 rinfo->family == CHIP_FAMILY_RS300 ||
1151 rinfo->family == CHIP_FAMILY_R350 ||
1152 rinfo->family == CHIP_FAMILY_RV350) {
1153 if (mode->ppll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
1154 /* When restoring console mode, use saved PPLL_REF_DIV
1155 * setting.
1157 OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, 0);
1158 } else {
1159 /* R300 uses ref_div_acc field as real ref divider */
1160 OUTPLLP(PPLL_REF_DIV,
1161 (mode->ppll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
1162 ~R300_PPLL_REF_DIV_ACC_MASK);
1164 } else
1165 OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, ~PPLL_REF_DIV_MASK);
1167 /* Set PPLL divider 3 & post divider*/
1168 OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_FB3_DIV_MASK);
1169 OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_POST3_DIV_MASK);
1171 /* Write update */
1172 while (INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R)
1174 OUTPLLP(PPLL_REF_DIV, PPLL_ATOMIC_UPDATE_W, ~PPLL_ATOMIC_UPDATE_W);
1176 /* Wait read update complete */
1177 /* FIXME: Certain revisions of R300 can't recover here. Not sure of
1178 the cause yet, but this workaround will mask the problem for now.
1179 Other chips usually will pass at the very first test, so the
1180 workaround shouldn't have any effect on them. */
1181 for (i = 0; (i < 10000 && INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R); i++)
1184 OUTPLL(HTOTAL_CNTL, 0);
1186 /* Clear reset & atomic update */
1187 OUTPLLP(PPLL_CNTL, 0,
1188 ~(PPLL_RESET | PPLL_SLEEP | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
1190 /* We may want some locking ... oh well */
1191 msleep(5);
1193 /* Switch back VCLK source to PPLL */
1194 OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_PPLLCLK, ~VCLK_SRC_SEL_MASK);
1198 * Timer function for delayed LVDS panel power up/down
1200 static void radeon_lvds_timer_func(unsigned long data)
1202 struct radeonfb_info *rinfo = (struct radeonfb_info *)data;
1204 radeon_fifo_wait(3);
1206 OUTREG(LVDS_GEN_CNTL, rinfo->pending_lvds_gen_cntl);
1207 if (rinfo->pending_pixclks_cntl) {
1208 OUTPLL(PIXCLKS_CNTL, rinfo->pending_pixclks_cntl);
1209 rinfo->pending_pixclks_cntl = 0;
1214 * Apply a video mode. This will apply the whole register set, including
1215 * the PLL registers, to the card
1217 static void radeon_write_mode (struct radeonfb_info *rinfo,
1218 struct radeon_regs *mode)
1220 int i;
1221 int primary_mon = PRIMARY_MONITOR(rinfo);
1223 if (nomodeset)
1224 return;
1226 del_timer_sync(&rinfo->lvds_timer);
1228 radeon_screen_blank(rinfo, VESA_POWERDOWN);
1230 radeon_fifo_wait(31);
1231 for (i=0; i<10; i++)
1232 OUTREG(common_regs[i].reg, common_regs[i].val);
1234 /* Apply surface registers */
1235 for (i=0; i<8; i++) {
1236 OUTREG(SURFACE0_LOWER_BOUND + 0x10*i, mode->surf_lower_bound[i]);
1237 OUTREG(SURFACE0_UPPER_BOUND + 0x10*i, mode->surf_upper_bound[i]);
1238 OUTREG(SURFACE0_INFO + 0x10*i, mode->surf_info[i]);
1241 OUTREG(CRTC_GEN_CNTL, mode->crtc_gen_cntl);
1242 OUTREGP(CRTC_EXT_CNTL, mode->crtc_ext_cntl,
1243 ~(CRTC_HSYNC_DIS | CRTC_VSYNC_DIS | CRTC_DISPLAY_DIS));
1244 OUTREG(CRTC_MORE_CNTL, mode->crtc_more_cntl);
1245 OUTREGP(DAC_CNTL, mode->dac_cntl, DAC_RANGE_CNTL | DAC_BLANKING);
1246 OUTREG(CRTC_H_TOTAL_DISP, mode->crtc_h_total_disp);
1247 OUTREG(CRTC_H_SYNC_STRT_WID, mode->crtc_h_sync_strt_wid);
1248 OUTREG(CRTC_V_TOTAL_DISP, mode->crtc_v_total_disp);
1249 OUTREG(CRTC_V_SYNC_STRT_WID, mode->crtc_v_sync_strt_wid);
1250 OUTREG(CRTC_OFFSET, 0);
1251 OUTREG(CRTC_OFFSET_CNTL, 0);
1252 OUTREG(CRTC_PITCH, mode->crtc_pitch);
1253 OUTREG(SURFACE_CNTL, mode->surface_cntl);
1255 radeon_write_pll_regs(rinfo, mode);
1257 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1258 radeon_fifo_wait(10);
1259 OUTREG(FP_CRTC_H_TOTAL_DISP, mode->fp_crtc_h_total_disp);
1260 OUTREG(FP_CRTC_V_TOTAL_DISP, mode->fp_crtc_v_total_disp);
1261 OUTREG(FP_H_SYNC_STRT_WID, mode->fp_h_sync_strt_wid);
1262 OUTREG(FP_V_SYNC_STRT_WID, mode->fp_v_sync_strt_wid);
1263 OUTREG(FP_HORZ_STRETCH, mode->fp_horz_stretch);
1264 OUTREG(FP_VERT_STRETCH, mode->fp_vert_stretch);
1265 OUTREG(FP_GEN_CNTL, mode->fp_gen_cntl);
1266 OUTREG(TMDS_CRC, mode->tmds_crc);
1267 OUTREG(TMDS_TRANSMITTER_CNTL, mode->tmds_transmitter_cntl);
1269 if (primary_mon == MT_LCD) {
1270 unsigned int tmp = INREG(LVDS_GEN_CNTL);
1272 /* HACK: The backlight control code may have modified init_state.lvds_gen_cntl,
1273 * so we update ourselves
1275 mode->lvds_gen_cntl &= ~LVDS_STATE_MASK;
1276 mode->lvds_gen_cntl |= (rinfo->init_state.lvds_gen_cntl & LVDS_STATE_MASK);
1278 if ((tmp & (LVDS_ON | LVDS_BLON)) ==
1279 (mode->lvds_gen_cntl & (LVDS_ON | LVDS_BLON))) {
1280 OUTREG(LVDS_GEN_CNTL, mode->lvds_gen_cntl);
1281 } else {
1282 rinfo->pending_pixclks_cntl = INPLL(PIXCLKS_CNTL);
1283 if (rinfo->is_mobility || rinfo->is_IGP)
1284 OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb);
1285 if (!(tmp & (LVDS_ON | LVDS_BLON)))
1286 OUTREG(LVDS_GEN_CNTL, mode->lvds_gen_cntl | LVDS_BLON);
1287 rinfo->pending_lvds_gen_cntl = mode->lvds_gen_cntl;
1288 mod_timer(&rinfo->lvds_timer,
1289 jiffies + MS_TO_HZ(rinfo->panel_info.pwr_delay));
1294 RTRACE("lvds_gen_cntl: %08x\n", INREG(LVDS_GEN_CNTL));
1296 radeon_screen_blank(rinfo, VESA_NO_BLANKING);
1298 radeon_fifo_wait(2);
1299 OUTPLL(VCLK_ECP_CNTL, mode->vclk_ecp_cntl);
1301 return;
1305 * Calculate the PLL values for a given mode
1307 static void radeon_calc_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *regs,
1308 unsigned long freq)
1310 const struct {
1311 int divider;
1312 int bitvalue;
1313 } *post_div,
1314 post_divs[] = {
1315 { 1, 0 },
1316 { 2, 1 },
1317 { 4, 2 },
1318 { 8, 3 },
1319 { 3, 4 },
1320 { 16, 5 },
1321 { 6, 6 },
1322 { 12, 7 },
1323 { 0, 0 },
1325 int fb_div, pll_output_freq = 0;
1326 int uses_dvo = 0;
1328 /* Check if the DVO port is enabled and sourced from the primary CRTC. I'm
1329 * not sure which model starts having FP2_GEN_CNTL, I assume anything more
1330 * recent than an r(v)100...
1332 #if 0
1333 /* XXX I had reports of flicker happening with the cinema display
1334 * on TMDS1 that seem to be fixed if I also forbit odd dividers in
1335 * this case. This could just be a bandwidth calculation issue, I
1336 * haven't implemented the bandwidth code yet, but in the meantime,
1337 * forcing uses_dvo to 1 fixes it and shouln't have bad side effects,
1338 * I haven't seen a case were were absolutely needed an odd PLL
1339 * divider. I'll find a better fix once I have more infos on the
1340 * real cause of the problem.
1342 while (rinfo->has_CRTC2) {
1343 u32 fp2_gen_cntl = INREG(FP2_GEN_CNTL);
1344 u32 disp_output_cntl;
1345 int source;
1347 /* FP2 path not enabled */
1348 if ((fp2_gen_cntl & FP2_ON) == 0)
1349 break;
1350 /* Not all chip revs have the same format for this register,
1351 * extract the source selection
1353 if (rinfo->family == CHIP_FAMILY_R200 ||
1354 rinfo->family == CHIP_FAMILY_R300 ||
1355 rinfo->family == CHIP_FAMILY_R350 ||
1356 rinfo->family == CHIP_FAMILY_RV350) {
1357 source = (fp2_gen_cntl >> 10) & 0x3;
1358 /* sourced from transform unit, check for transform unit
1359 * own source
1361 if (source == 3) {
1362 disp_output_cntl = INREG(DISP_OUTPUT_CNTL);
1363 source = (disp_output_cntl >> 12) & 0x3;
1365 } else
1366 source = (fp2_gen_cntl >> 13) & 0x1;
1367 /* sourced from CRTC2 -> exit */
1368 if (source == 1)
1369 break;
1371 /* so we end up on CRTC1, let's set uses_dvo to 1 now */
1372 uses_dvo = 1;
1373 break;
1375 #else
1376 uses_dvo = 1;
1377 #endif
1378 if (freq > rinfo->pll.ppll_max)
1379 freq = rinfo->pll.ppll_max;
1380 if (freq*12 < rinfo->pll.ppll_min)
1381 freq = rinfo->pll.ppll_min / 12;
1383 for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
1384 pll_output_freq = post_div->divider * freq;
1385 /* If we output to the DVO port (external TMDS), we don't allow an
1386 * odd PLL divider as those aren't supported on this path
1388 if (uses_dvo && (post_div->divider & 1))
1389 continue;
1390 if (pll_output_freq >= rinfo->pll.ppll_min &&
1391 pll_output_freq <= rinfo->pll.ppll_max)
1392 break;
1395 fb_div = round_div(rinfo->pll.ref_div*pll_output_freq,
1396 rinfo->pll.ref_clk);
1397 regs->ppll_ref_div = rinfo->pll.ref_div;
1398 regs->ppll_div_3 = fb_div | (post_div->bitvalue << 16);
1400 RTRACE("post div = 0x%x\n", post_div->bitvalue);
1401 RTRACE("fb_div = 0x%x\n", fb_div);
1402 RTRACE("ppll_div_3 = 0x%x\n", regs->ppll_div_3);
1405 int radeonfb_set_par(struct fb_info *info)
1407 struct radeonfb_info *rinfo = info->par;
1408 struct fb_var_screeninfo *mode = &info->var;
1409 struct radeon_regs newmode;
1410 int hTotal, vTotal, hSyncStart, hSyncEnd,
1411 hSyncPol, vSyncStart, vSyncEnd, vSyncPol, cSync;
1412 u8 hsync_adj_tab[] = {0, 0x12, 9, 9, 6, 5};
1413 u8 hsync_fudge_fp[] = {2, 2, 0, 0, 5, 5};
1414 u32 sync, h_sync_pol, v_sync_pol, dotClock, pixClock;
1415 int i, freq;
1416 int format = 0;
1417 int nopllcalc = 0;
1418 int hsync_start, hsync_fudge, bytpp, hsync_wid, vsync_wid;
1419 int primary_mon = PRIMARY_MONITOR(rinfo);
1420 int depth = var_to_depth(mode);
1422 /* We always want engine to be idle on a mode switch, even
1423 * if we won't actually change the mode
1425 radeon_engine_idle();
1427 hSyncStart = mode->xres + mode->right_margin;
1428 hSyncEnd = hSyncStart + mode->hsync_len;
1429 hTotal = hSyncEnd + mode->left_margin;
1431 vSyncStart = mode->yres + mode->lower_margin;
1432 vSyncEnd = vSyncStart + mode->vsync_len;
1433 vTotal = vSyncEnd + mode->upper_margin;
1434 pixClock = mode->pixclock;
1436 sync = mode->sync;
1437 h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
1438 v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
1440 if (primary_mon == MT_DFP || primary_mon == MT_LCD) {
1441 if (rinfo->panel_info.xres < mode->xres)
1442 mode->xres = rinfo->panel_info.xres;
1443 if (rinfo->panel_info.yres < mode->yres)
1444 mode->yres = rinfo->panel_info.yres;
1446 hTotal = mode->xres + rinfo->panel_info.hblank;
1447 hSyncStart = mode->xres + rinfo->panel_info.hOver_plus;
1448 hSyncEnd = hSyncStart + rinfo->panel_info.hSync_width;
1450 vTotal = mode->yres + rinfo->panel_info.vblank;
1451 vSyncStart = mode->yres + rinfo->panel_info.vOver_plus;
1452 vSyncEnd = vSyncStart + rinfo->panel_info.vSync_width;
1454 h_sync_pol = !rinfo->panel_info.hAct_high;
1455 v_sync_pol = !rinfo->panel_info.vAct_high;
1457 pixClock = 100000000 / rinfo->panel_info.clock;
1459 if (rinfo->panel_info.use_bios_dividers) {
1460 nopllcalc = 1;
1461 newmode.ppll_div_3 = rinfo->panel_info.fbk_divider |
1462 (rinfo->panel_info.post_divider << 16);
1463 newmode.ppll_ref_div = rinfo->panel_info.ref_divider;
1466 dotClock = 1000000000 / pixClock;
1467 freq = dotClock / 10; /* x100 */
1469 RTRACE("hStart = %d, hEnd = %d, hTotal = %d\n",
1470 hSyncStart, hSyncEnd, hTotal);
1471 RTRACE("vStart = %d, vEnd = %d, vTotal = %d\n",
1472 vSyncStart, vSyncEnd, vTotal);
1474 hsync_wid = (hSyncEnd - hSyncStart) / 8;
1475 vsync_wid = vSyncEnd - vSyncStart;
1476 if (hsync_wid == 0)
1477 hsync_wid = 1;
1478 else if (hsync_wid > 0x3f) /* max */
1479 hsync_wid = 0x3f;
1481 if (vsync_wid == 0)
1482 vsync_wid = 1;
1483 else if (vsync_wid > 0x1f) /* max */
1484 vsync_wid = 0x1f;
1486 hSyncPol = mode->sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
1487 vSyncPol = mode->sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
1489 cSync = mode->sync & FB_SYNC_COMP_HIGH_ACT ? (1 << 4) : 0;
1491 format = radeon_get_dstbpp(depth);
1492 bytpp = mode->bits_per_pixel >> 3;
1494 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD))
1495 hsync_fudge = hsync_fudge_fp[format-1];
1496 else
1497 hsync_fudge = hsync_adj_tab[format-1];
1499 hsync_start = hSyncStart - 8 + hsync_fudge;
1501 newmode.crtc_gen_cntl = CRTC_EXT_DISP_EN | CRTC_EN |
1502 (format << 8);
1504 /* Clear auto-center etc... */
1505 newmode.crtc_more_cntl = rinfo->init_state.crtc_more_cntl;
1506 newmode.crtc_more_cntl &= 0xfffffff0;
1508 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1509 newmode.crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN;
1510 if (mirror)
1511 newmode.crtc_ext_cntl |= CRTC_CRT_ON;
1513 newmode.crtc_gen_cntl &= ~(CRTC_DBL_SCAN_EN |
1514 CRTC_INTERLACE_EN);
1515 } else {
1516 newmode.crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN |
1517 CRTC_CRT_ON;
1520 newmode.dac_cntl = /* INREG(DAC_CNTL) | */ DAC_MASK_ALL | DAC_VGA_ADR_EN |
1521 DAC_8BIT_EN;
1523 newmode.crtc_h_total_disp = ((((hTotal / 8) - 1) & 0x3ff) |
1524 (((mode->xres / 8) - 1) << 16));
1526 newmode.crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) |
1527 (hsync_wid << 16) | (h_sync_pol << 23));
1529 newmode.crtc_v_total_disp = ((vTotal - 1) & 0xffff) |
1530 ((mode->yres - 1) << 16);
1532 newmode.crtc_v_sync_strt_wid = (((vSyncStart - 1) & 0xfff) |
1533 (vsync_wid << 16) | (v_sync_pol << 23));
1535 if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
1536 /* We first calculate the engine pitch */
1537 rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
1538 & ~(0x3f)) >> 6;
1540 /* Then, re-multiply it to get the CRTC pitch */
1541 newmode.crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
1542 } else
1543 newmode.crtc_pitch = (mode->xres_virtual >> 3);
1545 newmode.crtc_pitch |= (newmode.crtc_pitch << 16);
1548 * It looks like recent chips have a problem with SURFACE_CNTL,
1549 * setting SURF_TRANSLATION_DIS completely disables the
1550 * swapper as well, so we leave it unset now.
1552 newmode.surface_cntl = 0;
1554 #if defined(__BIG_ENDIAN)
1556 /* Setup swapping on both apertures, though we currently
1557 * only use aperture 0, enabling swapper on aperture 1
1558 * won't harm
1560 switch (mode->bits_per_pixel) {
1561 case 16:
1562 newmode.surface_cntl |= NONSURF_AP0_SWP_16BPP;
1563 newmode.surface_cntl |= NONSURF_AP1_SWP_16BPP;
1564 break;
1565 case 24:
1566 case 32:
1567 newmode.surface_cntl |= NONSURF_AP0_SWP_32BPP;
1568 newmode.surface_cntl |= NONSURF_AP1_SWP_32BPP;
1569 break;
1571 #endif
1573 /* Clear surface registers */
1574 for (i=0; i<8; i++) {
1575 newmode.surf_lower_bound[i] = 0;
1576 newmode.surf_upper_bound[i] = 0x1f;
1577 newmode.surf_info[i] = 0;
1580 RTRACE("h_total_disp = 0x%x\t hsync_strt_wid = 0x%x\n",
1581 newmode.crtc_h_total_disp, newmode.crtc_h_sync_strt_wid);
1582 RTRACE("v_total_disp = 0x%x\t vsync_strt_wid = 0x%x\n",
1583 newmode.crtc_v_total_disp, newmode.crtc_v_sync_strt_wid);
1585 rinfo->bpp = mode->bits_per_pixel;
1586 rinfo->depth = depth;
1588 RTRACE("pixclock = %lu\n", (unsigned long)pixClock);
1589 RTRACE("freq = %lu\n", (unsigned long)freq);
1591 if (!nopllcalc)
1592 radeon_calc_pll_regs(rinfo, &newmode, freq);
1594 newmode.vclk_ecp_cntl = rinfo->init_state.vclk_ecp_cntl;
1596 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1597 unsigned int hRatio, vRatio;
1599 if (mode->xres > rinfo->panel_info.xres)
1600 mode->xres = rinfo->panel_info.xres;
1601 if (mode->yres > rinfo->panel_info.yres)
1602 mode->yres = rinfo->panel_info.yres;
1604 newmode.fp_horz_stretch = (((rinfo->panel_info.xres / 8) - 1)
1605 << HORZ_PANEL_SHIFT);
1606 newmode.fp_vert_stretch = ((rinfo->panel_info.yres - 1)
1607 << VERT_PANEL_SHIFT);
1609 if (mode->xres != rinfo->panel_info.xres) {
1610 hRatio = round_div(mode->xres * HORZ_STRETCH_RATIO_MAX,
1611 rinfo->panel_info.xres);
1612 newmode.fp_horz_stretch = (((((unsigned long)hRatio) & HORZ_STRETCH_RATIO_MASK)) |
1613 (newmode.fp_horz_stretch &
1614 (HORZ_PANEL_SIZE | HORZ_FP_LOOP_STRETCH |
1615 HORZ_AUTO_RATIO_INC)));
1616 newmode.fp_horz_stretch |= (HORZ_STRETCH_BLEND |
1617 HORZ_STRETCH_ENABLE);
1619 newmode.fp_horz_stretch &= ~HORZ_AUTO_RATIO;
1621 if (mode->yres != rinfo->panel_info.yres) {
1622 vRatio = round_div(mode->yres * VERT_STRETCH_RATIO_MAX,
1623 rinfo->panel_info.yres);
1624 newmode.fp_vert_stretch = (((((unsigned long)vRatio) & VERT_STRETCH_RATIO_MASK)) |
1625 (newmode.fp_vert_stretch &
1626 (VERT_PANEL_SIZE | VERT_STRETCH_RESERVED)));
1627 newmode.fp_vert_stretch |= (VERT_STRETCH_BLEND |
1628 VERT_STRETCH_ENABLE);
1630 newmode.fp_vert_stretch &= ~VERT_AUTO_RATIO_EN;
1632 newmode.fp_gen_cntl = (rinfo->init_state.fp_gen_cntl & (u32)
1633 ~(FP_SEL_CRTC2 |
1634 FP_RMX_HVSYNC_CONTROL_EN |
1635 FP_DFP_SYNC_SEL |
1636 FP_CRT_SYNC_SEL |
1637 FP_CRTC_LOCK_8DOT |
1638 FP_USE_SHADOW_EN |
1639 FP_CRTC_USE_SHADOW_VEND |
1640 FP_CRT_SYNC_ALT));
1642 newmode.fp_gen_cntl |= (FP_CRTC_DONT_SHADOW_VPAR |
1643 FP_CRTC_DONT_SHADOW_HEND);
1645 newmode.lvds_gen_cntl = rinfo->init_state.lvds_gen_cntl;
1646 newmode.lvds_pll_cntl = rinfo->init_state.lvds_pll_cntl;
1647 newmode.tmds_crc = rinfo->init_state.tmds_crc;
1648 newmode.tmds_transmitter_cntl = rinfo->init_state.tmds_transmitter_cntl;
1650 if (primary_mon == MT_LCD) {
1651 newmode.lvds_gen_cntl |= (LVDS_ON | LVDS_BLON);
1652 newmode.fp_gen_cntl &= ~(FP_FPON | FP_TMDS_EN);
1653 } else {
1654 /* DFP */
1655 newmode.fp_gen_cntl |= (FP_FPON | FP_TMDS_EN);
1656 newmode.tmds_transmitter_cntl = (TMDS_RAN_PAT_RST | TMDS_ICHCSEL) &
1657 ~(TMDS_PLLRST);
1658 /* TMDS_PLL_EN bit is reversed on RV (and mobility) chips */
1659 if ((rinfo->family == CHIP_FAMILY_R300) ||
1660 (rinfo->family == CHIP_FAMILY_R350) ||
1661 (rinfo->family == CHIP_FAMILY_RV350) ||
1662 (rinfo->family == CHIP_FAMILY_R200) || !rinfo->has_CRTC2)
1663 newmode.tmds_transmitter_cntl &= ~TMDS_PLL_EN;
1664 else
1665 newmode.tmds_transmitter_cntl |= TMDS_PLL_EN;
1666 newmode.crtc_ext_cntl &= ~CRTC_CRT_ON;
1669 newmode.fp_crtc_h_total_disp = (((rinfo->panel_info.hblank / 8) & 0x3ff) |
1670 (((mode->xres / 8) - 1) << 16));
1671 newmode.fp_crtc_v_total_disp = (rinfo->panel_info.vblank & 0xffff) |
1672 ((mode->yres - 1) << 16);
1673 newmode.fp_h_sync_strt_wid = ((rinfo->panel_info.hOver_plus & 0x1fff) |
1674 (hsync_wid << 16) | (h_sync_pol << 23));
1675 newmode.fp_v_sync_strt_wid = ((rinfo->panel_info.vOver_plus & 0xfff) |
1676 (vsync_wid << 16) | (v_sync_pol << 23));
1679 /* do it! */
1680 if (!rinfo->asleep) {
1681 radeon_write_mode (rinfo, &newmode);
1682 /* (re)initialize the engine */
1683 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1684 radeonfb_engine_init (rinfo);
1686 /* Update fix */
1687 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1688 info->fix.line_length = rinfo->pitch*64;
1689 else
1690 info->fix.line_length = mode->xres_virtual
1691 * ((mode->bits_per_pixel + 1) / 8);
1692 info->fix.visual = rinfo->depth == 8 ? FB_VISUAL_PSEUDOCOLOR
1693 : FB_VISUAL_DIRECTCOLOR;
1695 #ifdef CONFIG_BOOTX_TEXT
1696 /* Update debug text engine */
1697 btext_update_display(rinfo->fb_base_phys, mode->xres, mode->yres,
1698 rinfo->depth, info->fix.line_length);
1699 #endif
1701 return 0;
1705 static struct fb_ops radeonfb_ops = {
1706 .owner = THIS_MODULE,
1707 .fb_check_var = radeonfb_check_var,
1708 .fb_set_par = radeonfb_set_par,
1709 .fb_setcolreg = radeonfb_setcolreg,
1710 .fb_pan_display = radeonfb_pan_display,
1711 .fb_blank = radeonfb_blank,
1712 .fb_ioctl = radeonfb_ioctl,
1713 .fb_sync = radeonfb_sync,
1714 .fb_fillrect = radeonfb_fillrect,
1715 .fb_copyarea = radeonfb_copyarea,
1716 .fb_imageblit = radeonfb_imageblit,
1717 .fb_cursor = soft_cursor,
1721 static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo)
1723 struct fb_info *info = rinfo->info;
1725 info->currcon = -1;
1726 info->par = rinfo;
1727 info->pseudo_palette = rinfo->pseudo_palette;
1728 info->flags = FBINFO_DEFAULT
1729 | FBINFO_HWACCEL_COPYAREA
1730 | FBINFO_HWACCEL_FILLRECT
1731 | FBINFO_HWACCEL_XPAN
1732 | FBINFO_HWACCEL_YPAN;
1733 info->fbops = &radeonfb_ops;
1734 info->screen_base = rinfo->fb_base;
1735 info->screen_size = rinfo->mapped_vram;
1736 /* Fill fix common fields */
1737 strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id));
1738 info->fix.smem_start = rinfo->fb_base_phys;
1739 info->fix.smem_len = rinfo->video_ram;
1740 info->fix.type = FB_TYPE_PACKED_PIXELS;
1741 info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
1742 info->fix.xpanstep = 8;
1743 info->fix.ypanstep = 1;
1744 info->fix.ywrapstep = 0;
1745 info->fix.type_aux = 0;
1746 info->fix.mmio_start = rinfo->mmio_base_phys;
1747 info->fix.mmio_len = RADEON_REGSIZE;
1749 fb_alloc_cmap(&info->cmap, 256, 0);
1751 if (noaccel)
1752 info->flags |= FBINFO_HWACCEL_DISABLED;
1754 return 0;
1758 #ifdef CONFIG_PMAC_BACKLIGHT
1760 /* TODO: Dbl check these tables, we don't go up to full ON backlight
1761 * in these, possibly because we noticed MacOS doesn't, but I'd prefer
1762 * having some more official numbers from ATI
1764 static int backlight_conv_m6[] = {
1765 0xff, 0xc0, 0xb5, 0xaa, 0x9f, 0x94, 0x89, 0x7e,
1766 0x73, 0x68, 0x5d, 0x52, 0x47, 0x3c, 0x31, 0x24
1768 static int backlight_conv_m7[] = {
1769 0x00, 0x3f, 0x4a, 0x55, 0x60, 0x6b, 0x76, 0x81,
1770 0x8c, 0x97, 0xa2, 0xad, 0xb8, 0xc3, 0xce, 0xd9
1773 #define BACKLIGHT_LVDS_OFF
1774 #undef BACKLIGHT_DAC_OFF
1776 /* We turn off the LCD completely instead of just dimming the backlight.
1777 * This provides some greater power saving and the display is useless
1778 * without backlight anyway.
1780 static int radeon_set_backlight_enable(int on, int level, void *data)
1782 struct radeonfb_info *rinfo = (struct radeonfb_info *)data;
1783 unsigned int lvds_gen_cntl = INREG(LVDS_GEN_CNTL);
1784 unsigned long tmpPixclksCntl = INPLL(PIXCLKS_CNTL);
1785 int* conv_table;
1787 if (rinfo->mon1_type != MT_LCD)
1788 return 0;
1790 /* Pardon me for that hack... maybe some day we can figure
1791 * out in what direction backlight should work on a given
1792 * panel ?
1794 if ((rinfo->family == CHIP_FAMILY_RV200 ||
1795 rinfo->family == CHIP_FAMILY_RV250 ||
1796 rinfo->family == CHIP_FAMILY_RV280 ||
1797 rinfo->family == CHIP_FAMILY_RV350) &&
1798 !machine_is_compatible("PowerBook4,3") &&
1799 !machine_is_compatible("PowerBook6,3") &&
1800 !machine_is_compatible("PowerBook6,5"))
1801 conv_table = backlight_conv_m7;
1802 else
1803 conv_table = backlight_conv_m6;
1805 del_timer_sync(&rinfo->lvds_timer);
1807 lvds_gen_cntl |= (LVDS_BL_MOD_EN | LVDS_BLON);
1808 radeon_fifo_wait(3);
1809 if (on && (level > BACKLIGHT_OFF)) {
1810 lvds_gen_cntl |= LVDS_DIGON;
1811 if (!(lvds_gen_cntl & LVDS_ON)) {
1812 lvds_gen_cntl &= ~LVDS_BLON;
1813 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1814 (void)INREG(LVDS_GEN_CNTL);
1815 mdelay(rinfo->panel_info.pwr_delay);/* OUCH !!! FIXME */
1816 lvds_gen_cntl |= LVDS_BLON;
1817 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1819 lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK;
1820 lvds_gen_cntl |= (conv_table[level] <<
1821 LVDS_BL_MOD_LEVEL_SHIFT);
1822 lvds_gen_cntl |= (LVDS_ON | LVDS_EN);
1823 lvds_gen_cntl &= ~LVDS_DISPLAY_DIS;
1824 } else {
1825 /* Asic bug, when turning off LVDS_ON, we have to make sure
1826 RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off
1828 if (rinfo->is_mobility || rinfo->is_IGP)
1829 OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb);
1830 lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK;
1831 lvds_gen_cntl |= (conv_table[0] <<
1832 LVDS_BL_MOD_LEVEL_SHIFT);
1833 lvds_gen_cntl |= LVDS_DISPLAY_DIS | LVDS_BLON;
1834 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1835 mdelay(rinfo->panel_info.pwr_delay);/* OUCH !!! FIXME */
1836 lvds_gen_cntl &= ~(LVDS_ON | LVDS_EN | LVDS_BLON | LVDS_DIGON);
1839 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1840 if (rinfo->is_mobility || rinfo->is_IGP)
1841 OUTPLL(PIXCLKS_CNTL, tmpPixclksCntl);
1842 rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
1843 rinfo->init_state.lvds_gen_cntl |= (lvds_gen_cntl & LVDS_STATE_MASK);
1845 return 0;
1849 static int radeon_set_backlight_level(int level, void *data)
1851 return radeon_set_backlight_enable(1, level, data);
1853 #endif /* CONFIG_PMAC_BACKLIGHT */
1857 * This reconfigure the card's internal memory map. In theory, we'd like
1858 * to setup the card's memory at the same address as it's PCI bus address,
1859 * and the AGP aperture right after that so that system RAM on 32 bits
1860 * machines at least, is directly accessible. However, doing so would
1861 * conflict with the current XFree drivers...
1862 * Ultimately, I hope XFree, GATOS and ATI binary drivers will all agree
1863 * on the proper way to set this up and duplicate this here. In the meantime,
1864 * I put the card's memory at 0 in card space and AGP at some random high
1865 * local (0xe0000000 for now) that will be changed by XFree/DRI anyway
1867 #ifdef CONFIG_PPC_OF
1868 #undef SET_MC_FB_FROM_APERTURE
1869 static void fixup_memory_mappings(struct radeonfb_info *rinfo)
1871 u32 save_crtc_gen_cntl, save_crtc2_gen_cntl = 0;
1872 u32 save_crtc_ext_cntl;
1873 u32 aper_base, aper_size;
1874 u32 agp_base;
1876 /* First, we disable display to avoid interfering */
1877 if (rinfo->has_CRTC2) {
1878 save_crtc2_gen_cntl = INREG(CRTC2_GEN_CNTL);
1879 OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl | CRTC2_DISP_REQ_EN_B);
1881 save_crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
1882 save_crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
1884 OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl | CRTC_DISPLAY_DIS);
1885 OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B);
1886 mdelay(100);
1888 aper_base = INREG(CONFIG_APER_0_BASE);
1889 aper_size = INREG(CONFIG_APER_SIZE);
1891 #ifdef SET_MC_FB_FROM_APERTURE
1892 /* Set framebuffer to be at the same address as set in PCI BAR */
1893 OUTREG(MC_FB_LOCATION,
1894 ((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16));
1895 rinfo->fb_local_base = aper_base;
1896 #else
1897 OUTREG(MC_FB_LOCATION, 0x7fff0000);
1898 rinfo->fb_local_base = 0;
1899 #endif
1900 agp_base = aper_base + aper_size;
1901 if (agp_base & 0xf0000000)
1902 agp_base = (aper_base | 0x0fffffff) + 1;
1904 /* Set AGP to be just after the framebuffer on a 256Mb boundary. This
1905 * assumes the FB isn't mapped to 0xf0000000 or above, but this is
1906 * always the case on PPCs afaik.
1908 #ifdef SET_MC_FB_FROM_APERTURE
1909 OUTREG(MC_AGP_LOCATION, 0xffff0000 | (agp_base >> 16));
1910 #else
1911 OUTREG(MC_AGP_LOCATION, 0xffffe000);
1912 #endif
1914 /* Fixup the display base addresses & engine offsets while we
1915 * are at it as well
1917 #ifdef SET_MC_FB_FROM_APERTURE
1918 OUTREG(DISPLAY_BASE_ADDR, aper_base);
1919 if (rinfo->has_CRTC2)
1920 OUTREG(CRTC2_DISPLAY_BASE_ADDR, aper_base);
1921 #else
1922 OUTREG(DISPLAY_BASE_ADDR, 0);
1923 if (rinfo->has_CRTC2)
1924 OUTREG(CRTC2_DISPLAY_BASE_ADDR, 0);
1925 #endif
1926 mdelay(100);
1928 /* Restore display settings */
1929 OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl);
1930 OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl);
1931 if (rinfo->has_CRTC2)
1932 OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl);
1934 RTRACE("aper_base: %08x MC_FB_LOC to: %08x, MC_AGP_LOC to: %08x\n",
1935 aper_base,
1936 ((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16),
1937 0xffff0000 | (agp_base >> 16));
1939 #endif /* CONFIG_PPC_OF */
1943 * Sysfs
1946 static ssize_t radeon_show_one_edid(char *buf, loff_t off, size_t count, const u8 *edid)
1948 if (off > EDID_LENGTH)
1949 return 0;
1951 if (off + count > EDID_LENGTH)
1952 count = EDID_LENGTH - off;
1954 memcpy(buf, edid + off, count);
1956 return count;
1960 static ssize_t radeon_show_edid1(struct kobject *kobj, char *buf, loff_t off, size_t count)
1962 struct device *dev = container_of(kobj, struct device, kobj);
1963 struct pci_dev *pdev = to_pci_dev(dev);
1964 struct fb_info *info = pci_get_drvdata(pdev);
1965 struct radeonfb_info *rinfo = info->par;
1967 return radeon_show_one_edid(buf, off, count, rinfo->mon1_EDID);
1971 static ssize_t radeon_show_edid2(struct kobject *kobj, char *buf, loff_t off, size_t count)
1973 struct device *dev = container_of(kobj, struct device, kobj);
1974 struct pci_dev *pdev = to_pci_dev(dev);
1975 struct fb_info *info = pci_get_drvdata(pdev);
1976 struct radeonfb_info *rinfo = info->par;
1978 return radeon_show_one_edid(buf, off, count, rinfo->mon2_EDID);
1981 static struct bin_attribute edid1_attr = {
1982 .attr = {
1983 .name = "edid1",
1984 .owner = THIS_MODULE,
1985 .mode = 0444,
1987 .size = EDID_LENGTH,
1988 .read = radeon_show_edid1,
1991 static struct bin_attribute edid2_attr = {
1992 .attr = {
1993 .name = "edid2",
1994 .owner = THIS_MODULE,
1995 .mode = 0444,
1997 .size = EDID_LENGTH,
1998 .read = radeon_show_edid2,
2002 static int radeonfb_pci_register (struct pci_dev *pdev,
2003 const struct pci_device_id *ent)
2005 struct fb_info *info;
2006 struct radeonfb_info *rinfo;
2007 u32 tmp;
2008 int ret;
2010 RTRACE("radeonfb_pci_register BEGIN\n");
2012 /* Enable device in PCI config */
2013 ret = pci_enable_device(pdev);
2014 if (ret < 0) {
2015 printk(KERN_ERR "radeonfb: Cannot enable PCI device\n");
2016 goto err_out;
2019 info = framebuffer_alloc(sizeof(struct radeonfb_info), &pdev->dev);
2020 if (!info) {
2021 printk (KERN_ERR "radeonfb: could not allocate memory\n");
2022 ret = -ENOMEM;
2023 goto err_disable;
2025 rinfo = info->par;
2026 rinfo->info = info;
2027 rinfo->pdev = pdev;
2029 spin_lock_init(&rinfo->reg_lock);
2030 init_timer(&rinfo->lvds_timer);
2031 rinfo->lvds_timer.function = radeon_lvds_timer_func;
2032 rinfo->lvds_timer.data = (unsigned long)rinfo;
2034 strcpy(rinfo->name, "ATI Radeon XX ");
2035 rinfo->name[11] = ent->device >> 8;
2036 rinfo->name[12] = ent->device & 0xFF;
2037 rinfo->family = ent->driver_data & CHIP_FAMILY_MASK;
2038 rinfo->chipset = pdev->device;
2039 rinfo->has_CRTC2 = (ent->driver_data & CHIP_HAS_CRTC2) != 0;
2040 rinfo->is_mobility = (ent->driver_data & CHIP_IS_MOBILITY) != 0;
2041 rinfo->is_IGP = (ent->driver_data & CHIP_IS_IGP) != 0;
2043 /* Set base addrs */
2044 rinfo->fb_base_phys = pci_resource_start (pdev, 0);
2045 rinfo->mmio_base_phys = pci_resource_start (pdev, 2);
2047 /* request the mem regions */
2048 ret = pci_request_regions(pdev, "radeonfb");
2049 if (ret < 0) {
2050 printk( KERN_ERR "radeonfb: cannot reserve PCI regions."
2051 " Someone already got them?\n");
2052 goto err_release_fb;
2055 /* map the regions */
2056 rinfo->mmio_base = ioremap(rinfo->mmio_base_phys, RADEON_REGSIZE);
2057 if (!rinfo->mmio_base) {
2058 printk(KERN_ERR "radeonfb: cannot map MMIO\n");
2059 ret = -EIO;
2060 goto err_release_pci;
2063 /* On PPC, the firmware sets up a memory mapping that tends
2064 * to cause lockups when enabling the engine. We reconfigure
2065 * the card internal memory mappings properly
2067 #ifdef CONFIG_PPC_OF
2068 fixup_memory_mappings(rinfo);
2069 #else
2070 rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16;
2071 #endif /* CONFIG_PPC_OF */
2073 /* framebuffer size */
2074 if ((rinfo->family == CHIP_FAMILY_RS100) ||
2075 (rinfo->family == CHIP_FAMILY_RS200) ||
2076 (rinfo->family == CHIP_FAMILY_RS300)) {
2077 u32 tom = INREG(NB_TOM);
2078 tmp = ((((tom >> 16) - (tom & 0xffff) + 1) << 6) * 1024);
2080 radeon_fifo_wait(6);
2081 OUTREG(MC_FB_LOCATION, tom);
2082 OUTREG(DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
2083 OUTREG(CRTC2_DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
2084 OUTREG(OV0_BASE_ADDR, (tom & 0xffff) << 16);
2086 /* This is supposed to fix the crtc2 noise problem. */
2087 OUTREG(GRPH2_BUFFER_CNTL, INREG(GRPH2_BUFFER_CNTL) & ~0x7f0000);
2089 if ((rinfo->family == CHIP_FAMILY_RS100) ||
2090 (rinfo->family == CHIP_FAMILY_RS200)) {
2091 /* This is to workaround the asic bug for RMX, some versions
2092 of BIOS dosen't have this register initialized correctly.
2094 OUTREGP(CRTC_MORE_CNTL, CRTC_H_CUTOFF_ACTIVE_EN,
2095 ~CRTC_H_CUTOFF_ACTIVE_EN);
2097 } else {
2098 tmp = INREG(CONFIG_MEMSIZE);
2101 /* mem size is bits [28:0], mask off the rest */
2102 rinfo->video_ram = tmp & CONFIG_MEMSIZE_MASK;
2104 /* ram type */
2105 tmp = INREG(MEM_SDRAM_MODE_REG);
2106 switch ((MEM_CFG_TYPE & tmp) >> 30) {
2107 case 0:
2108 /* SDR SGRAM (2:1) */
2109 strcpy(rinfo->ram_type, "SDR SGRAM");
2110 rinfo->ram.ml = 4;
2111 rinfo->ram.mb = 4;
2112 rinfo->ram.trcd = 1;
2113 rinfo->ram.trp = 2;
2114 rinfo->ram.twr = 1;
2115 rinfo->ram.cl = 2;
2116 rinfo->ram.loop_latency = 16;
2117 rinfo->ram.rloop = 16;
2118 break;
2119 case 1:
2120 /* DDR SGRAM */
2121 strcpy(rinfo->ram_type, "DDR SGRAM");
2122 rinfo->ram.ml = 4;
2123 rinfo->ram.mb = 4;
2124 rinfo->ram.trcd = 3;
2125 rinfo->ram.trp = 3;
2126 rinfo->ram.twr = 2;
2127 rinfo->ram.cl = 3;
2128 rinfo->ram.tr2w = 1;
2129 rinfo->ram.loop_latency = 16;
2130 rinfo->ram.rloop = 16;
2131 break;
2132 default:
2133 /* 64-bit SDR SGRAM */
2134 strcpy(rinfo->ram_type, "SDR SGRAM 64");
2135 rinfo->ram.ml = 4;
2136 rinfo->ram.mb = 8;
2137 rinfo->ram.trcd = 3;
2138 rinfo->ram.trp = 3;
2139 rinfo->ram.twr = 1;
2140 rinfo->ram.cl = 3;
2141 rinfo->ram.tr2w = 1;
2142 rinfo->ram.loop_latency = 17;
2143 rinfo->ram.rloop = 17;
2144 break;
2148 * Hack to get around some busted production M6's
2149 * reporting no ram
2151 if (rinfo->video_ram == 0) {
2152 switch (pdev->device) {
2153 case PCI_CHIP_RADEON_LY:
2154 case PCI_CHIP_RADEON_LZ:
2155 rinfo->video_ram = 8192 * 1024;
2156 break;
2157 default:
2158 break;
2162 RTRACE("radeonfb: probed %s %ldk videoram\n", (rinfo->ram_type), (rinfo->video_ram/1024));
2164 rinfo->mapped_vram = min_t(unsigned long, MAX_MAPPED_VRAM, rinfo->video_ram);
2166 do {
2167 rinfo->fb_base = ioremap (rinfo->fb_base_phys,
2168 rinfo->mapped_vram);
2169 } while ( rinfo->fb_base == 0 &&
2170 ((rinfo->mapped_vram /=2) >= MIN_MAPPED_VRAM) );
2172 if (rinfo->fb_base)
2173 memset_io(rinfo->fb_base, 0, rinfo->mapped_vram);
2174 else {
2175 printk (KERN_ERR "radeonfb: cannot map FB\n");
2176 ret = -EIO;
2177 goto err_unmap_rom;
2180 RTRACE("radeonfb: mapped %ldk videoram\n", rinfo->mapped_vram/1024);
2183 * Check for required workaround for PLL accesses
2185 rinfo->R300_cg_workaround = (rinfo->family == CHIP_FAMILY_R300 &&
2186 (INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK)
2187 == CFG_ATI_REV_A11);
2190 * Map the BIOS ROM if any and retreive PLL parameters from
2191 * the BIOS. We skip that on mobility chips as the real panel
2192 * values we need aren't in the ROM but in the BIOS image in
2193 * memory. This is definitely not the best meacnism though,
2194 * we really need the arch code to tell us which is the "primary"
2195 * video adapter to use the memory image (or better, the arch
2196 * should provide us a copy of the BIOS image to shield us from
2197 * archs who would store that elsewhere and/or could initialize
2198 * more than one adapter during boot).
2200 if (!rinfo->is_mobility)
2201 radeon_map_ROM(rinfo, pdev);
2204 * On x86, the primary display on laptop may have it's BIOS
2205 * ROM elsewhere, try to locate it at the legacy memory hole.
2206 * We probably need to make sure this is the primary display,
2207 * but that is difficult without some arch support.
2209 #ifdef CONFIG_X86
2210 if (rinfo->bios_seg == NULL)
2211 radeon_find_mem_vbios(rinfo);
2212 #endif
2214 /* If both above failed, try the BIOS ROM again for mobility
2215 * chips
2217 if (rinfo->bios_seg == NULL && rinfo->is_mobility)
2218 radeon_map_ROM(rinfo, pdev);
2220 /* Get informations about the board's PLL */
2221 radeon_get_pllinfo(rinfo);
2223 #ifdef CONFIG_FB_RADEON_I2C
2224 /* Register I2C bus */
2225 radeon_create_i2c_busses(rinfo);
2226 #endif
2228 /* set all the vital stuff */
2229 radeon_set_fbinfo (rinfo);
2231 /* Probe screen types */
2232 radeon_probe_screens(rinfo, monitor_layout, ignore_edid);
2234 /* Build mode list, check out panel native model */
2235 radeon_check_modes(rinfo, mode_option);
2237 /* Register some sysfs stuff (should be done better) */
2238 if (rinfo->mon1_EDID)
2239 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid1_attr);
2240 if (rinfo->mon2_EDID)
2241 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid2_attr);
2243 /* save current mode regs before we switch into the new one
2244 * so we can restore this upon __exit
2246 radeon_save_state (rinfo, &rinfo->init_state);
2248 pci_set_drvdata(pdev, info);
2250 /* Enable PM on mobility chips */
2251 if (rinfo->is_mobility) {
2252 /* Find PM registers in config space */
2253 rinfo->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM);
2254 /* Enable dynamic PM of chip clocks */
2255 radeon_pm_enable_dynamic_mode(rinfo);
2256 printk("radeonfb: Power Management enabled for Mobility chipsets\n");
2259 ret = register_framebuffer(info);
2260 if (ret < 0) {
2261 printk (KERN_ERR "radeonfb: could not register framebuffer\n");
2262 goto err_unmap_fb;
2265 #ifdef CONFIG_MTRR
2266 rinfo->mtrr_hdl = nomtrr ? -1 : mtrr_add(rinfo->fb_base_phys,
2267 rinfo->video_ram,
2268 MTRR_TYPE_WRCOMB, 1);
2269 #endif
2271 #ifdef CONFIG_PMAC_BACKLIGHT
2272 if (rinfo->mon1_type == MT_LCD) {
2273 register_backlight_controller(&radeon_backlight_controller,
2274 rinfo, "ati");
2275 register_backlight_controller(&radeon_backlight_controller,
2276 rinfo, "mnca");
2278 #endif
2280 printk ("radeonfb: %s %s %ld MB\n", rinfo->name, rinfo->ram_type,
2281 (rinfo->video_ram/(1024*1024)));
2283 if (rinfo->bios_seg)
2284 radeon_unmap_ROM(rinfo, pdev);
2285 RTRACE("radeonfb_pci_register END\n");
2287 return 0;
2288 err_unmap_fb:
2289 iounmap(rinfo->fb_base);
2290 err_unmap_rom:
2291 if (rinfo->mon1_EDID)
2292 kfree(rinfo->mon1_EDID);
2293 if (rinfo->mon2_EDID)
2294 kfree(rinfo->mon2_EDID);
2295 if (rinfo->mon1_modedb)
2296 fb_destroy_modedb(rinfo->mon1_modedb);
2297 fb_dealloc_cmap(&info->cmap);
2298 #ifdef CONFIG_FB_RADEON_I2C
2299 radeon_delete_i2c_busses(rinfo);
2300 #endif
2301 if (rinfo->bios_seg)
2302 radeon_unmap_ROM(rinfo, pdev);
2303 iounmap(rinfo->mmio_base);
2304 err_release_pci:
2305 pci_release_regions(pdev);
2306 err_release_fb:
2307 framebuffer_release(info);
2308 err_disable:
2309 pci_disable_device(pdev);
2310 err_out:
2311 return ret;
2316 static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev)
2318 struct fb_info *info = pci_get_drvdata(pdev);
2319 struct radeonfb_info *rinfo = info->par;
2321 if (!rinfo)
2322 return;
2324 /* restore original state
2326 * Doesn't quite work yet, possibly because of the PPC hacking
2327 * I do on startup, disable for now. --BenH
2329 radeon_write_mode (rinfo, &rinfo->init_state);
2331 del_timer_sync(&rinfo->lvds_timer);
2333 #ifdef CONFIG_MTRR
2334 if (rinfo->mtrr_hdl >= 0)
2335 mtrr_del(rinfo->mtrr_hdl, 0, 0);
2336 #endif
2338 unregister_framebuffer(info);
2340 iounmap(rinfo->mmio_base);
2341 iounmap(rinfo->fb_base);
2343 pci_release_regions(pdev);
2345 if (rinfo->mon1_EDID)
2346 kfree(rinfo->mon1_EDID);
2347 if (rinfo->mon2_EDID)
2348 kfree(rinfo->mon2_EDID);
2349 if (rinfo->mon1_modedb)
2350 fb_destroy_modedb(rinfo->mon1_modedb);
2351 #ifdef CONFIG_FB_RADEON_I2C
2352 radeon_delete_i2c_busses(rinfo);
2353 #endif
2354 fb_dealloc_cmap(&info->cmap);
2355 framebuffer_release(info);
2356 pci_disable_device(pdev);
2360 static struct pci_driver radeonfb_driver = {
2361 .name = "radeonfb",
2362 .id_table = radeonfb_pci_table,
2363 .probe = radeonfb_pci_register,
2364 .remove = __devexit_p(radeonfb_pci_unregister),
2365 #ifdef CONFIG_PM
2366 .suspend = radeonfb_pci_suspend,
2367 .resume = radeonfb_pci_resume,
2368 #endif /* CONFIG_PM */
2371 int __init radeonfb_setup (char *options);
2373 int __init radeonfb_init (void)
2375 #ifndef MODULE
2376 char *option = NULL;
2378 if (fb_get_options("radeonfb", &option))
2379 return -ENODEV;
2380 radeonfb_setup(option);
2381 #endif
2382 return pci_module_init (&radeonfb_driver);
2386 void __exit radeonfb_exit (void)
2388 pci_unregister_driver (&radeonfb_driver);
2391 int __init radeonfb_setup (char *options)
2393 char *this_opt;
2395 if (!options || !*options)
2396 return 0;
2398 while ((this_opt = strsep (&options, ",")) != NULL) {
2399 if (!*this_opt)
2400 continue;
2402 if (!strncmp(this_opt, "noaccel", 7)) {
2403 noaccel = 1;
2404 } else if (!strncmp(this_opt, "mirror", 6)) {
2405 mirror = 1;
2406 } else if (!strncmp(this_opt, "force_dfp", 9)) {
2407 force_dfp = 1;
2408 } else if (!strncmp(this_opt, "panel_yres:", 11)) {
2409 panel_yres = simple_strtoul((this_opt+11), NULL, 0);
2410 #ifdef CONFIG_MTRR
2411 } else if (!strncmp(this_opt, "nomtrr", 6)) {
2412 nomtrr = 1;
2413 #endif
2414 } else if (!strncmp(this_opt, "nomodeset", 9)) {
2415 nomodeset = 1;
2416 } else if (!strncmp(this_opt, "force_measure_pll", 17)) {
2417 force_measure_pll = 1;
2418 } else if (!strncmp(this_opt, "ignore_edid", 11)) {
2419 ignore_edid = 1;
2420 } else
2421 mode_option = this_opt;
2423 return 0;
2426 module_init(radeonfb_init);
2428 #ifdef MODULE
2429 module_exit(radeonfb_exit);
2430 #endif
2432 MODULE_AUTHOR("Ani Joshi");
2433 MODULE_DESCRIPTION("framebuffer driver for ATI Radeon chipset");
2434 MODULE_LICENSE("GPL");
2435 module_param(noaccel, bool, 0);
2436 MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
2437 module_param(nomodeset, bool, 0);
2438 MODULE_PARM_DESC(nomodeset, "bool: disable actual setting of video mode");
2439 module_param(mirror, bool, 0);
2440 MODULE_PARM_DESC(mirror, "bool: mirror the display to both monitors");
2441 module_param(force_dfp, bool, 0);
2442 MODULE_PARM_DESC(force_dfp, "bool: force display to dfp");
2443 module_param(ignore_edid, bool, 0);
2444 MODULE_PARM_DESC(ignore_edid, "bool: Ignore EDID data when doing DDC probe");
2445 module_param(monitor_layout, charp, 0);
2446 MODULE_PARM_DESC(monitor_layout, "Specify monitor mapping (like XFree86)");
2447 module_param(force_measure_pll, bool, 0);
2448 MODULE_PARM_DESC(force_measure_pll, "Force measurement of PLL (debug)");
2449 #ifdef CONFIG_MTRR
2450 module_param(nomtrr, bool, 0);
2451 MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers");
2452 #endif
2453 module_param(panel_yres, int, 0);
2454 MODULE_PARM_DESC(panel_yres, "int: set panel yres");
2455 module_param(mode_option, charp, 0);
2456 MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");