2 * drivers/video/aty/radeon_base.c
4 * framebuffer driver for ATI Radeon chipset video boards
6 * Copyright 2003 Ben. Herrenschmidt <benh@kernel.crashing.org>
7 * Copyright 2000 Ani Joshi <ajoshi@kernel.crashing.org>
9 * i2c bits from Luca Tettamanti <kronos@kronoz.cjb.net>
11 * Special thanks to ATI DevRel team for their hardware donations.
13 * ...Insert GPL boilerplate here...
15 * Significant portions of this driver apdated from XFree86 Radeon
16 * driver which has the following copyright notice:
18 * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
19 * VA Linux Systems Inc., Fremont, California.
21 * All Rights Reserved.
23 * Permission is hereby granted, free of charge, to any person obtaining
24 * a copy of this software and associated documentation files (the
25 * "Software"), to deal in the Software without restriction, including
26 * without limitation on the rights to use, copy, modify, merge,
27 * publish, distribute, sublicense, and/or sell copies of the Software,
28 * and to permit persons to whom the Software is furnished to do so,
29 * subject to the following conditions:
31 * The above copyright notice and this permission notice (including the
32 * next paragraph) shall be included in all copies or substantial
33 * portions of the Software.
35 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
36 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
37 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
38 * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
39 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
40 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
42 * DEALINGS IN THE SOFTWARE.
44 * XFree86 driver authors:
46 * Kevin E. Martin <martin@xfree86.org>
47 * Rickard E. Faith <faith@valinux.com>
48 * Alan Hourihane <alanh@fairlite.demon.co.uk>
53 #define RADEON_VERSION "0.2.0"
55 #include <linux/config.h>
56 #include <linux/module.h>
57 #include <linux/moduleparam.h>
58 #include <linux/kernel.h>
59 #include <linux/errno.h>
60 #include <linux/string.h>
62 #include <linux/tty.h>
63 #include <linux/slab.h>
64 #include <linux/delay.h>
65 #include <linux/time.h>
67 #include <linux/ioport.h>
68 #include <linux/init.h>
69 #include <linux/pci.h>
70 #include <linux/vmalloc.h>
71 #include <linux/device.h>
74 #include <asm/uaccess.h>
78 #include <asm/pci-bridge.h>
79 #include "../macmodes.h"
81 #ifdef CONFIG_PMAC_BACKLIGHT
82 #include <asm/backlight.h>
85 #ifdef CONFIG_BOOTX_TEXT
86 #include <asm/btext.h>
89 #endif /* CONFIG_PPC_OF */
95 #include <video/radeon.h>
96 #include <linux/radeonfb.h>
98 #include "../edid.h" // MOVE THAT TO include/video
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[] = {
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),
113 CHIP_DEF(PCI_CHIP_RV100_QY, RV100, CHIP_HAS_CRTC2),
114 CHIP_DEF(PCI_CHIP_RV100_QZ, RV100, CHIP_HAS_CRTC2),
115 CHIP_DEF(PCI_CHIP_RN50, RV100, CHIP_HAS_CRTC2),
116 /* Radeon IGP320M (U1) */
117 CHIP_DEF(PCI_CHIP_RS100_4336, RS100, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
118 /* Radeon IGP320 (A3) */
119 CHIP_DEF(PCI_CHIP_RS100_4136, RS100, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
120 /* IGP330M/340M/350M (U2) */
121 CHIP_DEF(PCI_CHIP_RS200_4337, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
122 /* IGP330/340/350 (A4) */
123 CHIP_DEF(PCI_CHIP_RS200_4137, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
124 /* Mobility 7000 IGP */
125 CHIP_DEF(PCI_CHIP_RS250_4437, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
127 CHIP_DEF(PCI_CHIP_RS250_4237, RS200, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
129 CHIP_DEF(PCI_CHIP_R200_BB, R200, CHIP_HAS_CRTC2),
130 CHIP_DEF(PCI_CHIP_R200_BC, R200, CHIP_HAS_CRTC2),
132 CHIP_DEF(PCI_CHIP_R200_QH, R200, CHIP_HAS_CRTC2),
134 CHIP_DEF(PCI_CHIP_R200_QL, R200, CHIP_HAS_CRTC2),
136 CHIP_DEF(PCI_CHIP_R200_QM, R200, CHIP_HAS_CRTC2),
138 CHIP_DEF(PCI_CHIP_RADEON_LW, RV200, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
139 CHIP_DEF(PCI_CHIP_RADEON_LX, RV200, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
141 CHIP_DEF(PCI_CHIP_RV200_QW, RV200, CHIP_HAS_CRTC2),
142 CHIP_DEF(PCI_CHIP_RV200_QX, RV200, CHIP_HAS_CRTC2),
144 CHIP_DEF(PCI_CHIP_RV250_Ld, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
145 CHIP_DEF(PCI_CHIP_RV250_Le, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
146 CHIP_DEF(PCI_CHIP_RV250_Lf, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
147 CHIP_DEF(PCI_CHIP_RV250_Lg, RV250, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
149 CHIP_DEF(PCI_CHIP_RV250_If, RV250, CHIP_HAS_CRTC2),
150 CHIP_DEF(PCI_CHIP_RV250_Ig, RV250, CHIP_HAS_CRTC2),
151 /* Mobility 9100 IGP (U3) */
152 CHIP_DEF(PCI_CHIP_RS300_5835, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
153 CHIP_DEF(PCI_CHIP_RS350_7835, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP | CHIP_IS_MOBILITY),
155 CHIP_DEF(PCI_CHIP_RS300_5834, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
156 CHIP_DEF(PCI_CHIP_RS350_7834, RS300, CHIP_HAS_CRTC2 | CHIP_IS_IGP),
157 /* Mobility 9200 (M9+) */
158 CHIP_DEF(PCI_CHIP_RV280_5C61, RV280, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
159 CHIP_DEF(PCI_CHIP_RV280_5C63, RV280, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
161 CHIP_DEF(PCI_CHIP_RV280_5960, RV280, CHIP_HAS_CRTC2),
162 CHIP_DEF(PCI_CHIP_RV280_5961, RV280, CHIP_HAS_CRTC2),
163 CHIP_DEF(PCI_CHIP_RV280_5962, RV280, CHIP_HAS_CRTC2),
164 CHIP_DEF(PCI_CHIP_RV280_5964, RV280, CHIP_HAS_CRTC2),
166 CHIP_DEF(PCI_CHIP_R300_AD, R300, CHIP_HAS_CRTC2),
167 CHIP_DEF(PCI_CHIP_R300_AE, R300, CHIP_HAS_CRTC2),
168 /* 9600TX / FireGL Z1 */
169 CHIP_DEF(PCI_CHIP_R300_AF, R300, CHIP_HAS_CRTC2),
170 CHIP_DEF(PCI_CHIP_R300_AG, R300, CHIP_HAS_CRTC2),
171 /* 9700/9500/Pro/FireGL X1 */
172 CHIP_DEF(PCI_CHIP_R300_ND, R300, CHIP_HAS_CRTC2),
173 CHIP_DEF(PCI_CHIP_R300_NE, R300, CHIP_HAS_CRTC2),
174 CHIP_DEF(PCI_CHIP_R300_NF, R300, CHIP_HAS_CRTC2),
175 CHIP_DEF(PCI_CHIP_R300_NG, R300, CHIP_HAS_CRTC2),
176 /* Mobility M10/M11 */
177 CHIP_DEF(PCI_CHIP_RV350_NP, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
178 CHIP_DEF(PCI_CHIP_RV350_NQ, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
179 CHIP_DEF(PCI_CHIP_RV350_NR, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
180 CHIP_DEF(PCI_CHIP_RV350_NS, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
181 CHIP_DEF(PCI_CHIP_RV350_NT, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
182 CHIP_DEF(PCI_CHIP_RV350_NV, RV350, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
184 CHIP_DEF(PCI_CHIP_RV350_AP, RV350, CHIP_HAS_CRTC2),
185 CHIP_DEF(PCI_CHIP_RV350_AQ, RV350, CHIP_HAS_CRTC2),
186 CHIP_DEF(PCI_CHIP_RV360_AR, RV350, CHIP_HAS_CRTC2),
187 CHIP_DEF(PCI_CHIP_RV350_AS, RV350, CHIP_HAS_CRTC2),
188 CHIP_DEF(PCI_CHIP_RV350_AT, RV350, CHIP_HAS_CRTC2),
189 CHIP_DEF(PCI_CHIP_RV350_AV, RV350, CHIP_HAS_CRTC2),
190 /* 9800/Pro/FileGL X2 */
191 CHIP_DEF(PCI_CHIP_R350_AH, R350, CHIP_HAS_CRTC2),
192 CHIP_DEF(PCI_CHIP_R350_AI, R350, CHIP_HAS_CRTC2),
193 CHIP_DEF(PCI_CHIP_R350_AJ, R350, CHIP_HAS_CRTC2),
194 CHIP_DEF(PCI_CHIP_R350_AK, R350, CHIP_HAS_CRTC2),
195 CHIP_DEF(PCI_CHIP_R350_NH, R350, CHIP_HAS_CRTC2),
196 CHIP_DEF(PCI_CHIP_R350_NI, R350, CHIP_HAS_CRTC2),
197 CHIP_DEF(PCI_CHIP_R360_NJ, R350, CHIP_HAS_CRTC2),
198 CHIP_DEF(PCI_CHIP_R350_NK, R350, CHIP_HAS_CRTC2),
200 CHIP_DEF(PCI_CHIP_RV380_3E50, RV380, CHIP_HAS_CRTC2),
201 CHIP_DEF(PCI_CHIP_RV380_3E54, RV380, CHIP_HAS_CRTC2),
202 CHIP_DEF(PCI_CHIP_RV380_3150, RV380, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
203 CHIP_DEF(PCI_CHIP_RV380_3154, RV380, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
204 CHIP_DEF(PCI_CHIP_RV370_5B60, RV380, CHIP_HAS_CRTC2),
205 CHIP_DEF(PCI_CHIP_RV370_5B62, RV380, CHIP_HAS_CRTC2),
206 CHIP_DEF(PCI_CHIP_RV370_5B64, RV380, CHIP_HAS_CRTC2),
207 CHIP_DEF(PCI_CHIP_RV370_5B65, RV380, CHIP_HAS_CRTC2),
208 CHIP_DEF(PCI_CHIP_RV370_5460, RV380, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
209 CHIP_DEF(PCI_CHIP_RV370_5464, RV380, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
210 CHIP_DEF(PCI_CHIP_R420_JH, R420, CHIP_HAS_CRTC2),
211 CHIP_DEF(PCI_CHIP_R420_JI, R420, CHIP_HAS_CRTC2),
212 CHIP_DEF(PCI_CHIP_R420_JJ, R420, CHIP_HAS_CRTC2),
213 CHIP_DEF(PCI_CHIP_R420_JK, R420, CHIP_HAS_CRTC2),
214 CHIP_DEF(PCI_CHIP_R420_JL, R420, CHIP_HAS_CRTC2),
215 CHIP_DEF(PCI_CHIP_R420_JM, R420, CHIP_HAS_CRTC2),
216 CHIP_DEF(PCI_CHIP_R420_JN, R420, CHIP_HAS_CRTC2 | CHIP_IS_MOBILITY),
217 CHIP_DEF(PCI_CHIP_R420_JP, R420, CHIP_HAS_CRTC2),
218 CHIP_DEF(PCI_CHIP_R423_UH, R420, CHIP_HAS_CRTC2),
219 CHIP_DEF(PCI_CHIP_R423_UI, R420, CHIP_HAS_CRTC2),
220 CHIP_DEF(PCI_CHIP_R423_UJ, R420, CHIP_HAS_CRTC2),
221 CHIP_DEF(PCI_CHIP_R423_UK, R420, CHIP_HAS_CRTC2),
222 CHIP_DEF(PCI_CHIP_R423_UQ, R420, CHIP_HAS_CRTC2),
223 CHIP_DEF(PCI_CHIP_R423_UR, R420, CHIP_HAS_CRTC2),
224 CHIP_DEF(PCI_CHIP_R423_UT, R420, CHIP_HAS_CRTC2),
225 CHIP_DEF(PCI_CHIP_R423_5D57, R420, CHIP_HAS_CRTC2),
226 /* Original Radeon/7200 */
227 CHIP_DEF(PCI_CHIP_RADEON_QD, RADEON, 0),
228 CHIP_DEF(PCI_CHIP_RADEON_QE, RADEON, 0),
229 CHIP_DEF(PCI_CHIP_RADEON_QF, RADEON, 0),
230 CHIP_DEF(PCI_CHIP_RADEON_QG, RADEON, 0),
233 MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
242 /* these common regs are cleared before mode setting so they do not
243 * interfere with anything
245 static reg_val common_regs[] = {
247 { OVR_WID_LEFT_RIGHT, 0 },
248 { OVR_WID_TOP_BOTTOM, 0 },
249 { OV0_SCALE_CNTL, 0 },
254 { CAP0_TRIG_CNTL, 0 },
255 { CAP1_TRIG_CNTL, 0 },
262 static char *mode_option;
263 static char *monitor_layout;
264 static int noaccel = 0;
265 static int default_dynclk = -2;
266 static int nomodeset = 0;
267 static int ignore_edid = 0;
268 static int mirror = 0;
269 static int panel_yres = 0;
270 static int force_dfp = 0;
271 static int force_measure_pll = 0;
273 static int nomtrr = 0;
275 #if defined(CONFIG_PM) && defined(CONFIG_X86)
276 int radeon_force_sleep = 0;
286 #ifdef CONFIG_PMAC_BACKLIGHT
287 static int radeon_set_backlight_enable(int on, int level, void *data);
288 static int radeon_set_backlight_level(int level, void *data);
289 static struct backlight_controller radeon_backlight_controller = {
290 radeon_set_backlight_enable,
291 radeon_set_backlight_level
293 #endif /* CONFIG_PMAC_BACKLIGHT */
295 #endif /* CONFIG_PPC_OF */
297 static void radeon_unmap_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
299 if (!rinfo->bios_seg)
301 pci_unmap_rom(dev, rinfo->bios_seg);
304 static int __devinit radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
311 /* If this is a primary card, there is a shadow copy of the
312 * ROM somewhere in the first meg. We will just ignore the copy
313 * and use the ROM directly.
316 /* Fix from ATI for problem with Radeon hardware not leaving ROM enabled */
318 temp = INREG(MPP_TB_CONFIG);
321 OUTREG(MPP_TB_CONFIG, temp);
322 temp = INREG(MPP_TB_CONFIG);
324 rom = pci_map_rom(dev, &rom_size);
326 printk(KERN_ERR "radeonfb (%s): ROM failed to map\n",
327 pci_name(rinfo->pdev));
331 rinfo->bios_seg = rom;
333 /* Very simple test to make sure it appeared */
334 if (BIOS_IN16(0) != 0xaa55) {
335 printk(KERN_DEBUG "radeonfb (%s): Invalid ROM signature %x "
336 "should be 0xaa55\n",
337 pci_name(rinfo->pdev), BIOS_IN16(0));
340 /* Look for the PCI data to check the ROM type */
341 dptr = BIOS_IN16(0x18);
343 /* Check the PCI data signature. If it's wrong, we still assume a normal x86 ROM
344 * for now, until I've verified this works everywhere. The goal here is more
345 * to phase out Open Firmware images.
347 * Currently, we only look at the first PCI data, we could iteratre and deal with
348 * them all, and we should use fb_bios_start relative to start of image and not
349 * relative start of ROM, but so far, I never found a dual-image ATI card
352 * u32 signature; + 0x00
355 * u16 reserved_1; + 0x08
357 * u8 drevision; + 0x0c
358 * u8 class_hi; + 0x0d
359 * u16 class_lo; + 0x0e
361 * u16 irevision; + 0x12
363 * u8 indicator; + 0x15
364 * u16 reserved_2; + 0x16
367 if (BIOS_IN32(dptr) != (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P')) {
368 printk(KERN_WARNING "radeonfb (%s): PCI DATA signature in ROM"
369 "incorrect: %08x\n", pci_name(rinfo->pdev), BIOS_IN32(dptr));
372 rom_type = BIOS_IN8(dptr + 0x14);
375 printk(KERN_INFO "radeonfb: Found Intel x86 BIOS ROM Image\n");
378 printk(KERN_INFO "radeonfb: Found Open Firmware ROM Image\n");
381 printk(KERN_INFO "radeonfb: Found HP PA-RISC ROM Image\n");
384 printk(KERN_INFO "radeonfb: Found unknown type %d ROM Image\n", rom_type);
388 /* Locate the flat panel infos, do some sanity checking !!! */
389 rinfo->fp_bios_start = BIOS_IN16(0x48);
393 rinfo->bios_seg = NULL;
394 radeon_unmap_ROM(rinfo, dev);
399 static int __devinit radeon_find_mem_vbios(struct radeonfb_info *rinfo)
401 /* I simplified this code as we used to miss the signatures in
402 * a lot of case. It's now closer to XFree, we just don't check
403 * for signatures at all... Something better will have to be done
404 * if we end up having conflicts
407 void __iomem *rom_base = NULL;
409 for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
410 rom_base = ioremap(segstart, 0x10000);
411 if (rom_base == NULL)
413 if (readb(rom_base) == 0x55 && readb(rom_base + 1) == 0xaa)
418 if (rom_base == NULL)
421 /* Locate the flat panel infos, do some sanity checking !!! */
422 rinfo->bios_seg = rom_base;
423 rinfo->fp_bios_start = BIOS_IN16(0x48);
431 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
432 * tree. Hopefully, ATI OF driver is kind enough to fill these
434 static int __devinit radeon_read_xtal_OF (struct radeonfb_info *rinfo)
436 struct device_node *dp = rinfo->of_node;
441 val = (u32 *) get_property(dp, "ATY,RefCLK", NULL);
443 printk(KERN_WARNING "radeonfb: No ATY,RefCLK property !\n");
447 rinfo->pll.ref_clk = (*val) / 10;
449 val = (u32 *) get_property(dp, "ATY,SCLK", NULL);
451 rinfo->pll.sclk = (*val) / 10;
453 val = (u32 *) get_property(dp, "ATY,MCLK", NULL);
455 rinfo->pll.mclk = (*val) / 10;
459 #endif /* CONFIG_PPC_OF */
462 * Read PLL infos from chip registers
464 static int __devinit radeon_probe_pll_params(struct radeonfb_info *rinfo)
466 unsigned char ppll_div_sel;
468 unsigned sclk, mclk, tmp, ref_div;
469 int hTotal, vTotal, num, denom, m, n;
470 unsigned long long hz, vclk;
472 struct timeval start_tv, stop_tv;
473 long total_secs, total_usecs;
476 /* Ugh, we cut interrupts, bad bad bad, but we want some precision
480 /* Flush PCI buffers ? */
481 tmp = INREG16(DEVICE_ID);
485 for(i=0; i<1000000; i++)
486 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
489 do_gettimeofday(&start_tv);
491 for(i=0; i<1000000; i++)
492 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) != 0)
495 for(i=0; i<1000000; i++)
496 if (((INREG(CRTC_VLINE_CRNT_VLINE) >> 16) & 0x3ff) == 0)
499 do_gettimeofday(&stop_tv);
503 total_secs = stop_tv.tv_sec - start_tv.tv_sec;
506 total_usecs = stop_tv.tv_usec - start_tv.tv_usec;
507 total_usecs += total_secs * 1000000;
509 total_usecs = -total_usecs;
510 hz = 1000000/total_usecs;
512 hTotal = ((INREG(CRTC_H_TOTAL_DISP) & 0x1ff) + 1) * 8;
513 vTotal = ((INREG(CRTC_V_TOTAL_DISP) & 0x3ff) + 1);
514 vclk = (long long)hTotal * (long long)vTotal * hz;
516 switch((INPLL(PPLL_REF_DIV) & 0x30000) >> 16) {
523 n = ((INPLL(M_SPLL_REF_FB_DIV) >> 16) & 0xff);
524 m = (INPLL(M_SPLL_REF_FB_DIV) & 0xff);
529 n = ((INPLL(M_SPLL_REF_FB_DIV) >> 8) & 0xff);
530 m = (INPLL(M_SPLL_REF_FB_DIV) & 0xff);
536 ppll_div_sel = INREG8(CLOCK_CNTL_INDEX + 1) & 0x3;
537 radeon_pll_errata_after_index(rinfo);
539 n = (INPLL(PPLL_DIV_0 + ppll_div_sel) & 0x7ff);
540 m = (INPLL(PPLL_REF_DIV) & 0x3ff);
545 switch ((INPLL(PPLL_DIV_0 + ppll_div_sel) >> 16) & 0x7) {
567 do_div(vclk, 1000 * num);
570 if ((xtal > 26900) && (xtal < 27100))
572 else if ((xtal > 14200) && (xtal < 14400))
574 else if ((xtal > 29400) && (xtal < 29600))
577 printk(KERN_WARNING "xtal calculation failed: %ld\n", xtal);
581 tmp = INPLL(M_SPLL_REF_FB_DIV);
582 ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
584 Ns = (tmp & 0xff0000) >> 16;
585 Nm = (tmp & 0xff00) >> 8;
587 sclk = round_div((2 * Ns * xtal), (2 * M));
588 mclk = round_div((2 * Nm * xtal), (2 * M));
590 /* we're done, hopefully these are sane values */
591 rinfo->pll.ref_clk = xtal;
592 rinfo->pll.ref_div = ref_div;
593 rinfo->pll.sclk = sclk;
594 rinfo->pll.mclk = mclk;
600 * Retrieve PLL infos by different means (BIOS, Open Firmware, register probing...)
602 static void __devinit radeon_get_pllinfo(struct radeonfb_info *rinfo)
605 * In the case nothing works, these are defaults; they are mostly
606 * incomplete, however. It does provide ppll_max and _min values
607 * even for most other methods, however.
609 switch (rinfo->chipset) {
610 case PCI_DEVICE_ID_ATI_RADEON_QW:
611 case PCI_DEVICE_ID_ATI_RADEON_QX:
612 rinfo->pll.ppll_max = 35000;
613 rinfo->pll.ppll_min = 12000;
614 rinfo->pll.mclk = 23000;
615 rinfo->pll.sclk = 23000;
616 rinfo->pll.ref_clk = 2700;
618 case PCI_DEVICE_ID_ATI_RADEON_QL:
619 case PCI_DEVICE_ID_ATI_RADEON_QN:
620 case PCI_DEVICE_ID_ATI_RADEON_QO:
621 case PCI_DEVICE_ID_ATI_RADEON_Ql:
622 case PCI_DEVICE_ID_ATI_RADEON_BB:
623 rinfo->pll.ppll_max = 35000;
624 rinfo->pll.ppll_min = 12000;
625 rinfo->pll.mclk = 27500;
626 rinfo->pll.sclk = 27500;
627 rinfo->pll.ref_clk = 2700;
629 case PCI_DEVICE_ID_ATI_RADEON_Id:
630 case PCI_DEVICE_ID_ATI_RADEON_Ie:
631 case PCI_DEVICE_ID_ATI_RADEON_If:
632 case PCI_DEVICE_ID_ATI_RADEON_Ig:
633 rinfo->pll.ppll_max = 35000;
634 rinfo->pll.ppll_min = 12000;
635 rinfo->pll.mclk = 25000;
636 rinfo->pll.sclk = 25000;
637 rinfo->pll.ref_clk = 2700;
639 case PCI_DEVICE_ID_ATI_RADEON_ND:
640 case PCI_DEVICE_ID_ATI_RADEON_NE:
641 case PCI_DEVICE_ID_ATI_RADEON_NF:
642 case PCI_DEVICE_ID_ATI_RADEON_NG:
643 rinfo->pll.ppll_max = 40000;
644 rinfo->pll.ppll_min = 20000;
645 rinfo->pll.mclk = 27000;
646 rinfo->pll.sclk = 27000;
647 rinfo->pll.ref_clk = 2700;
649 case PCI_DEVICE_ID_ATI_RADEON_QD:
650 case PCI_DEVICE_ID_ATI_RADEON_QE:
651 case PCI_DEVICE_ID_ATI_RADEON_QF:
652 case PCI_DEVICE_ID_ATI_RADEON_QG:
654 rinfo->pll.ppll_max = 35000;
655 rinfo->pll.ppll_min = 12000;
656 rinfo->pll.mclk = 16600;
657 rinfo->pll.sclk = 16600;
658 rinfo->pll.ref_clk = 2700;
661 rinfo->pll.ref_div = INPLL(PPLL_REF_DIV) & PPLL_REF_DIV_MASK;
666 * Retrieve PLL infos from Open Firmware first
668 if (!force_measure_pll && radeon_read_xtal_OF(rinfo) == 0) {
669 printk(KERN_INFO "radeonfb: Retrieved PLL infos from Open Firmware\n");
672 #endif /* CONFIG_PPC_OF */
675 * Check out if we have an X86 which gave us some PLL informations
676 * and if yes, retrieve them
678 if (!force_measure_pll && rinfo->bios_seg) {
679 u16 pll_info_block = BIOS_IN16(rinfo->fp_bios_start + 0x30);
681 rinfo->pll.sclk = BIOS_IN16(pll_info_block + 0x08);
682 rinfo->pll.mclk = BIOS_IN16(pll_info_block + 0x0a);
683 rinfo->pll.ref_clk = BIOS_IN16(pll_info_block + 0x0e);
684 rinfo->pll.ref_div = BIOS_IN16(pll_info_block + 0x10);
685 rinfo->pll.ppll_min = BIOS_IN32(pll_info_block + 0x12);
686 rinfo->pll.ppll_max = BIOS_IN32(pll_info_block + 0x16);
688 printk(KERN_INFO "radeonfb: Retrieved PLL infos from BIOS\n");
693 * We didn't get PLL parameters from either OF or BIOS, we try to
696 if (radeon_probe_pll_params(rinfo) == 0) {
697 printk(KERN_INFO "radeonfb: Retrieved PLL infos from registers\n");
702 * Fall back to already-set defaults...
704 printk(KERN_INFO "radeonfb: Used default PLL infos\n");
708 * Some methods fail to retrieve SCLK and MCLK values, we apply default
709 * settings in this case (200Mhz). If that really happne often, we could
710 * fetch from registers instead...
712 if (rinfo->pll.mclk == 0)
713 rinfo->pll.mclk = 20000;
714 if (rinfo->pll.sclk == 0)
715 rinfo->pll.sclk = 20000;
717 printk("radeonfb: Reference=%d.%02d MHz (RefDiv=%d) Memory=%d.%02d Mhz, System=%d.%02d MHz\n",
718 rinfo->pll.ref_clk / 100, rinfo->pll.ref_clk % 100,
720 rinfo->pll.mclk / 100, rinfo->pll.mclk % 100,
721 rinfo->pll.sclk / 100, rinfo->pll.sclk % 100);
722 printk("radeonfb: PLL min %d max %d\n", rinfo->pll.ppll_min, rinfo->pll.ppll_max);
725 static int radeonfb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
727 struct radeonfb_info *rinfo = info->par;
728 struct fb_var_screeninfo v;
732 if (radeon_match_mode(rinfo, &v, var))
735 switch (v.bits_per_pixel) {
737 v.bits_per_pixel = 8;
740 v.bits_per_pixel = 16;
743 #if 0 /* Doesn't seem to work */
744 v.bits_per_pixel = 24;
749 v.bits_per_pixel = 32;
755 switch (var_to_depth(&v)) {
758 v.red.offset = v.green.offset = v.blue.offset = 0;
759 v.red.length = v.green.length = v.blue.length = 8;
760 v.transp.offset = v.transp.length = 0;
768 v.red.length = v.green.length = v.blue.length = 5;
769 v.transp.offset = v.transp.length = 0;
780 v.transp.offset = v.transp.length = 0;
788 v.red.length = v.blue.length = v.green.length = 8;
789 v.transp.offset = v.transp.length = 0;
797 v.red.length = v.blue.length = v.green.length = 8;
798 v.transp.offset = 24;
802 printk ("radeonfb: mode %dx%dx%d rejected, color depth invalid\n",
803 var->xres, var->yres, var->bits_per_pixel);
807 if (v.yres_virtual < v.yres)
808 v.yres_virtual = v.yres;
809 if (v.xres_virtual < v.xres)
810 v.xres_virtual = v.xres;
813 /* XXX I'm adjusting xres_virtual to the pitch, that may help XFree
814 * with some panels, though I don't quite like this solution
816 if (rinfo->info->flags & FBINFO_HWACCEL_DISABLED) {
817 v.xres_virtual = v.xres_virtual & ~7ul;
819 pitch = ((v.xres_virtual * ((v.bits_per_pixel + 1) / 8) + 0x3f)
821 v.xres_virtual = (pitch << 6) / ((v.bits_per_pixel + 1) / 8);
824 if (((v.xres_virtual * v.yres_virtual * nom) / den) > rinfo->mapped_vram)
827 if (v.xres_virtual < v.xres)
828 v.xres = v.xres_virtual;
835 if (v.xoffset > v.xres_virtual - v.xres)
836 v.xoffset = v.xres_virtual - v.xres - 1;
838 if (v.yoffset > v.yres_virtual - v.yres)
839 v.yoffset = v.yres_virtual - v.yres - 1;
841 v.red.msb_right = v.green.msb_right = v.blue.msb_right =
842 v.transp.offset = v.transp.length =
843 v.transp.msb_right = 0;
845 memcpy(var, &v, sizeof(v));
851 static int radeonfb_pan_display (struct fb_var_screeninfo *var,
852 struct fb_info *info)
854 struct radeonfb_info *rinfo = info->par;
856 if ((var->xoffset + var->xres > var->xres_virtual)
857 || (var->yoffset + var->yres > var->yres_virtual))
864 OUTREG(CRTC_OFFSET, ((var->yoffset * var->xres_virtual + var->xoffset)
865 * var->bits_per_pixel / 8) & ~7);
870 static int radeonfb_ioctl (struct fb_info *info, unsigned int cmd,
873 struct radeonfb_info *rinfo = info->par;
880 * TODO: set mirror accordingly for non-Mobility chipsets with 2 CRTC's
881 * and do something better using 2nd CRTC instead of just hackish
882 * routing to second output
884 case FBIO_RADEON_SET_MIRROR:
885 if (!rinfo->is_mobility)
888 rc = get_user(value, (__u32 __user *)arg);
895 tmp = INREG(LVDS_GEN_CNTL);
897 tmp |= (LVDS_ON | LVDS_BLON);
899 tmp = INREG(LVDS_GEN_CNTL);
901 tmp &= ~(LVDS_ON | LVDS_BLON);
904 OUTREG(LVDS_GEN_CNTL, tmp);
907 tmp = INREG(CRTC_EXT_CNTL);
912 tmp = INREG(CRTC_EXT_CNTL);
918 OUTREG(CRTC_EXT_CNTL, tmp);
921 case FBIO_RADEON_GET_MIRROR:
922 if (!rinfo->is_mobility)
925 tmp = INREG(LVDS_GEN_CNTL);
926 if ((LVDS_ON | LVDS_BLON) & tmp)
929 tmp = INREG(CRTC_EXT_CNTL);
930 if (CRTC_CRT_ON & tmp)
933 return put_user(value, (__u32 __user *)arg);
942 int radeon_screen_blank(struct radeonfb_info *rinfo, int blank, int mode_switch)
948 if (rinfo->lock_blank)
951 radeon_engine_idle();
953 val = INREG(CRTC_EXT_CNTL);
954 val &= ~(CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS |
957 case FB_BLANK_VSYNC_SUSPEND:
958 val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS);
960 case FB_BLANK_HSYNC_SUSPEND:
961 val |= (CRTC_DISPLAY_DIS | CRTC_HSYNC_DIS);
963 case FB_BLANK_POWERDOWN:
964 val |= (CRTC_DISPLAY_DIS | CRTC_VSYNC_DIS |
967 case FB_BLANK_NORMAL:
968 val |= CRTC_DISPLAY_DIS;
970 case FB_BLANK_UNBLANK:
974 OUTREG(CRTC_EXT_CNTL, val);
977 switch (rinfo->mon1_type) {
980 OUTREGP(FP_GEN_CNTL, (FP_FPON | FP_TMDS_EN),
981 ~(FP_FPON | FP_TMDS_EN));
983 if (mode_switch || blank == FB_BLANK_NORMAL)
985 OUTREGP(FP_GEN_CNTL, 0, ~(FP_FPON | FP_TMDS_EN));
989 del_timer_sync(&rinfo->lvds_timer);
990 val = INREG(LVDS_GEN_CNTL);
992 u32 target_val = (val & ~LVDS_DISPLAY_DIS) | LVDS_BLON | LVDS_ON
993 | LVDS_EN | (rinfo->init_state.lvds_gen_cntl
994 & (LVDS_DIGON | LVDS_BL_MOD_EN));
995 if ((val ^ target_val) == LVDS_DISPLAY_DIS)
996 OUTREG(LVDS_GEN_CNTL, target_val);
997 else if ((val ^ target_val) != 0) {
998 OUTREG(LVDS_GEN_CNTL, target_val
999 & ~(LVDS_ON | LVDS_BL_MOD_EN));
1000 rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
1001 rinfo->init_state.lvds_gen_cntl |=
1002 target_val & LVDS_STATE_MASK;
1004 radeon_msleep(rinfo->panel_info.pwr_delay);
1005 OUTREG(LVDS_GEN_CNTL, target_val);
1008 rinfo->pending_lvds_gen_cntl = target_val;
1009 mod_timer(&rinfo->lvds_timer,
1011 msecs_to_jiffies(rinfo->panel_info.pwr_delay));
1015 val |= LVDS_DISPLAY_DIS;
1016 OUTREG(LVDS_GEN_CNTL, val);
1018 /* We don't do a full switch-off on a simple mode switch */
1019 if (mode_switch || blank == FB_BLANK_NORMAL)
1022 /* Asic bug, when turning off LVDS_ON, we have to make sure
1023 * RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off
1025 tmp_pix_clks = INPLL(PIXCLKS_CNTL);
1026 if (rinfo->is_mobility || rinfo->is_IGP)
1027 OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb);
1028 val &= ~(LVDS_BL_MOD_EN);
1029 OUTREG(LVDS_GEN_CNTL, val);
1031 val &= ~(LVDS_ON | LVDS_EN);
1032 OUTREG(LVDS_GEN_CNTL, val);
1034 rinfo->pending_lvds_gen_cntl = val;
1035 mod_timer(&rinfo->lvds_timer,
1037 msecs_to_jiffies(rinfo->panel_info.pwr_delay));
1038 rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
1039 rinfo->init_state.lvds_gen_cntl |= val & LVDS_STATE_MASK;
1040 if (rinfo->is_mobility || rinfo->is_IGP)
1041 OUTPLL(PIXCLKS_CNTL, tmp_pix_clks);
1045 // todo: powerdown DAC
1050 /* let fbcon do a soft blank for us */
1051 return (blank == FB_BLANK_NORMAL) ? -EINVAL : 0;
1054 static int radeonfb_blank (int blank, struct fb_info *info)
1056 struct radeonfb_info *rinfo = info->par;
1061 return radeon_screen_blank(rinfo, blank, 0);
1064 static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green,
1065 unsigned blue, unsigned transp,
1066 struct radeonfb_info *rinfo)
1078 rinfo->palette[regno].red = red;
1079 rinfo->palette[regno].green = green;
1080 rinfo->palette[regno].blue = blue;
1085 if (!rinfo->asleep) {
1086 radeon_fifo_wait(9);
1088 if (rinfo->bpp == 16) {
1091 if (rinfo->depth == 16 && regno > 63)
1093 if (rinfo->depth == 15 && regno > 31)
1096 /* For 565, the green component is mixed one order
1099 if (rinfo->depth == 16) {
1100 OUTREG(PALETTE_INDEX, pindex>>1);
1101 OUTREG(PALETTE_DATA,
1102 (rinfo->palette[regno>>1].red << 16) |
1104 (rinfo->palette[regno>>1].blue));
1105 green = rinfo->palette[regno<<1].green;
1109 if (rinfo->depth != 16 || regno < 32) {
1110 OUTREG(PALETTE_INDEX, pindex);
1111 OUTREG(PALETTE_DATA, (red << 16) |
1112 (green << 8) | blue);
1116 u32 *pal = rinfo->info->pseudo_palette;
1117 switch (rinfo->depth) {
1119 pal[regno] = (regno << 10) | (regno << 5) | regno;
1122 pal[regno] = (regno << 11) | (regno << 5) | regno;
1125 pal[regno] = (regno << 16) | (regno << 8) | regno;
1128 i = (regno << 8) | regno;
1129 pal[regno] = (i << 16) | i;
1136 static int radeonfb_setcolreg (unsigned regno, unsigned red, unsigned green,
1137 unsigned blue, unsigned transp,
1138 struct fb_info *info)
1140 struct radeonfb_info *rinfo = info->par;
1141 u32 dac_cntl2, vclk_cntl = 0;
1144 if (!rinfo->asleep) {
1145 if (rinfo->is_mobility) {
1146 vclk_cntl = INPLL(VCLK_ECP_CNTL);
1147 OUTPLL(VCLK_ECP_CNTL,
1148 vclk_cntl & ~PIXCLK_DAC_ALWAYS_ONb);
1151 /* Make sure we are on first palette */
1152 if (rinfo->has_CRTC2) {
1153 dac_cntl2 = INREG(DAC_CNTL2);
1154 dac_cntl2 &= ~DAC2_PALETTE_ACCESS_CNTL;
1155 OUTREG(DAC_CNTL2, dac_cntl2);
1159 rc = radeon_setcolreg (regno, red, green, blue, transp, rinfo);
1161 if (!rinfo->asleep && rinfo->is_mobility)
1162 OUTPLL(VCLK_ECP_CNTL, vclk_cntl);
1167 static int radeonfb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
1169 struct radeonfb_info *rinfo = info->par;
1170 u16 *red, *green, *blue, *transp;
1171 u32 dac_cntl2, vclk_cntl = 0;
1172 int i, start, rc = 0;
1174 if (!rinfo->asleep) {
1175 if (rinfo->is_mobility) {
1176 vclk_cntl = INPLL(VCLK_ECP_CNTL);
1177 OUTPLL(VCLK_ECP_CNTL,
1178 vclk_cntl & ~PIXCLK_DAC_ALWAYS_ONb);
1181 /* Make sure we are on first palette */
1182 if (rinfo->has_CRTC2) {
1183 dac_cntl2 = INREG(DAC_CNTL2);
1184 dac_cntl2 &= ~DAC2_PALETTE_ACCESS_CNTL;
1185 OUTREG(DAC_CNTL2, dac_cntl2);
1190 green = cmap->green;
1192 transp = cmap->transp;
1193 start = cmap->start;
1195 for (i = 0; i < cmap->len; i++) {
1196 u_int hred, hgreen, hblue, htransp = 0xffff;
1202 htransp = *transp++;
1203 rc = radeon_setcolreg (start++, hred, hgreen, hblue, htransp,
1209 if (!rinfo->asleep && rinfo->is_mobility)
1210 OUTPLL(VCLK_ECP_CNTL, vclk_cntl);
1215 static void radeon_save_state (struct radeonfb_info *rinfo,
1216 struct radeon_regs *save)
1219 save->crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
1220 save->crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
1221 save->crtc_more_cntl = INREG(CRTC_MORE_CNTL);
1222 save->dac_cntl = INREG(DAC_CNTL);
1223 save->crtc_h_total_disp = INREG(CRTC_H_TOTAL_DISP);
1224 save->crtc_h_sync_strt_wid = INREG(CRTC_H_SYNC_STRT_WID);
1225 save->crtc_v_total_disp = INREG(CRTC_V_TOTAL_DISP);
1226 save->crtc_v_sync_strt_wid = INREG(CRTC_V_SYNC_STRT_WID);
1227 save->crtc_pitch = INREG(CRTC_PITCH);
1228 save->surface_cntl = INREG(SURFACE_CNTL);
1231 save->fp_crtc_h_total_disp = INREG(FP_CRTC_H_TOTAL_DISP);
1232 save->fp_crtc_v_total_disp = INREG(FP_CRTC_V_TOTAL_DISP);
1233 save->fp_gen_cntl = INREG(FP_GEN_CNTL);
1234 save->fp_h_sync_strt_wid = INREG(FP_H_SYNC_STRT_WID);
1235 save->fp_horz_stretch = INREG(FP_HORZ_STRETCH);
1236 save->fp_v_sync_strt_wid = INREG(FP_V_SYNC_STRT_WID);
1237 save->fp_vert_stretch = INREG(FP_VERT_STRETCH);
1238 save->lvds_gen_cntl = INREG(LVDS_GEN_CNTL);
1239 save->lvds_pll_cntl = INREG(LVDS_PLL_CNTL);
1240 save->tmds_crc = INREG(TMDS_CRC);
1241 save->tmds_transmitter_cntl = INREG(TMDS_TRANSMITTER_CNTL);
1242 save->vclk_ecp_cntl = INPLL(VCLK_ECP_CNTL);
1245 save->clk_cntl_index = INREG(CLOCK_CNTL_INDEX) & ~0x3f;
1246 radeon_pll_errata_after_index(rinfo);
1247 save->ppll_div_3 = INPLL(PPLL_DIV_3);
1248 save->ppll_ref_div = INPLL(PPLL_REF_DIV);
1252 static void radeon_write_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *mode)
1256 radeon_fifo_wait(20);
1258 /* Workaround from XFree */
1259 if (rinfo->is_mobility) {
1260 /* A temporal workaround for the occational blanking on certain laptop
1261 * panels. This appears to related to the PLL divider registers
1262 * (fail to lock?). It occurs even when all dividers are the same
1263 * with their old settings. In this case we really don't need to
1264 * fiddle with PLL registers. By doing this we can avoid the blanking
1265 * problem with some panels.
1267 if ((mode->ppll_ref_div == (INPLL(PPLL_REF_DIV) & PPLL_REF_DIV_MASK)) &&
1268 (mode->ppll_div_3 == (INPLL(PPLL_DIV_3) &
1269 (PPLL_POST3_DIV_MASK | PPLL_FB3_DIV_MASK)))) {
1270 /* We still have to force a switch to selected PPLL div thanks to
1271 * an XFree86 driver bug which will switch it away in some cases
1272 * even when using UseFDev */
1273 OUTREGP(CLOCK_CNTL_INDEX,
1274 mode->clk_cntl_index & PPLL_DIV_SEL_MASK,
1275 ~PPLL_DIV_SEL_MASK);
1276 radeon_pll_errata_after_index(rinfo);
1277 radeon_pll_errata_after_data(rinfo);
1282 /* Swich VCKL clock input to CPUCLK so it stays fed while PPLL updates*/
1283 OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_CPUCLK, ~VCLK_SRC_SEL_MASK);
1285 /* Reset PPLL & enable atomic update */
1287 PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN,
1288 ~(PPLL_RESET | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
1290 /* Switch to selected PPLL divider */
1291 OUTREGP(CLOCK_CNTL_INDEX,
1292 mode->clk_cntl_index & PPLL_DIV_SEL_MASK,
1293 ~PPLL_DIV_SEL_MASK);
1294 radeon_pll_errata_after_index(rinfo);
1295 radeon_pll_errata_after_data(rinfo);
1297 /* Set PPLL ref. div */
1298 if (rinfo->family == CHIP_FAMILY_R300 ||
1299 rinfo->family == CHIP_FAMILY_RS300 ||
1300 rinfo->family == CHIP_FAMILY_R350 ||
1301 rinfo->family == CHIP_FAMILY_RV350) {
1302 if (mode->ppll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
1303 /* When restoring console mode, use saved PPLL_REF_DIV
1306 OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, 0);
1308 /* R300 uses ref_div_acc field as real ref divider */
1309 OUTPLLP(PPLL_REF_DIV,
1310 (mode->ppll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
1311 ~R300_PPLL_REF_DIV_ACC_MASK);
1314 OUTPLLP(PPLL_REF_DIV, mode->ppll_ref_div, ~PPLL_REF_DIV_MASK);
1316 /* Set PPLL divider 3 & post divider*/
1317 OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_FB3_DIV_MASK);
1318 OUTPLLP(PPLL_DIV_3, mode->ppll_div_3, ~PPLL_POST3_DIV_MASK);
1321 while (INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R)
1323 OUTPLLP(PPLL_REF_DIV, PPLL_ATOMIC_UPDATE_W, ~PPLL_ATOMIC_UPDATE_W);
1325 /* Wait read update complete */
1326 /* FIXME: Certain revisions of R300 can't recover here. Not sure of
1327 the cause yet, but this workaround will mask the problem for now.
1328 Other chips usually will pass at the very first test, so the
1329 workaround shouldn't have any effect on them. */
1330 for (i = 0; (i < 10000 && INPLL(PPLL_REF_DIV) & PPLL_ATOMIC_UPDATE_R); i++)
1333 OUTPLL(HTOTAL_CNTL, 0);
1335 /* Clear reset & atomic update */
1336 OUTPLLP(PPLL_CNTL, 0,
1337 ~(PPLL_RESET | PPLL_SLEEP | PPLL_ATOMIC_UPDATE_EN | PPLL_VGA_ATOMIC_UPDATE_EN));
1339 /* We may want some locking ... oh well */
1342 /* Switch back VCLK source to PPLL */
1343 OUTPLLP(VCLK_ECP_CNTL, VCLK_SRC_SEL_PPLLCLK, ~VCLK_SRC_SEL_MASK);
1347 * Timer function for delayed LVDS panel power up/down
1349 static void radeon_lvds_timer_func(unsigned long data)
1351 struct radeonfb_info *rinfo = (struct radeonfb_info *)data;
1353 radeon_engine_idle();
1355 OUTREG(LVDS_GEN_CNTL, rinfo->pending_lvds_gen_cntl);
1359 * Apply a video mode. This will apply the whole register set, including
1360 * the PLL registers, to the card
1362 void radeon_write_mode (struct radeonfb_info *rinfo, struct radeon_regs *mode,
1366 int primary_mon = PRIMARY_MONITOR(rinfo);
1372 radeon_screen_blank(rinfo, FB_BLANK_NORMAL, 0);
1374 radeon_fifo_wait(31);
1375 for (i=0; i<10; i++)
1376 OUTREG(common_regs[i].reg, common_regs[i].val);
1378 /* Apply surface registers */
1379 for (i=0; i<8; i++) {
1380 OUTREG(SURFACE0_LOWER_BOUND + 0x10*i, mode->surf_lower_bound[i]);
1381 OUTREG(SURFACE0_UPPER_BOUND + 0x10*i, mode->surf_upper_bound[i]);
1382 OUTREG(SURFACE0_INFO + 0x10*i, mode->surf_info[i]);
1385 OUTREG(CRTC_GEN_CNTL, mode->crtc_gen_cntl);
1386 OUTREGP(CRTC_EXT_CNTL, mode->crtc_ext_cntl,
1387 ~(CRTC_HSYNC_DIS | CRTC_VSYNC_DIS | CRTC_DISPLAY_DIS));
1388 OUTREG(CRTC_MORE_CNTL, mode->crtc_more_cntl);
1389 OUTREGP(DAC_CNTL, mode->dac_cntl, DAC_RANGE_CNTL | DAC_BLANKING);
1390 OUTREG(CRTC_H_TOTAL_DISP, mode->crtc_h_total_disp);
1391 OUTREG(CRTC_H_SYNC_STRT_WID, mode->crtc_h_sync_strt_wid);
1392 OUTREG(CRTC_V_TOTAL_DISP, mode->crtc_v_total_disp);
1393 OUTREG(CRTC_V_SYNC_STRT_WID, mode->crtc_v_sync_strt_wid);
1394 OUTREG(CRTC_OFFSET, 0);
1395 OUTREG(CRTC_OFFSET_CNTL, 0);
1396 OUTREG(CRTC_PITCH, mode->crtc_pitch);
1397 OUTREG(SURFACE_CNTL, mode->surface_cntl);
1399 radeon_write_pll_regs(rinfo, mode);
1401 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1402 radeon_fifo_wait(10);
1403 OUTREG(FP_CRTC_H_TOTAL_DISP, mode->fp_crtc_h_total_disp);
1404 OUTREG(FP_CRTC_V_TOTAL_DISP, mode->fp_crtc_v_total_disp);
1405 OUTREG(FP_H_SYNC_STRT_WID, mode->fp_h_sync_strt_wid);
1406 OUTREG(FP_V_SYNC_STRT_WID, mode->fp_v_sync_strt_wid);
1407 OUTREG(FP_HORZ_STRETCH, mode->fp_horz_stretch);
1408 OUTREG(FP_VERT_STRETCH, mode->fp_vert_stretch);
1409 OUTREG(FP_GEN_CNTL, mode->fp_gen_cntl);
1410 OUTREG(TMDS_CRC, mode->tmds_crc);
1411 OUTREG(TMDS_TRANSMITTER_CNTL, mode->tmds_transmitter_cntl);
1415 radeon_screen_blank(rinfo, FB_BLANK_UNBLANK, 0);
1417 radeon_fifo_wait(2);
1418 OUTPLL(VCLK_ECP_CNTL, mode->vclk_ecp_cntl);
1424 * Calculate the PLL values for a given mode
1426 static void radeon_calc_pll_regs(struct radeonfb_info *rinfo, struct radeon_regs *regs,
1444 int fb_div, pll_output_freq = 0;
1447 /* Check if the DVO port is enabled and sourced from the primary CRTC. I'm
1448 * not sure which model starts having FP2_GEN_CNTL, I assume anything more
1449 * recent than an r(v)100...
1452 /* XXX I had reports of flicker happening with the cinema display
1453 * on TMDS1 that seem to be fixed if I also forbit odd dividers in
1454 * this case. This could just be a bandwidth calculation issue, I
1455 * haven't implemented the bandwidth code yet, but in the meantime,
1456 * forcing uses_dvo to 1 fixes it and shouln't have bad side effects,
1457 * I haven't seen a case were were absolutely needed an odd PLL
1458 * divider. I'll find a better fix once I have more infos on the
1459 * real cause of the problem.
1461 while (rinfo->has_CRTC2) {
1462 u32 fp2_gen_cntl = INREG(FP2_GEN_CNTL);
1463 u32 disp_output_cntl;
1466 /* FP2 path not enabled */
1467 if ((fp2_gen_cntl & FP2_ON) == 0)
1469 /* Not all chip revs have the same format for this register,
1470 * extract the source selection
1472 if (rinfo->family == CHIP_FAMILY_R200 ||
1473 rinfo->family == CHIP_FAMILY_R300 ||
1474 rinfo->family == CHIP_FAMILY_R350 ||
1475 rinfo->family == CHIP_FAMILY_RV350) {
1476 source = (fp2_gen_cntl >> 10) & 0x3;
1477 /* sourced from transform unit, check for transform unit
1481 disp_output_cntl = INREG(DISP_OUTPUT_CNTL);
1482 source = (disp_output_cntl >> 12) & 0x3;
1485 source = (fp2_gen_cntl >> 13) & 0x1;
1486 /* sourced from CRTC2 -> exit */
1490 /* so we end up on CRTC1, let's set uses_dvo to 1 now */
1497 if (freq > rinfo->pll.ppll_max)
1498 freq = rinfo->pll.ppll_max;
1499 if (freq*12 < rinfo->pll.ppll_min)
1500 freq = rinfo->pll.ppll_min / 12;
1501 RTRACE("freq = %lu, PLL min = %u, PLL max = %u\n",
1502 freq, rinfo->pll.ppll_min, rinfo->pll.ppll_max);
1504 for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
1505 pll_output_freq = post_div->divider * freq;
1506 /* If we output to the DVO port (external TMDS), we don't allow an
1507 * odd PLL divider as those aren't supported on this path
1509 if (uses_dvo && (post_div->divider & 1))
1511 if (pll_output_freq >= rinfo->pll.ppll_min &&
1512 pll_output_freq <= rinfo->pll.ppll_max)
1516 /* If we fall through the bottom, try the "default value"
1517 given by the terminal post_div->bitvalue */
1518 if ( !post_div->divider ) {
1519 post_div = &post_divs[post_div->bitvalue];
1520 pll_output_freq = post_div->divider * freq;
1522 RTRACE("ref_div = %d, ref_clk = %d, output_freq = %d\n",
1523 rinfo->pll.ref_div, rinfo->pll.ref_clk,
1526 /* If we fall through the bottom, try the "default value"
1527 given by the terminal post_div->bitvalue */
1528 if ( !post_div->divider ) {
1529 post_div = &post_divs[post_div->bitvalue];
1530 pll_output_freq = post_div->divider * freq;
1532 RTRACE("ref_div = %d, ref_clk = %d, output_freq = %d\n",
1533 rinfo->pll.ref_div, rinfo->pll.ref_clk,
1536 fb_div = round_div(rinfo->pll.ref_div*pll_output_freq,
1537 rinfo->pll.ref_clk);
1538 regs->ppll_ref_div = rinfo->pll.ref_div;
1539 regs->ppll_div_3 = fb_div | (post_div->bitvalue << 16);
1541 RTRACE("post div = 0x%x\n", post_div->bitvalue);
1542 RTRACE("fb_div = 0x%x\n", fb_div);
1543 RTRACE("ppll_div_3 = 0x%x\n", regs->ppll_div_3);
1546 static int radeonfb_set_par(struct fb_info *info)
1548 struct radeonfb_info *rinfo = info->par;
1549 struct fb_var_screeninfo *mode = &info->var;
1550 struct radeon_regs *newmode;
1551 int hTotal, vTotal, hSyncStart, hSyncEnd,
1552 hSyncPol, vSyncStart, vSyncEnd, vSyncPol, cSync;
1553 u8 hsync_adj_tab[] = {0, 0x12, 9, 9, 6, 5};
1554 u8 hsync_fudge_fp[] = {2, 2, 0, 0, 5, 5};
1555 u32 sync, h_sync_pol, v_sync_pol, dotClock, pixClock;
1559 int hsync_start, hsync_fudge, bytpp, hsync_wid, vsync_wid;
1560 int primary_mon = PRIMARY_MONITOR(rinfo);
1561 int depth = var_to_depth(mode);
1564 newmode = kmalloc(sizeof(struct radeon_regs), GFP_KERNEL);
1568 /* We always want engine to be idle on a mode switch, even
1569 * if we won't actually change the mode
1571 radeon_engine_idle();
1573 hSyncStart = mode->xres + mode->right_margin;
1574 hSyncEnd = hSyncStart + mode->hsync_len;
1575 hTotal = hSyncEnd + mode->left_margin;
1577 vSyncStart = mode->yres + mode->lower_margin;
1578 vSyncEnd = vSyncStart + mode->vsync_len;
1579 vTotal = vSyncEnd + mode->upper_margin;
1580 pixClock = mode->pixclock;
1583 h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
1584 v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
1586 if (primary_mon == MT_DFP || primary_mon == MT_LCD) {
1587 if (rinfo->panel_info.xres < mode->xres)
1588 mode->xres = rinfo->panel_info.xres;
1589 if (rinfo->panel_info.yres < mode->yres)
1590 mode->yres = rinfo->panel_info.yres;
1592 hTotal = mode->xres + rinfo->panel_info.hblank;
1593 hSyncStart = mode->xres + rinfo->panel_info.hOver_plus;
1594 hSyncEnd = hSyncStart + rinfo->panel_info.hSync_width;
1596 vTotal = mode->yres + rinfo->panel_info.vblank;
1597 vSyncStart = mode->yres + rinfo->panel_info.vOver_plus;
1598 vSyncEnd = vSyncStart + rinfo->panel_info.vSync_width;
1600 h_sync_pol = !rinfo->panel_info.hAct_high;
1601 v_sync_pol = !rinfo->panel_info.vAct_high;
1603 pixClock = 100000000 / rinfo->panel_info.clock;
1605 if (rinfo->panel_info.use_bios_dividers) {
1607 newmode->ppll_div_3 = rinfo->panel_info.fbk_divider |
1608 (rinfo->panel_info.post_divider << 16);
1609 newmode->ppll_ref_div = rinfo->panel_info.ref_divider;
1612 dotClock = 1000000000 / pixClock;
1613 freq = dotClock / 10; /* x100 */
1615 RTRACE("hStart = %d, hEnd = %d, hTotal = %d\n",
1616 hSyncStart, hSyncEnd, hTotal);
1617 RTRACE("vStart = %d, vEnd = %d, vTotal = %d\n",
1618 vSyncStart, vSyncEnd, vTotal);
1620 hsync_wid = (hSyncEnd - hSyncStart) / 8;
1621 vsync_wid = vSyncEnd - vSyncStart;
1624 else if (hsync_wid > 0x3f) /* max */
1629 else if (vsync_wid > 0x1f) /* max */
1632 hSyncPol = mode->sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
1633 vSyncPol = mode->sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
1635 cSync = mode->sync & FB_SYNC_COMP_HIGH_ACT ? (1 << 4) : 0;
1637 format = radeon_get_dstbpp(depth);
1638 bytpp = mode->bits_per_pixel >> 3;
1640 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD))
1641 hsync_fudge = hsync_fudge_fp[format-1];
1643 hsync_fudge = hsync_adj_tab[format-1];
1645 hsync_start = hSyncStart - 8 + hsync_fudge;
1647 newmode->crtc_gen_cntl = CRTC_EXT_DISP_EN | CRTC_EN |
1650 /* Clear auto-center etc... */
1651 newmode->crtc_more_cntl = rinfo->init_state.crtc_more_cntl;
1652 newmode->crtc_more_cntl &= 0xfffffff0;
1654 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1655 newmode->crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN;
1657 newmode->crtc_ext_cntl |= CRTC_CRT_ON;
1659 newmode->crtc_gen_cntl &= ~(CRTC_DBL_SCAN_EN |
1662 newmode->crtc_ext_cntl = VGA_ATI_LINEAR | XCRT_CNT_EN |
1666 newmode->dac_cntl = /* INREG(DAC_CNTL) | */ DAC_MASK_ALL | DAC_VGA_ADR_EN |
1669 newmode->crtc_h_total_disp = ((((hTotal / 8) - 1) & 0x3ff) |
1670 (((mode->xres / 8) - 1) << 16));
1672 newmode->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) |
1673 (hsync_wid << 16) | (h_sync_pol << 23));
1675 newmode->crtc_v_total_disp = ((vTotal - 1) & 0xffff) |
1676 ((mode->yres - 1) << 16);
1678 newmode->crtc_v_sync_strt_wid = (((vSyncStart - 1) & 0xfff) |
1679 (vsync_wid << 16) | (v_sync_pol << 23));
1681 if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
1682 /* We first calculate the engine pitch */
1683 rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
1686 /* Then, re-multiply it to get the CRTC pitch */
1687 newmode->crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
1689 newmode->crtc_pitch = (mode->xres_virtual >> 3);
1691 newmode->crtc_pitch |= (newmode->crtc_pitch << 16);
1694 * It looks like recent chips have a problem with SURFACE_CNTL,
1695 * setting SURF_TRANSLATION_DIS completely disables the
1696 * swapper as well, so we leave it unset now.
1698 newmode->surface_cntl = 0;
1700 #if defined(__BIG_ENDIAN)
1702 /* Setup swapping on both apertures, though we currently
1703 * only use aperture 0, enabling swapper on aperture 1
1706 switch (mode->bits_per_pixel) {
1708 newmode->surface_cntl |= NONSURF_AP0_SWP_16BPP;
1709 newmode->surface_cntl |= NONSURF_AP1_SWP_16BPP;
1713 newmode->surface_cntl |= NONSURF_AP0_SWP_32BPP;
1714 newmode->surface_cntl |= NONSURF_AP1_SWP_32BPP;
1719 /* Clear surface registers */
1720 for (i=0; i<8; i++) {
1721 newmode->surf_lower_bound[i] = 0;
1722 newmode->surf_upper_bound[i] = 0x1f;
1723 newmode->surf_info[i] = 0;
1726 RTRACE("h_total_disp = 0x%x\t hsync_strt_wid = 0x%x\n",
1727 newmode->crtc_h_total_disp, newmode->crtc_h_sync_strt_wid);
1728 RTRACE("v_total_disp = 0x%x\t vsync_strt_wid = 0x%x\n",
1729 newmode->crtc_v_total_disp, newmode->crtc_v_sync_strt_wid);
1731 rinfo->bpp = mode->bits_per_pixel;
1732 rinfo->depth = depth;
1734 RTRACE("pixclock = %lu\n", (unsigned long)pixClock);
1735 RTRACE("freq = %lu\n", (unsigned long)freq);
1737 /* We use PPLL_DIV_3 */
1738 newmode->clk_cntl_index = 0x300;
1740 /* Calculate PPLL value if necessary */
1742 radeon_calc_pll_regs(rinfo, newmode, freq);
1744 newmode->vclk_ecp_cntl = rinfo->init_state.vclk_ecp_cntl;
1746 if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD)) {
1747 unsigned int hRatio, vRatio;
1749 if (mode->xres > rinfo->panel_info.xres)
1750 mode->xres = rinfo->panel_info.xres;
1751 if (mode->yres > rinfo->panel_info.yres)
1752 mode->yres = rinfo->panel_info.yres;
1754 newmode->fp_horz_stretch = (((rinfo->panel_info.xres / 8) - 1)
1755 << HORZ_PANEL_SHIFT);
1756 newmode->fp_vert_stretch = ((rinfo->panel_info.yres - 1)
1757 << VERT_PANEL_SHIFT);
1759 if (mode->xres != rinfo->panel_info.xres) {
1760 hRatio = round_div(mode->xres * HORZ_STRETCH_RATIO_MAX,
1761 rinfo->panel_info.xres);
1762 newmode->fp_horz_stretch = (((((unsigned long)hRatio) & HORZ_STRETCH_RATIO_MASK)) |
1763 (newmode->fp_horz_stretch &
1764 (HORZ_PANEL_SIZE | HORZ_FP_LOOP_STRETCH |
1765 HORZ_AUTO_RATIO_INC)));
1766 newmode->fp_horz_stretch |= (HORZ_STRETCH_BLEND |
1767 HORZ_STRETCH_ENABLE);
1770 newmode->fp_horz_stretch &= ~HORZ_AUTO_RATIO;
1772 if (mode->yres != rinfo->panel_info.yres) {
1773 vRatio = round_div(mode->yres * VERT_STRETCH_RATIO_MAX,
1774 rinfo->panel_info.yres);
1775 newmode->fp_vert_stretch = (((((unsigned long)vRatio) & VERT_STRETCH_RATIO_MASK)) |
1776 (newmode->fp_vert_stretch &
1777 (VERT_PANEL_SIZE | VERT_STRETCH_RESERVED)));
1778 newmode->fp_vert_stretch |= (VERT_STRETCH_BLEND |
1779 VERT_STRETCH_ENABLE);
1782 newmode->fp_vert_stretch &= ~VERT_AUTO_RATIO_EN;
1784 newmode->fp_gen_cntl = (rinfo->init_state.fp_gen_cntl & (u32)
1786 FP_RMX_HVSYNC_CONTROL_EN |
1791 FP_CRTC_USE_SHADOW_VEND |
1794 newmode->fp_gen_cntl |= (FP_CRTC_DONT_SHADOW_VPAR |
1795 FP_CRTC_DONT_SHADOW_HEND |
1798 if (IS_R300_VARIANT(rinfo) ||
1799 (rinfo->family == CHIP_FAMILY_R200)) {
1800 newmode->fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK;
1802 newmode->fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX;
1804 newmode->fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1;
1806 newmode->fp_gen_cntl |= FP_SEL_CRTC1;
1808 newmode->lvds_gen_cntl = rinfo->init_state.lvds_gen_cntl;
1809 newmode->lvds_pll_cntl = rinfo->init_state.lvds_pll_cntl;
1810 newmode->tmds_crc = rinfo->init_state.tmds_crc;
1811 newmode->tmds_transmitter_cntl = rinfo->init_state.tmds_transmitter_cntl;
1813 if (primary_mon == MT_LCD) {
1814 newmode->lvds_gen_cntl |= (LVDS_ON | LVDS_BLON);
1815 newmode->fp_gen_cntl &= ~(FP_FPON | FP_TMDS_EN);
1818 newmode->fp_gen_cntl |= (FP_FPON | FP_TMDS_EN);
1819 newmode->tmds_transmitter_cntl &= ~(TMDS_PLLRST);
1820 /* TMDS_PLL_EN bit is reversed on RV (and mobility) chips */
1821 if (IS_R300_VARIANT(rinfo) ||
1822 (rinfo->family == CHIP_FAMILY_R200) || !rinfo->has_CRTC2)
1823 newmode->tmds_transmitter_cntl &= ~TMDS_PLL_EN;
1825 newmode->tmds_transmitter_cntl |= TMDS_PLL_EN;
1826 newmode->crtc_ext_cntl &= ~CRTC_CRT_ON;
1829 newmode->fp_crtc_h_total_disp = (((rinfo->panel_info.hblank / 8) & 0x3ff) |
1830 (((mode->xres / 8) - 1) << 16));
1831 newmode->fp_crtc_v_total_disp = (rinfo->panel_info.vblank & 0xffff) |
1832 ((mode->yres - 1) << 16);
1833 newmode->fp_h_sync_strt_wid = ((rinfo->panel_info.hOver_plus & 0x1fff) |
1834 (hsync_wid << 16) | (h_sync_pol << 23));
1835 newmode->fp_v_sync_strt_wid = ((rinfo->panel_info.vOver_plus & 0xfff) |
1836 (vsync_wid << 16) | (v_sync_pol << 23));
1840 if (!rinfo->asleep) {
1841 memcpy(&rinfo->state, newmode, sizeof(*newmode));
1842 radeon_write_mode (rinfo, newmode, 0);
1843 /* (re)initialize the engine */
1844 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1845 radeonfb_engine_init (rinfo);
1848 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1849 info->fix.line_length = rinfo->pitch*64;
1851 info->fix.line_length = mode->xres_virtual
1852 * ((mode->bits_per_pixel + 1) / 8);
1853 info->fix.visual = rinfo->depth == 8 ? FB_VISUAL_PSEUDOCOLOR
1854 : FB_VISUAL_DIRECTCOLOR;
1856 #ifdef CONFIG_BOOTX_TEXT
1857 /* Update debug text engine */
1858 btext_update_display(rinfo->fb_base_phys, mode->xres, mode->yres,
1859 rinfo->depth, info->fix.line_length);
1867 static struct fb_ops radeonfb_ops = {
1868 .owner = THIS_MODULE,
1869 .fb_check_var = radeonfb_check_var,
1870 .fb_set_par = radeonfb_set_par,
1871 .fb_setcolreg = radeonfb_setcolreg,
1872 .fb_setcmap = radeonfb_setcmap,
1873 .fb_pan_display = radeonfb_pan_display,
1874 .fb_blank = radeonfb_blank,
1875 .fb_ioctl = radeonfb_ioctl,
1876 .fb_sync = radeonfb_sync,
1877 .fb_fillrect = radeonfb_fillrect,
1878 .fb_copyarea = radeonfb_copyarea,
1879 .fb_imageblit = radeonfb_imageblit,
1883 static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo)
1885 struct fb_info *info = rinfo->info;
1888 info->pseudo_palette = rinfo->pseudo_palette;
1889 info->flags = FBINFO_DEFAULT
1890 | FBINFO_HWACCEL_COPYAREA
1891 | FBINFO_HWACCEL_FILLRECT
1892 | FBINFO_HWACCEL_XPAN
1893 | FBINFO_HWACCEL_YPAN;
1894 info->fbops = &radeonfb_ops;
1895 info->screen_base = rinfo->fb_base;
1896 info->screen_size = rinfo->mapped_vram;
1897 /* Fill fix common fields */
1898 strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id));
1899 info->fix.smem_start = rinfo->fb_base_phys;
1900 info->fix.smem_len = rinfo->video_ram;
1901 info->fix.type = FB_TYPE_PACKED_PIXELS;
1902 info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
1903 info->fix.xpanstep = 8;
1904 info->fix.ypanstep = 1;
1905 info->fix.ywrapstep = 0;
1906 info->fix.type_aux = 0;
1907 info->fix.mmio_start = rinfo->mmio_base_phys;
1908 info->fix.mmio_len = RADEON_REGSIZE;
1909 info->fix.accel = FB_ACCEL_ATI_RADEON;
1911 fb_alloc_cmap(&info->cmap, 256, 0);
1914 info->flags |= FBINFO_HWACCEL_DISABLED;
1920 #ifdef CONFIG_PMAC_BACKLIGHT
1922 /* TODO: Dbl check these tables, we don't go up to full ON backlight
1923 * in these, possibly because we noticed MacOS doesn't, but I'd prefer
1924 * having some more official numbers from ATI
1926 static int backlight_conv_m6[] = {
1927 0xff, 0xc0, 0xb5, 0xaa, 0x9f, 0x94, 0x89, 0x7e,
1928 0x73, 0x68, 0x5d, 0x52, 0x47, 0x3c, 0x31, 0x24
1930 static int backlight_conv_m7[] = {
1931 0x00, 0x3f, 0x4a, 0x55, 0x60, 0x6b, 0x76, 0x81,
1932 0x8c, 0x97, 0xa2, 0xad, 0xb8, 0xc3, 0xce, 0xd9
1935 #define BACKLIGHT_LVDS_OFF
1936 #undef BACKLIGHT_DAC_OFF
1938 /* We turn off the LCD completely instead of just dimming the backlight.
1939 * This provides some greater power saving and the display is useless
1940 * without backlight anyway.
1942 static int radeon_set_backlight_enable(int on, int level, void *data)
1944 struct radeonfb_info *rinfo = (struct radeonfb_info *)data;
1945 u32 lvds_gen_cntl, tmpPixclksCntl;
1948 if (rinfo->mon1_type != MT_LCD)
1951 /* Pardon me for that hack... maybe some day we can figure
1952 * out in what direction backlight should work on a given
1955 if ((rinfo->family == CHIP_FAMILY_RV200 ||
1956 rinfo->family == CHIP_FAMILY_RV250 ||
1957 rinfo->family == CHIP_FAMILY_RV280 ||
1958 rinfo->family == CHIP_FAMILY_RV350) &&
1959 !machine_is_compatible("PowerBook4,3") &&
1960 !machine_is_compatible("PowerBook6,3") &&
1961 !machine_is_compatible("PowerBook6,5"))
1962 conv_table = backlight_conv_m7;
1964 conv_table = backlight_conv_m6;
1966 del_timer_sync(&rinfo->lvds_timer);
1967 radeon_engine_idle();
1969 lvds_gen_cntl = INREG(LVDS_GEN_CNTL);
1970 if (on && (level > BACKLIGHT_OFF)) {
1971 lvds_gen_cntl &= ~LVDS_DISPLAY_DIS;
1972 if (!(lvds_gen_cntl & LVDS_BLON) || !(lvds_gen_cntl & LVDS_ON)) {
1973 lvds_gen_cntl |= (rinfo->init_state.lvds_gen_cntl & LVDS_DIGON);
1974 lvds_gen_cntl |= LVDS_BLON | LVDS_EN;
1975 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1976 lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK;
1977 lvds_gen_cntl |= (conv_table[level] <<
1978 LVDS_BL_MOD_LEVEL_SHIFT);
1979 lvds_gen_cntl |= LVDS_ON;
1980 lvds_gen_cntl |= (rinfo->init_state.lvds_gen_cntl & LVDS_BL_MOD_EN);
1981 rinfo->pending_lvds_gen_cntl = lvds_gen_cntl;
1982 mod_timer(&rinfo->lvds_timer,
1983 jiffies + msecs_to_jiffies(rinfo->panel_info.pwr_delay));
1985 lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK;
1986 lvds_gen_cntl |= (conv_table[level] <<
1987 LVDS_BL_MOD_LEVEL_SHIFT);
1988 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
1990 rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
1991 rinfo->init_state.lvds_gen_cntl |= rinfo->pending_lvds_gen_cntl
1994 /* Asic bug, when turning off LVDS_ON, we have to make sure
1995 RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off
1997 tmpPixclksCntl = INPLL(PIXCLKS_CNTL);
1998 if (rinfo->is_mobility || rinfo->is_IGP)
1999 OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb);
2000 lvds_gen_cntl &= ~(LVDS_BL_MOD_LEVEL_MASK | LVDS_BL_MOD_EN);
2001 lvds_gen_cntl |= (conv_table[0] <<
2002 LVDS_BL_MOD_LEVEL_SHIFT);
2003 lvds_gen_cntl |= LVDS_DISPLAY_DIS;
2004 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
2006 lvds_gen_cntl &= ~(LVDS_ON | LVDS_EN);
2007 OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl);
2008 lvds_gen_cntl &= ~(LVDS_DIGON);
2009 rinfo->pending_lvds_gen_cntl = lvds_gen_cntl;
2010 mod_timer(&rinfo->lvds_timer,
2011 jiffies + msecs_to_jiffies(rinfo->panel_info.pwr_delay));
2012 if (rinfo->is_mobility || rinfo->is_IGP)
2013 OUTPLL(PIXCLKS_CNTL, tmpPixclksCntl);
2015 rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK;
2016 rinfo->init_state.lvds_gen_cntl |= (lvds_gen_cntl & LVDS_STATE_MASK);
2022 static int radeon_set_backlight_level(int level, void *data)
2024 return radeon_set_backlight_enable(1, level, data);
2026 #endif /* CONFIG_PMAC_BACKLIGHT */
2030 * This reconfigure the card's internal memory map. In theory, we'd like
2031 * to setup the card's memory at the same address as it's PCI bus address,
2032 * and the AGP aperture right after that so that system RAM on 32 bits
2033 * machines at least, is directly accessible. However, doing so would
2034 * conflict with the current XFree drivers...
2035 * Ultimately, I hope XFree, GATOS and ATI binary drivers will all agree
2036 * on the proper way to set this up and duplicate this here. In the meantime,
2037 * I put the card's memory at 0 in card space and AGP at some random high
2038 * local (0xe0000000 for now) that will be changed by XFree/DRI anyway
2040 #ifdef CONFIG_PPC_OF
2041 #undef SET_MC_FB_FROM_APERTURE
2042 static void fixup_memory_mappings(struct radeonfb_info *rinfo)
2044 u32 save_crtc_gen_cntl, save_crtc2_gen_cntl = 0;
2045 u32 save_crtc_ext_cntl;
2046 u32 aper_base, aper_size;
2049 /* First, we disable display to avoid interfering */
2050 if (rinfo->has_CRTC2) {
2051 save_crtc2_gen_cntl = INREG(CRTC2_GEN_CNTL);
2052 OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl | CRTC2_DISP_REQ_EN_B);
2054 save_crtc_gen_cntl = INREG(CRTC_GEN_CNTL);
2055 save_crtc_ext_cntl = INREG(CRTC_EXT_CNTL);
2057 OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl | CRTC_DISPLAY_DIS);
2058 OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B);
2061 aper_base = INREG(CONFIG_APER_0_BASE);
2062 aper_size = INREG(CONFIG_APER_SIZE);
2064 #ifdef SET_MC_FB_FROM_APERTURE
2065 /* Set framebuffer to be at the same address as set in PCI BAR */
2066 OUTREG(MC_FB_LOCATION,
2067 ((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16));
2068 rinfo->fb_local_base = aper_base;
2070 OUTREG(MC_FB_LOCATION, 0x7fff0000);
2071 rinfo->fb_local_base = 0;
2073 agp_base = aper_base + aper_size;
2074 if (agp_base & 0xf0000000)
2075 agp_base = (aper_base | 0x0fffffff) + 1;
2077 /* Set AGP to be just after the framebuffer on a 256Mb boundary. This
2078 * assumes the FB isn't mapped to 0xf0000000 or above, but this is
2079 * always the case on PPCs afaik.
2081 #ifdef SET_MC_FB_FROM_APERTURE
2082 OUTREG(MC_AGP_LOCATION, 0xffff0000 | (agp_base >> 16));
2084 OUTREG(MC_AGP_LOCATION, 0xffffe000);
2087 /* Fixup the display base addresses & engine offsets while we
2090 #ifdef SET_MC_FB_FROM_APERTURE
2091 OUTREG(DISPLAY_BASE_ADDR, aper_base);
2092 if (rinfo->has_CRTC2)
2093 OUTREG(CRTC2_DISPLAY_BASE_ADDR, aper_base);
2094 OUTREG(OV0_BASE_ADDR, aper_base);
2096 OUTREG(DISPLAY_BASE_ADDR, 0);
2097 if (rinfo->has_CRTC2)
2098 OUTREG(CRTC2_DISPLAY_BASE_ADDR, 0);
2099 OUTREG(OV0_BASE_ADDR, 0);
2103 /* Restore display settings */
2104 OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl);
2105 OUTREG(CRTC_EXT_CNTL, save_crtc_ext_cntl);
2106 if (rinfo->has_CRTC2)
2107 OUTREG(CRTC2_GEN_CNTL, save_crtc2_gen_cntl);
2109 RTRACE("aper_base: %08x MC_FB_LOC to: %08x, MC_AGP_LOC to: %08x\n",
2111 ((aper_base + aper_size - 1) & 0xffff0000) | (aper_base >> 16),
2112 0xffff0000 | (agp_base >> 16));
2114 #endif /* CONFIG_PPC_OF */
2117 static void radeon_identify_vram(struct radeonfb_info *rinfo)
2121 /* framebuffer size */
2122 if ((rinfo->family == CHIP_FAMILY_RS100) ||
2123 (rinfo->family == CHIP_FAMILY_RS200) ||
2124 (rinfo->family == CHIP_FAMILY_RS300)) {
2125 u32 tom = INREG(NB_TOM);
2126 tmp = ((((tom >> 16) - (tom & 0xffff) + 1) << 6) * 1024);
2128 radeon_fifo_wait(6);
2129 OUTREG(MC_FB_LOCATION, tom);
2130 OUTREG(DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
2131 OUTREG(CRTC2_DISPLAY_BASE_ADDR, (tom & 0xffff) << 16);
2132 OUTREG(OV0_BASE_ADDR, (tom & 0xffff) << 16);
2134 /* This is supposed to fix the crtc2 noise problem. */
2135 OUTREG(GRPH2_BUFFER_CNTL, INREG(GRPH2_BUFFER_CNTL) & ~0x7f0000);
2137 if ((rinfo->family == CHIP_FAMILY_RS100) ||
2138 (rinfo->family == CHIP_FAMILY_RS200)) {
2139 /* This is to workaround the asic bug for RMX, some versions
2140 of BIOS dosen't have this register initialized correctly.
2142 OUTREGP(CRTC_MORE_CNTL, CRTC_H_CUTOFF_ACTIVE_EN,
2143 ~CRTC_H_CUTOFF_ACTIVE_EN);
2146 tmp = INREG(CONFIG_MEMSIZE);
2149 /* mem size is bits [28:0], mask off the rest */
2150 rinfo->video_ram = tmp & CONFIG_MEMSIZE_MASK;
2153 * Hack to get around some busted production M6's
2156 if (rinfo->video_ram == 0) {
2157 switch (rinfo->pdev->device) {
2158 case PCI_CHIP_RADEON_LY:
2159 case PCI_CHIP_RADEON_LZ:
2160 rinfo->video_ram = 8192 * 1024;
2169 * Now try to identify VRAM type
2171 if (rinfo->is_IGP || (rinfo->family >= CHIP_FAMILY_R300) ||
2172 (INREG(MEM_SDRAM_MODE_REG) & (1<<30)))
2173 rinfo->vram_ddr = 1;
2175 rinfo->vram_ddr = 0;
2177 tmp = INREG(MEM_CNTL);
2178 if (IS_R300_VARIANT(rinfo)) {
2179 tmp &= R300_MEM_NUM_CHANNELS_MASK;
2181 case 0: rinfo->vram_width = 64; break;
2182 case 1: rinfo->vram_width = 128; break;
2183 case 2: rinfo->vram_width = 256; break;
2184 default: rinfo->vram_width = 128; break;
2186 } else if ((rinfo->family == CHIP_FAMILY_RV100) ||
2187 (rinfo->family == CHIP_FAMILY_RS100) ||
2188 (rinfo->family == CHIP_FAMILY_RS200)){
2189 if (tmp & RV100_MEM_HALF_MODE)
2190 rinfo->vram_width = 32;
2192 rinfo->vram_width = 64;
2194 if (tmp & MEM_NUM_CHANNELS_MASK)
2195 rinfo->vram_width = 128;
2197 rinfo->vram_width = 64;
2200 /* This may not be correct, as some cards can have half of channel disabled
2201 * ToDo: identify these cases
2204 RTRACE("radeonfb (%s): Found %ldk of %s %d bits wide videoram\n",
2205 pci_name(rinfo->pdev),
2206 rinfo->video_ram / 1024,
2207 rinfo->vram_ddr ? "DDR" : "SDRAM",
2215 static ssize_t radeon_show_one_edid(char *buf, loff_t off, size_t count, const u8 *edid)
2217 if (off > EDID_LENGTH)
2220 if (off + count > EDID_LENGTH)
2221 count = EDID_LENGTH - off;
2223 memcpy(buf, edid + off, count);
2229 static ssize_t radeon_show_edid1(struct kobject *kobj, char *buf, loff_t off, size_t count)
2231 struct device *dev = container_of(kobj, struct device, kobj);
2232 struct pci_dev *pdev = to_pci_dev(dev);
2233 struct fb_info *info = pci_get_drvdata(pdev);
2234 struct radeonfb_info *rinfo = info->par;
2236 return radeon_show_one_edid(buf, off, count, rinfo->mon1_EDID);
2240 static ssize_t radeon_show_edid2(struct kobject *kobj, char *buf, loff_t off, size_t count)
2242 struct device *dev = container_of(kobj, struct device, kobj);
2243 struct pci_dev *pdev = to_pci_dev(dev);
2244 struct fb_info *info = pci_get_drvdata(pdev);
2245 struct radeonfb_info *rinfo = info->par;
2247 return radeon_show_one_edid(buf, off, count, rinfo->mon2_EDID);
2250 static struct bin_attribute edid1_attr = {
2253 .owner = THIS_MODULE,
2256 .size = EDID_LENGTH,
2257 .read = radeon_show_edid1,
2260 static struct bin_attribute edid2_attr = {
2263 .owner = THIS_MODULE,
2266 .size = EDID_LENGTH,
2267 .read = radeon_show_edid2,
2271 static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
2272 const struct pci_device_id *ent)
2274 struct fb_info *info;
2275 struct radeonfb_info *rinfo;
2278 RTRACE("radeonfb_pci_register BEGIN\n");
2280 /* Enable device in PCI config */
2281 ret = pci_enable_device(pdev);
2283 printk(KERN_ERR "radeonfb (%s): Cannot enable PCI device\n",
2288 info = framebuffer_alloc(sizeof(struct radeonfb_info), &pdev->dev);
2290 printk (KERN_ERR "radeonfb (%s): could not allocate memory\n",
2299 spin_lock_init(&rinfo->reg_lock);
2300 init_timer(&rinfo->lvds_timer);
2301 rinfo->lvds_timer.function = radeon_lvds_timer_func;
2302 rinfo->lvds_timer.data = (unsigned long)rinfo;
2304 strcpy(rinfo->name, "ATI Radeon XX ");
2305 rinfo->name[11] = ent->device >> 8;
2306 rinfo->name[12] = ent->device & 0xFF;
2307 rinfo->family = ent->driver_data & CHIP_FAMILY_MASK;
2308 rinfo->chipset = pdev->device;
2309 rinfo->has_CRTC2 = (ent->driver_data & CHIP_HAS_CRTC2) != 0;
2310 rinfo->is_mobility = (ent->driver_data & CHIP_IS_MOBILITY) != 0;
2311 rinfo->is_IGP = (ent->driver_data & CHIP_IS_IGP) != 0;
2313 /* Set base addrs */
2314 rinfo->fb_base_phys = pci_resource_start (pdev, 0);
2315 rinfo->mmio_base_phys = pci_resource_start (pdev, 2);
2317 /* request the mem regions */
2318 ret = pci_request_region(pdev, 0, "radeonfb framebuffer");
2320 printk( KERN_ERR "radeonfb (%s): cannot request region 0.\n",
2321 pci_name(rinfo->pdev));
2322 goto err_release_fb;
2325 ret = pci_request_region(pdev, 2, "radeonfb mmio");
2327 printk( KERN_ERR "radeonfb (%s): cannot request region 2.\n",
2328 pci_name(rinfo->pdev));
2329 goto err_release_pci0;
2332 /* map the regions */
2333 rinfo->mmio_base = ioremap(rinfo->mmio_base_phys, RADEON_REGSIZE);
2334 if (!rinfo->mmio_base) {
2335 printk(KERN_ERR "radeonfb (%s): cannot map MMIO\n",
2336 pci_name(rinfo->pdev));
2338 goto err_release_pci2;
2341 rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16;
2347 if (rinfo->family == CHIP_FAMILY_R300 &&
2348 (INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK)
2350 rinfo->errata |= CHIP_ERRATA_R300_CG;
2352 if (rinfo->family == CHIP_FAMILY_RV200 ||
2353 rinfo->family == CHIP_FAMILY_RS200)
2354 rinfo->errata |= CHIP_ERRATA_PLL_DUMMYREADS;
2356 if (rinfo->family == CHIP_FAMILY_RV100 ||
2357 rinfo->family == CHIP_FAMILY_RS100 ||
2358 rinfo->family == CHIP_FAMILY_RS200)
2359 rinfo->errata |= CHIP_ERRATA_PLL_DELAY;
2361 #ifdef CONFIG_PPC_OF
2362 /* On PPC, we obtain the OF device-node pointer to the firmware
2363 * data for this chip
2365 rinfo->of_node = pci_device_to_OF_node(pdev);
2366 if (rinfo->of_node == NULL)
2367 printk(KERN_WARNING "radeonfb (%s): Cannot match card to OF node !\n",
2368 pci_name(rinfo->pdev));
2370 /* On PPC, the firmware sets up a memory mapping that tends
2371 * to cause lockups when enabling the engine. We reconfigure
2372 * the card internal memory mappings properly
2374 fixup_memory_mappings(rinfo);
2375 #endif /* CONFIG_PPC_OF */
2377 /* Get VRAM size and type */
2378 radeon_identify_vram(rinfo);
2380 rinfo->mapped_vram = min_t(unsigned long, MAX_MAPPED_VRAM, rinfo->video_ram);
2383 rinfo->fb_base = ioremap (rinfo->fb_base_phys,
2384 rinfo->mapped_vram);
2385 } while ( rinfo->fb_base == 0 &&
2386 ((rinfo->mapped_vram /=2) >= MIN_MAPPED_VRAM) );
2388 if (rinfo->fb_base == NULL) {
2389 printk (KERN_ERR "radeonfb (%s): cannot map FB\n",
2390 pci_name(rinfo->pdev));
2395 RTRACE("radeonfb (%s): mapped %ldk videoram\n", pci_name(rinfo->pdev),
2396 rinfo->mapped_vram/1024);
2399 * Map the BIOS ROM if any and retrieve PLL parameters from
2400 * the BIOS. We skip that on mobility chips as the real panel
2401 * values we need aren't in the ROM but in the BIOS image in
2402 * memory. This is definitely not the best meacnism though,
2403 * we really need the arch code to tell us which is the "primary"
2404 * video adapter to use the memory image (or better, the arch
2405 * should provide us a copy of the BIOS image to shield us from
2406 * archs who would store that elsewhere and/or could initialize
2407 * more than one adapter during boot).
2409 if (!rinfo->is_mobility)
2410 radeon_map_ROM(rinfo, pdev);
2413 * On x86, the primary display on laptop may have it's BIOS
2414 * ROM elsewhere, try to locate it at the legacy memory hole.
2415 * We probably need to make sure this is the primary display,
2416 * but that is difficult without some arch support.
2419 if (rinfo->bios_seg == NULL)
2420 radeon_find_mem_vbios(rinfo);
2423 /* If both above failed, try the BIOS ROM again for mobility
2426 if (rinfo->bios_seg == NULL && rinfo->is_mobility)
2427 radeon_map_ROM(rinfo, pdev);
2429 /* Get informations about the board's PLL */
2430 radeon_get_pllinfo(rinfo);
2432 #ifdef CONFIG_FB_RADEON_I2C
2433 /* Register I2C bus */
2434 radeon_create_i2c_busses(rinfo);
2437 /* set all the vital stuff */
2438 radeon_set_fbinfo (rinfo);
2440 /* Probe screen types */
2441 radeon_probe_screens(rinfo, monitor_layout, ignore_edid);
2443 /* Build mode list, check out panel native model */
2444 radeon_check_modes(rinfo, mode_option);
2446 /* Register some sysfs stuff (should be done better) */
2447 if (rinfo->mon1_EDID)
2448 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid1_attr);
2449 if (rinfo->mon2_EDID)
2450 sysfs_create_bin_file(&rinfo->pdev->dev.kobj, &edid2_attr);
2452 /* save current mode regs before we switch into the new one
2453 * so we can restore this upon __exit
2455 radeon_save_state (rinfo, &rinfo->init_state);
2456 memcpy(&rinfo->state, &rinfo->init_state, sizeof(struct radeon_regs));
2458 /* Setup Power Management capabilities */
2459 if (default_dynclk < -1) {
2460 /* -2 is special: means ON on mobility chips and do not
2463 radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1);
2465 radeonfb_pm_init(rinfo, default_dynclk);
2467 pci_set_drvdata(pdev, info);
2469 /* Register with fbdev layer */
2470 ret = register_framebuffer(info);
2472 printk (KERN_ERR "radeonfb (%s): could not register framebuffer\n",
2473 pci_name(rinfo->pdev));
2478 rinfo->mtrr_hdl = nomtrr ? -1 : mtrr_add(rinfo->fb_base_phys,
2480 MTRR_TYPE_WRCOMB, 1);
2483 #ifdef CONFIG_PMAC_BACKLIGHT
2484 if (rinfo->mon1_type == MT_LCD) {
2485 register_backlight_controller(&radeon_backlight_controller,
2487 register_backlight_controller(&radeon_backlight_controller,
2492 printk ("radeonfb (%s): %s\n", pci_name(rinfo->pdev), rinfo->name);
2494 if (rinfo->bios_seg)
2495 radeon_unmap_ROM(rinfo, pdev);
2496 RTRACE("radeonfb_pci_register END\n");
2500 iounmap(rinfo->fb_base);
2502 kfree(rinfo->mon1_EDID);
2503 kfree(rinfo->mon2_EDID);
2504 if (rinfo->mon1_modedb)
2505 fb_destroy_modedb(rinfo->mon1_modedb);
2506 fb_dealloc_cmap(&info->cmap);
2507 #ifdef CONFIG_FB_RADEON_I2C
2508 radeon_delete_i2c_busses(rinfo);
2510 if (rinfo->bios_seg)
2511 radeon_unmap_ROM(rinfo, pdev);
2512 iounmap(rinfo->mmio_base);
2514 pci_release_region(pdev, 2);
2516 pci_release_region(pdev, 0);
2518 framebuffer_release(info);
2520 pci_disable_device(pdev);
2527 static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev)
2529 struct fb_info *info = pci_get_drvdata(pdev);
2530 struct radeonfb_info *rinfo = info->par;
2535 radeonfb_pm_exit(rinfo);
2537 if (rinfo->mon1_EDID)
2538 sysfs_remove_bin_file(&rinfo->pdev->dev.kobj, &edid1_attr);
2539 if (rinfo->mon2_EDID)
2540 sysfs_remove_bin_file(&rinfo->pdev->dev.kobj, &edid2_attr);
2543 /* restore original state
2545 * Doesn't quite work yet, I suspect if we come from a legacy
2546 * VGA mode (or worse, text mode), we need to do some VGA black
2547 * magic here that I know nothing about. --BenH
2549 radeon_write_mode (rinfo, &rinfo->init_state, 1);
2552 del_timer_sync(&rinfo->lvds_timer);
2555 if (rinfo->mtrr_hdl >= 0)
2556 mtrr_del(rinfo->mtrr_hdl, 0, 0);
2559 unregister_framebuffer(info);
2561 iounmap(rinfo->mmio_base);
2562 iounmap(rinfo->fb_base);
2564 pci_release_region(pdev, 2);
2565 pci_release_region(pdev, 0);
2567 kfree(rinfo->mon1_EDID);
2568 kfree(rinfo->mon2_EDID);
2569 if (rinfo->mon1_modedb)
2570 fb_destroy_modedb(rinfo->mon1_modedb);
2571 #ifdef CONFIG_FB_RADEON_I2C
2572 radeon_delete_i2c_busses(rinfo);
2574 fb_dealloc_cmap(&info->cmap);
2575 framebuffer_release(info);
2576 pci_disable_device(pdev);
2580 static struct pci_driver radeonfb_driver = {
2582 .id_table = radeonfb_pci_table,
2583 .probe = radeonfb_pci_register,
2584 .remove = __devexit_p(radeonfb_pci_unregister),
2586 .suspend = radeonfb_pci_suspend,
2587 .resume = radeonfb_pci_resume,
2588 #endif /* CONFIG_PM */
2592 static int __init radeonfb_setup (char *options)
2596 if (!options || !*options)
2599 while ((this_opt = strsep (&options, ",")) != NULL) {
2603 if (!strncmp(this_opt, "noaccel", 7)) {
2605 } else if (!strncmp(this_opt, "mirror", 6)) {
2607 } else if (!strncmp(this_opt, "force_dfp", 9)) {
2609 } else if (!strncmp(this_opt, "panel_yres:", 11)) {
2610 panel_yres = simple_strtoul((this_opt+11), NULL, 0);
2612 } else if (!strncmp(this_opt, "nomtrr", 6)) {
2615 } else if (!strncmp(this_opt, "nomodeset", 9)) {
2617 } else if (!strncmp(this_opt, "force_measure_pll", 17)) {
2618 force_measure_pll = 1;
2619 } else if (!strncmp(this_opt, "ignore_edid", 11)) {
2621 #if defined(CONFIG_PM) && defined(CONFIG_X86)
2622 } else if (!strncmp(this_opt, "force_sleep", 11)) {
2623 radeon_force_sleep = 1;
2626 mode_option = this_opt;
2632 static int __init radeonfb_init (void)
2635 char *option = NULL;
2637 if (fb_get_options("radeonfb", &option))
2639 radeonfb_setup(option);
2641 return pci_register_driver (&radeonfb_driver);
2645 static void __exit radeonfb_exit (void)
2647 pci_unregister_driver (&radeonfb_driver);
2650 module_init(radeonfb_init);
2651 module_exit(radeonfb_exit);
2653 MODULE_AUTHOR("Ani Joshi");
2654 MODULE_DESCRIPTION("framebuffer driver for ATI Radeon chipset");
2655 MODULE_LICENSE("GPL");
2656 module_param(noaccel, bool, 0);
2657 module_param(default_dynclk, int, 0);
2658 MODULE_PARM_DESC(default_dynclk, "int: -2=enable on mobility only,-1=do not change,0=off,1=on");
2659 MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
2660 module_param(nomodeset, bool, 0);
2661 MODULE_PARM_DESC(nomodeset, "bool: disable actual setting of video mode");
2662 module_param(mirror, bool, 0);
2663 MODULE_PARM_DESC(mirror, "bool: mirror the display to both monitors");
2664 module_param(force_dfp, bool, 0);
2665 MODULE_PARM_DESC(force_dfp, "bool: force display to dfp");
2666 module_param(ignore_edid, bool, 0);
2667 MODULE_PARM_DESC(ignore_edid, "bool: Ignore EDID data when doing DDC probe");
2668 module_param(monitor_layout, charp, 0);
2669 MODULE_PARM_DESC(monitor_layout, "Specify monitor mapping (like XFree86)");
2670 module_param(force_measure_pll, bool, 0);
2671 MODULE_PARM_DESC(force_measure_pll, "Force measurement of PLL (debug)");
2673 module_param(nomtrr, bool, 0);
2674 MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers");
2676 module_param(panel_yres, int, 0);
2677 MODULE_PARM_DESC(panel_yres, "int: set panel yres");
2678 module_param(mode_option, charp, 0);
2679 MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
2680 #if defined(CONFIG_PM) && defined(CONFIG_X86)
2681 module_param(radeon_force_sleep, int, 0);
2682 MODULE_PARM_DESC(radeon_force_sleep, "bool: force ACPI sleep mode on untested machines");