Merge tag 'spdx-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[sfrench/cifs-2.6.git] / drivers / video / fbdev / aty / atyfb_base.c
1 /*
2  *  ATI Frame Buffer Device Driver Core
3  *
4  *      Copyright (C) 2004  Alex Kern <alex.kern@gmx.de>
5  *      Copyright (C) 1997-2001  Geert Uytterhoeven
6  *      Copyright (C) 1998  Bernd Harries
7  *      Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
8  *
9  *  This driver supports the following ATI graphics chips:
10  *    - ATI Mach64
11  *
12  *  To do: add support for
13  *    - ATI Rage128 (from aty128fb.c)
14  *    - ATI Radeon (from radeonfb.c)
15  *
16  *  This driver is partly based on the PowerMac console driver:
17  *
18  *      Copyright (C) 1996 Paul Mackerras
19  *
20  *  and on the PowerMac ATI/mach64 display driver:
21  *
22  *      Copyright (C) 1997 Michael AK Tesch
23  *
24  *            with work by Jon Howell
25  *                         Harry AC Eaton
26  *                         Anthony Tong <atong@uiuc.edu>
27  *
28  *  Generic LCD support written by Daniel Mantione, ported from 2.4.20 by Alex Kern
29  *  Many Thanks to Ville Syrjälä for patches and fixing nasting 16 bit color bug.
30  *
31  *  This file is subject to the terms and conditions of the GNU General Public
32  *  License. See the file COPYING in the main directory of this archive for
33  *  more details.
34  *
35  *  Many thanks to Nitya from ATI devrel for support and patience !
36  */
37
38 /******************************************************************************
39
40   TODO:
41
42     - cursor support on all cards and all ramdacs.
43     - cursor parameters controlable via ioctl()s.
44     - guess PLL and MCLK based on the original PLL register values initialized
45       by Open Firmware (if they are initialized). BIOS is done
46
47     (Anyone with Mac to help with this?)
48
49 ******************************************************************************/
50
51 #include <linux/compat.h>
52 #include <linux/module.h>
53 #include <linux/moduleparam.h>
54 #include <linux/kernel.h>
55 #include <linux/errno.h>
56 #include <linux/string.h>
57 #include <linux/mm.h>
58 #include <linux/slab.h>
59 #include <linux/vmalloc.h>
60 #include <linux/delay.h>
61 #include <linux/compiler.h>
62 #include <linux/console.h>
63 #include <linux/fb.h>
64 #include <linux/init.h>
65 #include <linux/pci.h>
66 #include <linux/interrupt.h>
67 #include <linux/spinlock.h>
68 #include <linux/wait.h>
69 #include <linux/backlight.h>
70 #include <linux/reboot.h>
71 #include <linux/dmi.h>
72
73 #include <asm/io.h>
74 #include <linux/uaccess.h>
75
76 #include <video/mach64.h>
77 #include "atyfb.h"
78 #include "ati_ids.h"
79
80 #ifdef __powerpc__
81 #include <asm/machdep.h>
82 #include <asm/prom.h>
83 #include "../macmodes.h"
84 #endif
85 #ifdef __sparc__
86 #include <asm/fbio.h>
87 #include <asm/oplib.h>
88 #include <asm/prom.h>
89 #endif
90
91 #ifdef CONFIG_ADB_PMU
92 #include <linux/adb.h>
93 #include <linux/pmu.h>
94 #endif
95 #ifdef CONFIG_BOOTX_TEXT
96 #include <asm/btext.h>
97 #endif
98 #ifdef CONFIG_PMAC_BACKLIGHT
99 #include <asm/backlight.h>
100 #endif
101
102 /*
103  * Debug flags.
104  */
105 #undef DEBUG
106 /*#define DEBUG*/
107
108 /* Make sure n * PAGE_SIZE is protected at end of Aperture for GUI-regs */
109 /*  - must be large enough to catch all GUI-Regs   */
110 /*  - must be aligned to a PAGE boundary           */
111 #define GUI_RESERVE     (1 * PAGE_SIZE)
112
113 /* FIXME: remove the FAIL definition */
114 #define FAIL(msg) do { \
115         if (!(var->activate & FB_ACTIVATE_TEST)) \
116                 printk(KERN_CRIT "atyfb: " msg "\n"); \
117         return -EINVAL; \
118 } while (0)
119 #define FAIL_MAX(msg, x, _max_) do { \
120         if (x > _max_) { \
121                 if (!(var->activate & FB_ACTIVATE_TEST)) \
122                         printk(KERN_CRIT "atyfb: " msg " %x(%x)\n", x, _max_); \
123                 return -EINVAL; \
124         } \
125 } while (0)
126 #ifdef DEBUG
127 #define DPRINTK(fmt, args...)   printk(KERN_DEBUG "atyfb: " fmt, ## args)
128 #else
129 #define DPRINTK(fmt, args...)
130 #endif
131
132 #define PRINTKI(fmt, args...)   printk(KERN_INFO "atyfb: " fmt, ## args)
133 #define PRINTKE(fmt, args...)   printk(KERN_ERR "atyfb: " fmt, ## args)
134
135 #if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \
136 defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT)
137 static const u32 lt_lcd_regs[] = {
138         CNFG_PANEL_LG,
139         LCD_GEN_CNTL_LG,
140         DSTN_CONTROL_LG,
141         HFB_PITCH_ADDR_LG,
142         HORZ_STRETCHING_LG,
143         VERT_STRETCHING_LG,
144         0, /* EXT_VERT_STRETCH */
145         LT_GIO_LG,
146         POWER_MANAGEMENT_LG
147 };
148
149 void aty_st_lcd(int index, u32 val, const struct atyfb_par *par)
150 {
151         if (M64_HAS(LT_LCD_REGS)) {
152                 aty_st_le32(lt_lcd_regs[index], val, par);
153         } else {
154                 unsigned long temp;
155
156                 /* write addr byte */
157                 temp = aty_ld_le32(LCD_INDEX, par);
158                 aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, par);
159                 /* write the register value */
160                 aty_st_le32(LCD_DATA, val, par);
161         }
162 }
163
164 u32 aty_ld_lcd(int index, const struct atyfb_par *par)
165 {
166         if (M64_HAS(LT_LCD_REGS)) {
167                 return aty_ld_le32(lt_lcd_regs[index], par);
168         } else {
169                 unsigned long temp;
170
171                 /* write addr byte */
172                 temp = aty_ld_le32(LCD_INDEX, par);
173                 aty_st_le32(LCD_INDEX, (temp & ~LCD_INDEX_MASK) | index, par);
174                 /* read the register value */
175                 return aty_ld_le32(LCD_DATA, par);
176         }
177 }
178 #endif /* defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || defined (CONFIG_FB_ATY_GENERIC_LCD) */
179
180 #ifdef CONFIG_FB_ATY_GENERIC_LCD
181 /*
182  * ATIReduceRatio --
183  *
184  * Reduce a fraction by factoring out the largest common divider of the
185  * fraction's numerator and denominator.
186  */
187 static void ATIReduceRatio(int *Numerator, int *Denominator)
188 {
189         int Multiplier, Divider, Remainder;
190
191         Multiplier = *Numerator;
192         Divider = *Denominator;
193
194         while ((Remainder = Multiplier % Divider)) {
195                 Multiplier = Divider;
196                 Divider = Remainder;
197         }
198
199         *Numerator /= Divider;
200         *Denominator /= Divider;
201 }
202 #endif
203 /*
204  * The Hardware parameters for each card
205  */
206
207 struct pci_mmap_map {
208         unsigned long voff;
209         unsigned long poff;
210         unsigned long size;
211         unsigned long prot_flag;
212         unsigned long prot_mask;
213 };
214
215 static const struct fb_fix_screeninfo atyfb_fix = {
216         .id             = "ATY Mach64",
217         .type           = FB_TYPE_PACKED_PIXELS,
218         .visual         = FB_VISUAL_PSEUDOCOLOR,
219         .xpanstep       = 8,
220         .ypanstep       = 1,
221 };
222
223 /*
224  * Frame buffer device API
225  */
226
227 static int atyfb_open(struct fb_info *info, int user);
228 static int atyfb_release(struct fb_info *info, int user);
229 static int atyfb_check_var(struct fb_var_screeninfo *var,
230                            struct fb_info *info);
231 static int atyfb_set_par(struct fb_info *info);
232 static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
233                            u_int transp, struct fb_info *info);
234 static int atyfb_pan_display(struct fb_var_screeninfo *var,
235                              struct fb_info *info);
236 static int atyfb_blank(int blank, struct fb_info *info);
237 static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg);
238 #ifdef CONFIG_COMPAT
239 static int atyfb_compat_ioctl(struct fb_info *info, u_int cmd, u_long arg)
240 {
241         return atyfb_ioctl(info, cmd, (u_long)compat_ptr(arg));
242 }
243 #endif
244
245 #ifdef __sparc__
246 static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma);
247 #endif
248 static int atyfb_sync(struct fb_info *info);
249
250 /*
251  * Internal routines
252  */
253
254 static int aty_init(struct fb_info *info);
255
256 static void aty_get_crtc(const struct atyfb_par *par, struct crtc *crtc);
257
258 static void aty_set_crtc(const struct atyfb_par *par, const struct crtc *crtc);
259 static int aty_var_to_crtc(const struct fb_info *info,
260                            const struct fb_var_screeninfo *var,
261                            struct crtc *crtc);
262 static int aty_crtc_to_var(const struct crtc *crtc,
263                            struct fb_var_screeninfo *var);
264 static void set_off_pitch(struct atyfb_par *par, const struct fb_info *info);
265 #ifdef CONFIG_PPC
266 static int read_aty_sense(const struct atyfb_par *par);
267 #endif
268
269 static DEFINE_MUTEX(reboot_lock);
270 static struct fb_info *reboot_info;
271
272 /*
273  * Interface used by the world
274  */
275
276 static struct fb_var_screeninfo default_var = {
277         /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
278         640, 480, 640, 480, 0, 0, 8, 0,
279         {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
280         0, 0, -1, -1, 0, 39722, 48, 16, 33, 10, 96, 2,
281         0, FB_VMODE_NONINTERLACED
282 };
283
284 static const struct fb_videomode defmode = {
285         /* 640x480 @ 60 Hz, 31.5 kHz hsync */
286         NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,
287         0, FB_VMODE_NONINTERLACED
288 };
289
290 static struct fb_ops atyfb_ops = {
291         .owner          = THIS_MODULE,
292         .fb_open        = atyfb_open,
293         .fb_release     = atyfb_release,
294         .fb_check_var   = atyfb_check_var,
295         .fb_set_par     = atyfb_set_par,
296         .fb_setcolreg   = atyfb_setcolreg,
297         .fb_pan_display = atyfb_pan_display,
298         .fb_blank       = atyfb_blank,
299         .fb_ioctl       = atyfb_ioctl,
300 #ifdef CONFIG_COMPAT
301         .fb_compat_ioctl = atyfb_compat_ioctl,
302 #endif
303         .fb_fillrect    = atyfb_fillrect,
304         .fb_copyarea    = atyfb_copyarea,
305         .fb_imageblit   = atyfb_imageblit,
306 #ifdef __sparc__
307         .fb_mmap        = atyfb_mmap,
308 #endif
309         .fb_sync        = atyfb_sync,
310 };
311
312 static bool noaccel;
313 static bool nomtrr;
314 static int vram;
315 static int pll;
316 static int mclk;
317 static int xclk;
318 static int comp_sync = -1;
319 static char *mode;
320
321 #ifdef CONFIG_PMAC_BACKLIGHT
322 static int backlight = 1;
323 #else
324 static int backlight = 0;
325 #endif
326
327 #ifdef CONFIG_PPC
328 static int default_vmode = VMODE_CHOOSE;
329 static int default_cmode = CMODE_CHOOSE;
330
331 module_param_named(vmode, default_vmode, int, 0);
332 MODULE_PARM_DESC(vmode, "int: video mode for mac");
333 module_param_named(cmode, default_cmode, int, 0);
334 MODULE_PARM_DESC(cmode, "int: color mode for mac");
335 #endif
336
337 #ifdef CONFIG_ATARI
338 static unsigned int mach64_count = 0;
339 static unsigned long phys_vmembase[FB_MAX] = { 0, };
340 static unsigned long phys_size[FB_MAX] = { 0, };
341 static unsigned long phys_guiregbase[FB_MAX] = { 0, };
342 #endif
343
344 /* top -> down is an evolution of mach64 chipset, any corrections? */
345 #define ATI_CHIP_88800GX   (M64F_GX)
346 #define ATI_CHIP_88800CX   (M64F_GX)
347
348 #define ATI_CHIP_264CT     (M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO)
349 #define ATI_CHIP_264ET     (M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO)
350
351 #define ATI_CHIP_264VT     (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO)
352 #define ATI_CHIP_264GT     (M64F_GT | M64F_INTEGRATED               | M64F_MAGIC_FIFO | M64F_EXTRA_BRIGHT)
353
354 #define ATI_CHIP_264VTB    (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP)
355 #define ATI_CHIP_264VT3    (M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL)
356 #define ATI_CHIP_264VT4    (M64F_VT | M64F_INTEGRATED               | M64F_GTB_DSP)
357
358 /* FIXME what is this chip? */
359 #define ATI_CHIP_264LT     (M64F_GT | M64F_INTEGRATED               | M64F_GTB_DSP)
360
361 /* make sets shorter */
362 #define ATI_MODERN_SET     (M64F_GT | M64F_INTEGRATED               | M64F_GTB_DSP | M64F_EXTRA_BRIGHT)
363
364 #define ATI_CHIP_264GTB    (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL)
365 /*#define ATI_CHIP_264GTDVD  ?*/
366 #define ATI_CHIP_264LTG    (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL)
367
368 #define ATI_CHIP_264GT2C   (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL | M64F_HW_TRIPLE)
369 #define ATI_CHIP_264GTPRO  (ATI_MODERN_SET | M64F_SDRAM_MAGIC_PLL | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D)
370 #define ATI_CHIP_264LTPRO  (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D)
371
372 #define ATI_CHIP_264XL     (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D | M64F_XL_DLL | M64F_MFB_FORCE_4 | M64F_XL_MEM)
373 #define ATI_CHIP_MOBILITY  (ATI_MODERN_SET | M64F_HW_TRIPLE | M64F_FIFO_32 | M64F_RESET_3D | M64F_XL_DLL | M64F_MFB_FORCE_4 | M64F_XL_MEM | M64F_MOBIL_BUS)
374
375 static struct {
376         u16 pci_id;
377         const char *name;
378         int pll, mclk, xclk, ecp_max;
379         u32 features;
380 } aty_chips[] = {
381 #ifdef CONFIG_FB_ATY_GX
382         /* Mach64 GX */
383         { PCI_CHIP_MACH64GX, "ATI888GX00 (Mach64 GX)", 135, 50, 50, 0, ATI_CHIP_88800GX },
384         { PCI_CHIP_MACH64CX, "ATI888CX00 (Mach64 CX)", 135, 50, 50, 0, ATI_CHIP_88800CX },
385 #endif /* CONFIG_FB_ATY_GX */
386
387 #ifdef CONFIG_FB_ATY_CT
388         { PCI_CHIP_MACH64CT, "ATI264CT (Mach64 CT)", 135, 60, 60, 0, ATI_CHIP_264CT },
389         { PCI_CHIP_MACH64ET, "ATI264ET (Mach64 ET)", 135, 60, 60, 0, ATI_CHIP_264ET },
390
391         /* FIXME what is this chip? */
392         { PCI_CHIP_MACH64LT, "ATI264LT (Mach64 LT)", 135, 63, 63, 0, ATI_CHIP_264LT },
393
394         { PCI_CHIP_MACH64VT, "ATI264VT (Mach64 VT)", 170, 67, 67, 80, ATI_CHIP_264VT },
395         { PCI_CHIP_MACH64GT, "3D RAGE (Mach64 GT)", 135, 63, 63, 80, ATI_CHIP_264GT },
396
397         { PCI_CHIP_MACH64VU, "ATI264VT3 (Mach64 VU)", 200, 67, 67, 80, ATI_CHIP_264VT3 },
398         { PCI_CHIP_MACH64GU, "3D RAGE II+ (Mach64 GU)", 200, 67, 67, 100, ATI_CHIP_264GTB },
399
400         { PCI_CHIP_MACH64LG, "3D RAGE LT (Mach64 LG)", 230, 63, 63, 100, ATI_CHIP_264LTG | M64F_LT_LCD_REGS | M64F_G3_PB_1024x768 },
401
402         { PCI_CHIP_MACH64VV, "ATI264VT4 (Mach64 VV)", 230, 83, 83, 100, ATI_CHIP_264VT4 },
403
404         { PCI_CHIP_MACH64GV, "3D RAGE IIC (Mach64 GV, PCI)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
405         { PCI_CHIP_MACH64GW, "3D RAGE IIC (Mach64 GW, AGP)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
406         { PCI_CHIP_MACH64GY, "3D RAGE IIC (Mach64 GY, PCI)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
407         { PCI_CHIP_MACH64GZ, "3D RAGE IIC (Mach64 GZ, AGP)", 230, 83, 83, 100, ATI_CHIP_264GT2C },
408
409         { PCI_CHIP_MACH64GB, "3D RAGE PRO (Mach64 GB, BGA, AGP)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
410         { PCI_CHIP_MACH64GD, "3D RAGE PRO (Mach64 GD, BGA, AGP 1x)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
411         { PCI_CHIP_MACH64GI, "3D RAGE PRO (Mach64 GI, BGA, PCI)", 230, 100, 100, 125, ATI_CHIP_264GTPRO | M64F_MAGIC_VRAM_SIZE },
412         { PCI_CHIP_MACH64GP, "3D RAGE PRO (Mach64 GP, PQFP, PCI)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
413         { PCI_CHIP_MACH64GQ, "3D RAGE PRO (Mach64 GQ, PQFP, PCI, limited 3D)", 230, 100, 100, 125, ATI_CHIP_264GTPRO },
414
415         { PCI_CHIP_MACH64LB, "3D RAGE LT PRO (Mach64 LB, AGP)", 236, 75, 100, 135, ATI_CHIP_264LTPRO },
416         { PCI_CHIP_MACH64LD, "3D RAGE LT PRO (Mach64 LD, AGP)", 230, 100, 100, 135, ATI_CHIP_264LTPRO },
417         { PCI_CHIP_MACH64LI, "3D RAGE LT PRO (Mach64 LI, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 },
418         { PCI_CHIP_MACH64LP, "3D RAGE LT PRO (Mach64 LP, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO | M64F_G3_PB_1024x768 },
419         { PCI_CHIP_MACH64LQ, "3D RAGE LT PRO (Mach64 LQ, PCI)", 230, 100, 100, 135, ATI_CHIP_264LTPRO },
420
421         { PCI_CHIP_MACH64GM, "3D RAGE XL (Mach64 GM, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL },
422         { PCI_CHIP_MACH64GN, "3D RAGE XC (Mach64 GN, AGP 2x)", 230, 83, 63, 135, ATI_CHIP_264XL },
423         { PCI_CHIP_MACH64GO, "3D RAGE XL (Mach64 GO, PCI-66)", 230, 83, 63, 135, ATI_CHIP_264XL },
424         { PCI_CHIP_MACH64GL, "3D RAGE XC (Mach64 GL, PCI-66)", 230, 83, 63, 135, ATI_CHIP_264XL },
425         { PCI_CHIP_MACH64GR, "3D RAGE XL (Mach64 GR, PCI-33)", 230, 83, 63, 135, ATI_CHIP_264XL | M64F_SDRAM_MAGIC_PLL },
426         { PCI_CHIP_MACH64GS, "3D RAGE XC (Mach64 GS, PCI-33)", 230, 83, 63, 135, ATI_CHIP_264XL },
427
428         { PCI_CHIP_MACH64LM, "3D RAGE Mobility P/M (Mach64 LM, AGP 2x)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
429         { PCI_CHIP_MACH64LN, "3D RAGE Mobility L (Mach64 LN, AGP 2x)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
430         { PCI_CHIP_MACH64LR, "3D RAGE Mobility P/M (Mach64 LR, PCI)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
431         { PCI_CHIP_MACH64LS, "3D RAGE Mobility L (Mach64 LS, PCI)", 230, 83, 125, 135, ATI_CHIP_MOBILITY },
432 #endif /* CONFIG_FB_ATY_CT */
433 };
434
435 /*
436  * Last page of 8 MB (4 MB on ISA) aperture is MMIO,
437  * unless the auxiliary register aperture is used.
438  */
439 static void aty_fudge_framebuffer_len(struct fb_info *info)
440 {
441         struct atyfb_par *par = (struct atyfb_par *) info->par;
442
443         if (!par->aux_start &&
444             (info->fix.smem_len == 0x800000 ||
445              (par->bus_type == ISA && info->fix.smem_len == 0x400000)))
446                 info->fix.smem_len -= GUI_RESERVE;
447 }
448
449 static int correct_chipset(struct atyfb_par *par)
450 {
451         u8 rev;
452         u16 type;
453         u32 chip_id;
454         const char *name;
455         int i;
456
457         for (i = (int)ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
458                 if (par->pci_id == aty_chips[i].pci_id)
459                         break;
460
461         if (i < 0)
462                 return -ENODEV;
463
464         name = aty_chips[i].name;
465         par->pll_limits.pll_max = aty_chips[i].pll;
466         par->pll_limits.mclk = aty_chips[i].mclk;
467         par->pll_limits.xclk = aty_chips[i].xclk;
468         par->pll_limits.ecp_max = aty_chips[i].ecp_max;
469         par->features = aty_chips[i].features;
470
471         chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
472         type = chip_id & CFG_CHIP_TYPE;
473         rev = (chip_id & CFG_CHIP_REV) >> 24;
474
475         switch (par->pci_id) {
476 #ifdef CONFIG_FB_ATY_GX
477         case PCI_CHIP_MACH64GX:
478                 if (type != 0x00d7)
479                         return -ENODEV;
480                 break;
481         case PCI_CHIP_MACH64CX:
482                 if (type != 0x0057)
483                         return -ENODEV;
484                 break;
485 #endif
486 #ifdef CONFIG_FB_ATY_CT
487         case PCI_CHIP_MACH64VT:
488                 switch (rev & 0x07) {
489                 case 0x00:
490                         switch (rev & 0xc0) {
491                         case 0x00:
492                                 name = "ATI264VT (A3) (Mach64 VT)";
493                                 par->pll_limits.pll_max = 170;
494                                 par->pll_limits.mclk = 67;
495                                 par->pll_limits.xclk = 67;
496                                 par->pll_limits.ecp_max = 80;
497                                 par->features = ATI_CHIP_264VT;
498                                 break;
499                         case 0x40:
500                                 name = "ATI264VT2 (A4) (Mach64 VT)";
501                                 par->pll_limits.pll_max = 200;
502                                 par->pll_limits.mclk = 67;
503                                 par->pll_limits.xclk = 67;
504                                 par->pll_limits.ecp_max = 80;
505                                 par->features = ATI_CHIP_264VT | M64F_MAGIC_POSTDIV;
506                                 break;
507                         }
508                         break;
509                 case 0x01:
510                         name = "ATI264VT3 (B1) (Mach64 VT)";
511                         par->pll_limits.pll_max = 200;
512                         par->pll_limits.mclk = 67;
513                         par->pll_limits.xclk = 67;
514                         par->pll_limits.ecp_max = 80;
515                         par->features = ATI_CHIP_264VTB;
516                         break;
517                 case 0x02:
518                         name = "ATI264VT3 (B2) (Mach64 VT)";
519                         par->pll_limits.pll_max = 200;
520                         par->pll_limits.mclk = 67;
521                         par->pll_limits.xclk = 67;
522                         par->pll_limits.ecp_max = 80;
523                         par->features = ATI_CHIP_264VT3;
524                         break;
525                 }
526                 break;
527         case PCI_CHIP_MACH64GT:
528                 switch (rev & 0x07) {
529                 case 0x01:
530                         name = "3D RAGE II (Mach64 GT)";
531                         par->pll_limits.pll_max = 170;
532                         par->pll_limits.mclk = 67;
533                         par->pll_limits.xclk = 67;
534                         par->pll_limits.ecp_max = 80;
535                         par->features = ATI_CHIP_264GTB;
536                         break;
537                 case 0x02:
538                         name = "3D RAGE II+ (Mach64 GT)";
539                         par->pll_limits.pll_max = 200;
540                         par->pll_limits.mclk = 67;
541                         par->pll_limits.xclk = 67;
542                         par->pll_limits.ecp_max = 100;
543                         par->features = ATI_CHIP_264GTB;
544                         break;
545                 }
546                 break;
547 #endif
548         }
549
550         PRINTKI("%s [0x%04x rev 0x%02x]\n", name, type, rev);
551         return 0;
552 }
553
554 static char ram_dram[] __maybe_unused = "DRAM";
555 static char ram_resv[] __maybe_unused = "RESV";
556 #ifdef CONFIG_FB_ATY_GX
557 static char ram_vram[] = "VRAM";
558 #endif /* CONFIG_FB_ATY_GX */
559 #ifdef CONFIG_FB_ATY_CT
560 static char ram_edo[] = "EDO";
561 static char ram_sdram[] = "SDRAM (1:1)";
562 static char ram_sgram[] = "SGRAM (1:1)";
563 static char ram_sdram32[] = "SDRAM (2:1) (32-bit)";
564 static char ram_wram[] = "WRAM";
565 static char ram_off[] = "OFF";
566 #endif /* CONFIG_FB_ATY_CT */
567
568
569 #ifdef CONFIG_FB_ATY_GX
570 static char *aty_gx_ram[8] = {
571         ram_dram, ram_vram, ram_vram, ram_dram,
572         ram_dram, ram_vram, ram_vram, ram_resv
573 };
574 #endif /* CONFIG_FB_ATY_GX */
575
576 #ifdef CONFIG_FB_ATY_CT
577 static char *aty_ct_ram[8] = {
578         ram_off, ram_dram, ram_edo, ram_edo,
579         ram_sdram, ram_sgram, ram_wram, ram_resv
580 };
581 static char *aty_xl_ram[8] = {
582         ram_off, ram_dram, ram_edo, ram_edo,
583         ram_sdram, ram_sgram, ram_sdram32, ram_resv
584 };
585 #endif /* CONFIG_FB_ATY_CT */
586
587 static u32 atyfb_get_pixclock(struct fb_var_screeninfo *var,
588                               struct atyfb_par *par)
589 {
590         u32 pixclock = var->pixclock;
591 #ifdef CONFIG_FB_ATY_GENERIC_LCD
592         u32 lcd_on_off;
593         par->pll.ct.xres = 0;
594         if (par->lcd_table != 0) {
595                 lcd_on_off = aty_ld_lcd(LCD_GEN_CNTL, par);
596                 if (lcd_on_off & LCD_ON) {
597                         par->pll.ct.xres = var->xres;
598                         pixclock = par->lcd_pixclock;
599                 }
600         }
601 #endif
602         return pixclock;
603 }
604
605 #if defined(CONFIG_PPC)
606
607 /*
608  * Apple monitor sense
609  */
610
611 static int read_aty_sense(const struct atyfb_par *par)
612 {
613         int sense, i;
614
615         aty_st_le32(GP_IO, 0x31003100, par); /* drive outputs high */
616         __delay(200);
617         aty_st_le32(GP_IO, 0, par); /* turn off outputs */
618         __delay(2000);
619         i = aty_ld_le32(GP_IO, par); /* get primary sense value */
620         sense = ((i & 0x3000) >> 3) | (i & 0x100);
621
622         /* drive each sense line low in turn and collect the other 2 */
623         aty_st_le32(GP_IO, 0x20000000, par); /* drive A low */
624         __delay(2000);
625         i = aty_ld_le32(GP_IO, par);
626         sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4);
627         aty_st_le32(GP_IO, 0x20002000, par); /* drive A high again */
628         __delay(200);
629
630         aty_st_le32(GP_IO, 0x10000000, par); /* drive B low */
631         __delay(2000);
632         i = aty_ld_le32(GP_IO, par);
633         sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6);
634         aty_st_le32(GP_IO, 0x10001000, par); /* drive B high again */
635         __delay(200);
636
637         aty_st_le32(GP_IO, 0x01000000, par); /* drive C low */
638         __delay(2000);
639         sense |= (aty_ld_le32(GP_IO, par) & 0x3000) >> 12;
640         aty_st_le32(GP_IO, 0, par); /* turn off outputs */
641         return sense;
642 }
643
644 #endif /* defined(CONFIG_PPC) */
645
646 /* ------------------------------------------------------------------------- */
647
648 /*
649  * CRTC programming
650  */
651
652 static void aty_get_crtc(const struct atyfb_par *par, struct crtc *crtc)
653 {
654 #ifdef CONFIG_FB_ATY_GENERIC_LCD
655         if (par->lcd_table != 0) {
656                 if (!M64_HAS(LT_LCD_REGS)) {
657                         crtc->lcd_index = aty_ld_le32(LCD_INDEX, par);
658                         aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
659                 }
660                 crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par);
661                 crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par);
662
663
664                 /* switch to non shadow registers */
665                 aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
666                            ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
667
668                 /* save stretching */
669                 crtc->horz_stretching = aty_ld_lcd(HORZ_STRETCHING, par);
670                 crtc->vert_stretching = aty_ld_lcd(VERT_STRETCHING, par);
671                 if (!M64_HAS(LT_LCD_REGS))
672                         crtc->ext_vert_stretch = aty_ld_lcd(EXT_VERT_STRETCH, par);
673         }
674 #endif
675         crtc->h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
676         crtc->h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
677         crtc->v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
678         crtc->v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
679         crtc->vline_crnt_vline = aty_ld_le32(CRTC_VLINE_CRNT_VLINE, par);
680         crtc->off_pitch = aty_ld_le32(CRTC_OFF_PITCH, par);
681         crtc->gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
682
683 #ifdef CONFIG_FB_ATY_GENERIC_LCD
684         if (par->lcd_table != 0) {
685                 /* switch to shadow registers */
686                 aty_st_lcd(LCD_GEN_CNTL, (crtc->lcd_gen_cntl & ~CRTC_RW_SELECT) |
687                            SHADOW_EN | SHADOW_RW_EN, par);
688
689                 crtc->shadow_h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
690                 crtc->shadow_h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
691                 crtc->shadow_v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
692                 crtc->shadow_v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
693
694                 aty_st_le32(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);
695         }
696 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
697 }
698
699 static void aty_set_crtc(const struct atyfb_par *par, const struct crtc *crtc)
700 {
701 #ifdef CONFIG_FB_ATY_GENERIC_LCD
702         if (par->lcd_table != 0) {
703                 /* stop CRTC */
704                 aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl &
705                             ~(CRTC_EXT_DISP_EN | CRTC_EN), par);
706
707                 /* update non-shadow registers first */
708                 aty_st_lcd(CNFG_PANEL, crtc->lcd_config_panel, par);
709                 aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
710                            ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
711
712                 /* temporarily disable stretching */
713                 aty_st_lcd(HORZ_STRETCHING, crtc->horz_stretching &
714                            ~(HORZ_STRETCH_MODE | HORZ_STRETCH_EN), par);
715                 aty_st_lcd(VERT_STRETCHING, crtc->vert_stretching &
716                            ~(VERT_STRETCH_RATIO1 | VERT_STRETCH_RATIO2 |
717                              VERT_STRETCH_USE0 | VERT_STRETCH_EN), par);
718         }
719 #endif
720         /* turn off CRT */
721         aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~CRTC_EN, par);
722
723         DPRINTK("setting up CRTC\n");
724         DPRINTK("set primary CRT to %ix%i %c%c composite %c\n",
725                 ((((crtc->h_tot_disp >> 16) & 0xff) + 1) << 3),
726                 (((crtc->v_tot_disp >> 16) & 0x7ff) + 1),
727                 (crtc->h_sync_strt_wid & 0x200000) ? 'N' : 'P',
728                 (crtc->v_sync_strt_wid & 0x200000) ? 'N' : 'P',
729                 (crtc->gen_cntl & CRTC_CSYNC_EN) ? 'P' : 'N');
730
731         DPRINTK("CRTC_H_TOTAL_DISP: %x\n", crtc->h_tot_disp);
732         DPRINTK("CRTC_H_SYNC_STRT_WID: %x\n", crtc->h_sync_strt_wid);
733         DPRINTK("CRTC_V_TOTAL_DISP: %x\n", crtc->v_tot_disp);
734         DPRINTK("CRTC_V_SYNC_STRT_WID: %x\n", crtc->v_sync_strt_wid);
735         DPRINTK("CRTC_OFF_PITCH: %x\n", crtc->off_pitch);
736         DPRINTK("CRTC_VLINE_CRNT_VLINE: %x\n", crtc->vline_crnt_vline);
737         DPRINTK("CRTC_GEN_CNTL: %x\n", crtc->gen_cntl);
738
739         aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_tot_disp, par);
740         aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->h_sync_strt_wid, par);
741         aty_st_le32(CRTC_V_TOTAL_DISP, crtc->v_tot_disp, par);
742         aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->v_sync_strt_wid, par);
743         aty_st_le32(CRTC_OFF_PITCH, crtc->off_pitch, par);
744         aty_st_le32(CRTC_VLINE_CRNT_VLINE, crtc->vline_crnt_vline, par);
745
746         aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl, par);
747 #if 0
748         FIXME
749         if (par->accel_flags & FB_ACCELF_TEXT)
750                 aty_init_engine(par, info);
751 #endif
752 #ifdef CONFIG_FB_ATY_GENERIC_LCD
753         /* after setting the CRTC registers we should set the LCD registers. */
754         if (par->lcd_table != 0) {
755                 /* switch to shadow registers */
756                 aty_st_lcd(LCD_GEN_CNTL, (crtc->lcd_gen_cntl & ~CRTC_RW_SELECT) |
757                            SHADOW_EN | SHADOW_RW_EN, par);
758
759                 DPRINTK("set shadow CRT to %ix%i %c%c\n",
760                         ((((crtc->shadow_h_tot_disp >> 16) & 0xff) + 1) << 3),
761                         (((crtc->shadow_v_tot_disp >> 16) & 0x7ff) + 1),
762                         (crtc->shadow_h_sync_strt_wid & 0x200000) ? 'N' : 'P',
763                         (crtc->shadow_v_sync_strt_wid & 0x200000) ? 'N' : 'P');
764
765                 DPRINTK("SHADOW CRTC_H_TOTAL_DISP: %x\n",
766                         crtc->shadow_h_tot_disp);
767                 DPRINTK("SHADOW CRTC_H_SYNC_STRT_WID: %x\n",
768                         crtc->shadow_h_sync_strt_wid);
769                 DPRINTK("SHADOW CRTC_V_TOTAL_DISP: %x\n",
770                         crtc->shadow_v_tot_disp);
771                 DPRINTK("SHADOW CRTC_V_SYNC_STRT_WID: %x\n",
772                         crtc->shadow_v_sync_strt_wid);
773
774                 aty_st_le32(CRTC_H_TOTAL_DISP, crtc->shadow_h_tot_disp, par);
775                 aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->shadow_h_sync_strt_wid, par);
776                 aty_st_le32(CRTC_V_TOTAL_DISP, crtc->shadow_v_tot_disp, par);
777                 aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->shadow_v_sync_strt_wid, par);
778
779                 /* restore CRTC selection & shadow state and enable stretching */
780                 DPRINTK("LCD_GEN_CNTL: %x\n", crtc->lcd_gen_cntl);
781                 DPRINTK("HORZ_STRETCHING: %x\n", crtc->horz_stretching);
782                 DPRINTK("VERT_STRETCHING: %x\n", crtc->vert_stretching);
783                 if (!M64_HAS(LT_LCD_REGS))
784                         DPRINTK("EXT_VERT_STRETCH: %x\n", crtc->ext_vert_stretch);
785
786                 aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);
787                 aty_st_lcd(HORZ_STRETCHING, crtc->horz_stretching, par);
788                 aty_st_lcd(VERT_STRETCHING, crtc->vert_stretching, par);
789                 if (!M64_HAS(LT_LCD_REGS)) {
790                         aty_st_lcd(EXT_VERT_STRETCH, crtc->ext_vert_stretch, par);
791                         aty_ld_le32(LCD_INDEX, par);
792                         aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
793                 }
794         }
795 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
796 }
797
798 static u32 calc_line_length(struct atyfb_par *par, u32 vxres, u32 bpp)
799 {
800         u32 line_length = vxres * bpp / 8;
801
802         if (par->ram_type == SGRAM ||
803             (!M64_HAS(XL_MEM) && par->ram_type == WRAM))
804                 line_length = (line_length + 63) & ~63;
805
806         return line_length;
807 }
808
809 static int aty_var_to_crtc(const struct fb_info *info,
810                            const struct fb_var_screeninfo *var,
811                            struct crtc *crtc)
812 {
813         struct atyfb_par *par = (struct atyfb_par *) info->par;
814         u32 xres, yres, vxres, vyres, xoffset, yoffset, bpp;
815         u32 sync, vmode;
816         u32 h_total, h_disp, h_sync_strt, h_sync_end, h_sync_dly, h_sync_wid, h_sync_pol;
817         u32 v_total, v_disp, v_sync_strt, v_sync_end, v_sync_wid, v_sync_pol, c_sync;
818         u32 pix_width, dp_pix_width, dp_chain_mask;
819         u32 line_length;
820
821         /* input */
822         xres = (var->xres + 7) & ~7;
823         yres = var->yres;
824         vxres = (var->xres_virtual + 7) & ~7;
825         vyres = var->yres_virtual;
826         xoffset = (var->xoffset + 7) & ~7;
827         yoffset = var->yoffset;
828         bpp = var->bits_per_pixel;
829         if (bpp == 16)
830                 bpp = (var->green.length == 5) ? 15 : 16;
831         sync = var->sync;
832         vmode = var->vmode;
833
834         /* convert (and round up) and validate */
835         if (vxres < xres + xoffset)
836                 vxres = xres + xoffset;
837         h_disp = xres;
838
839         if (vyres < yres + yoffset)
840                 vyres = yres + yoffset;
841         v_disp = yres;
842
843         if (bpp <= 8) {
844                 bpp = 8;
845                 pix_width = CRTC_PIX_WIDTH_8BPP;
846                 dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP |
847                         BYTE_ORDER_LSB_TO_MSB;
848                 dp_chain_mask = DP_CHAIN_8BPP;
849         } else if (bpp <= 15) {
850                 bpp = 16;
851                 pix_width = CRTC_PIX_WIDTH_15BPP;
852                 dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP |
853                         BYTE_ORDER_LSB_TO_MSB;
854                 dp_chain_mask = DP_CHAIN_15BPP;
855         } else if (bpp <= 16) {
856                 bpp = 16;
857                 pix_width = CRTC_PIX_WIDTH_16BPP;
858                 dp_pix_width = HOST_16BPP | SRC_16BPP | DST_16BPP |
859                         BYTE_ORDER_LSB_TO_MSB;
860                 dp_chain_mask = DP_CHAIN_16BPP;
861         } else if (bpp <= 24 && M64_HAS(INTEGRATED)) {
862                 bpp = 24;
863                 pix_width = CRTC_PIX_WIDTH_24BPP;
864                 dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP |
865                         BYTE_ORDER_LSB_TO_MSB;
866                 dp_chain_mask = DP_CHAIN_24BPP;
867         } else if (bpp <= 32) {
868                 bpp = 32;
869                 pix_width = CRTC_PIX_WIDTH_32BPP;
870                 dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP |
871                         BYTE_ORDER_LSB_TO_MSB;
872                 dp_chain_mask = DP_CHAIN_32BPP;
873         } else
874                 FAIL("invalid bpp");
875
876         line_length = calc_line_length(par, vxres, bpp);
877
878         if (vyres * line_length > info->fix.smem_len)
879                 FAIL("not enough video RAM");
880
881         h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1;
882         v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1;
883
884         if ((xres > 1920) || (yres > 1200)) {
885                 FAIL("MACH64 chips are designed for max 1920x1200\n"
886                      "select another resolution.");
887         }
888         h_sync_strt = h_disp + var->right_margin;
889         h_sync_end = h_sync_strt + var->hsync_len;
890         h_sync_dly  = var->right_margin & 7;
891         h_total = h_sync_end + h_sync_dly + var->left_margin;
892
893         v_sync_strt = v_disp + var->lower_margin;
894         v_sync_end = v_sync_strt + var->vsync_len;
895         v_total = v_sync_end + var->upper_margin;
896
897 #ifdef CONFIG_FB_ATY_GENERIC_LCD
898         if (par->lcd_table != 0) {
899                 if (!M64_HAS(LT_LCD_REGS)) {
900                         u32 lcd_index = aty_ld_le32(LCD_INDEX, par);
901                         crtc->lcd_index = lcd_index &
902                                 ~(LCD_INDEX_MASK | LCD_DISPLAY_DIS |
903                                   LCD_SRC_SEL | CRTC2_DISPLAY_DIS);
904                         aty_st_le32(LCD_INDEX, lcd_index, par);
905                 }
906
907                 if (!M64_HAS(MOBIL_BUS))
908                         crtc->lcd_index |= CRTC2_DISPLAY_DIS;
909
910                 crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par) | 0x4000;
911                 crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT;
912
913                 crtc->lcd_gen_cntl &=
914                         ~(HORZ_DIVBY2_EN | DIS_HOR_CRT_DIVBY2 | TVCLK_PM_EN |
915                         /*VCLK_DAC_PM_EN | USE_SHADOWED_VEND |*/
916                         USE_SHADOWED_ROWCUR | SHADOW_EN | SHADOW_RW_EN);
917                 crtc->lcd_gen_cntl |= DONT_SHADOW_VPAR | LOCK_8DOT;
918
919                 if ((crtc->lcd_gen_cntl & LCD_ON) &&
920                     ((xres > par->lcd_width) || (yres > par->lcd_height))) {
921                         /*
922                          * We cannot display the mode on the LCD. If the CRT is
923                          * enabled we can turn off the LCD.
924                          * If the CRT is off, it isn't a good idea to switch it
925                          * on; we don't know if one is connected. So it's better
926                          * to fail then.
927                          */
928                         if (crtc->lcd_gen_cntl & CRT_ON) {
929                                 if (!(var->activate & FB_ACTIVATE_TEST))
930                                         PRINTKI("Disable LCD panel, because video mode does not fit.\n");
931                                 crtc->lcd_gen_cntl &= ~LCD_ON;
932                                 /*aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl, par);*/
933                         } else {
934                                 if (!(var->activate & FB_ACTIVATE_TEST))
935                                         PRINTKE("Video mode exceeds size of LCD panel.\nConnect this computer to a conventional monitor if you really need this mode.\n");
936                                 return -EINVAL;
937                         }
938                 }
939         }
940
941         if ((par->lcd_table != 0) && (crtc->lcd_gen_cntl & LCD_ON)) {
942                 int VScan = 1;
943                 /* bpp -> bytespp, 1,4 -> 0; 8 -> 2; 15,16 -> 1; 24 -> 6; 32 -> 5
944                 const u8 DFP_h_sync_dly_LT[] = { 0, 2, 1, 6, 5 };
945                 const u8 ADD_to_strt_wid_and_dly_LT_DAC[] = { 0, 5, 6, 9, 9, 12, 12 };  */
946
947                 vmode &= ~(FB_VMODE_DOUBLE | FB_VMODE_INTERLACED);
948
949                 /*
950                  * This is horror! When we simulate, say 640x480 on an 800x600
951                  * LCD monitor, the CRTC should be programmed 800x600 values for
952                  * the non visible part, but 640x480 for the visible part.
953                  * This code has been tested on a laptop with it's 1400x1050 LCD
954                  * monitor and a conventional monitor both switched on.
955                  * Tested modes: 1280x1024, 1152x864, 1024x768, 800x600,
956                  * works with little glitches also with DOUBLESCAN modes
957                  */
958                 if (yres < par->lcd_height) {
959                         VScan = par->lcd_height / yres;
960                         if (VScan > 1) {
961                                 VScan = 2;
962                                 vmode |= FB_VMODE_DOUBLE;
963                         }
964                 }
965
966                 h_sync_strt = h_disp + par->lcd_right_margin;
967                 h_sync_end = h_sync_strt + par->lcd_hsync_len;
968                 h_sync_dly = /*DFP_h_sync_dly[ ( bpp + 1 ) / 3 ]; */par->lcd_hsync_dly;
969                 h_total = h_disp + par->lcd_hblank_len;
970
971                 v_sync_strt = v_disp + par->lcd_lower_margin / VScan;
972                 v_sync_end = v_sync_strt + par->lcd_vsync_len / VScan;
973                 v_total = v_disp + par->lcd_vblank_len / VScan;
974         }
975 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
976
977         h_disp = (h_disp >> 3) - 1;
978         h_sync_strt = (h_sync_strt >> 3) - 1;
979         h_sync_end = (h_sync_end >> 3) - 1;
980         h_total = (h_total >> 3) - 1;
981         h_sync_wid = h_sync_end - h_sync_strt;
982
983         FAIL_MAX("h_disp too large", h_disp, 0xff);
984         FAIL_MAX("h_sync_strt too large", h_sync_strt, 0x1ff);
985         /*FAIL_MAX("h_sync_wid too large", h_sync_wid, 0x1f);*/
986         if (h_sync_wid > 0x1f)
987                 h_sync_wid = 0x1f;
988         FAIL_MAX("h_total too large", h_total, 0x1ff);
989
990         if (vmode & FB_VMODE_DOUBLE) {
991                 v_disp <<= 1;
992                 v_sync_strt <<= 1;
993                 v_sync_end <<= 1;
994                 v_total <<= 1;
995         }
996
997         v_disp--;
998         v_sync_strt--;
999         v_sync_end--;
1000         v_total--;
1001         v_sync_wid = v_sync_end - v_sync_strt;
1002
1003         FAIL_MAX("v_disp too large", v_disp, 0x7ff);
1004         FAIL_MAX("v_sync_stsrt too large", v_sync_strt, 0x7ff);
1005         /*FAIL_MAX("v_sync_wid too large", v_sync_wid, 0x1f);*/
1006         if (v_sync_wid > 0x1f)
1007                 v_sync_wid = 0x1f;
1008         FAIL_MAX("v_total too large", v_total, 0x7ff);
1009
1010         c_sync = sync & FB_SYNC_COMP_HIGH_ACT ? CRTC_CSYNC_EN : 0;
1011
1012         /* output */
1013         crtc->vxres = vxres;
1014         crtc->vyres = vyres;
1015         crtc->xoffset = xoffset;
1016         crtc->yoffset = yoffset;
1017         crtc->bpp = bpp;
1018         crtc->off_pitch =
1019                 ((yoffset * line_length + xoffset * bpp / 8) / 8) |
1020                 ((line_length / bpp) << 22);
1021         crtc->vline_crnt_vline = 0;
1022
1023         crtc->h_tot_disp = h_total | (h_disp << 16);
1024         crtc->h_sync_strt_wid = (h_sync_strt & 0xff) | (h_sync_dly << 8) |
1025                 ((h_sync_strt & 0x100) << 4) | (h_sync_wid << 16) |
1026                 (h_sync_pol << 21);
1027         crtc->v_tot_disp = v_total | (v_disp << 16);
1028         crtc->v_sync_strt_wid = v_sync_strt | (v_sync_wid << 16) |
1029                 (v_sync_pol << 21);
1030
1031         /* crtc->gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_PRESERVED_MASK; */
1032         crtc->gen_cntl = CRTC_EXT_DISP_EN | CRTC_EN | pix_width | c_sync;
1033         crtc->gen_cntl |= CRTC_VGA_LINEAR;
1034
1035         /* Enable doublescan mode if requested */
1036         if (vmode & FB_VMODE_DOUBLE)
1037                 crtc->gen_cntl |= CRTC_DBL_SCAN_EN;
1038         /* Enable interlaced mode if requested */
1039         if (vmode & FB_VMODE_INTERLACED)
1040                 crtc->gen_cntl |= CRTC_INTERLACE_EN;
1041 #ifdef CONFIG_FB_ATY_GENERIC_LCD
1042         if (par->lcd_table != 0) {
1043                 u32 vdisplay = yres;
1044                 if (vmode & FB_VMODE_DOUBLE)
1045                         vdisplay <<= 1;
1046                 crtc->gen_cntl &= ~(CRTC2_EN | CRTC2_PIX_WIDTH);
1047                 crtc->lcd_gen_cntl &= ~(HORZ_DIVBY2_EN | DIS_HOR_CRT_DIVBY2 |
1048                                         /*TVCLK_PM_EN | VCLK_DAC_PM_EN |*/
1049                                         USE_SHADOWED_VEND |
1050                                         USE_SHADOWED_ROWCUR |
1051                                         SHADOW_EN | SHADOW_RW_EN);
1052                 crtc->lcd_gen_cntl |= DONT_SHADOW_VPAR/* | LOCK_8DOT*/;
1053
1054                 /* MOBILITY M1 tested, FIXME: LT */
1055                 crtc->horz_stretching = aty_ld_lcd(HORZ_STRETCHING, par);
1056                 if (!M64_HAS(LT_LCD_REGS))
1057                         crtc->ext_vert_stretch = aty_ld_lcd(EXT_VERT_STRETCH, par) &
1058                                 ~(AUTO_VERT_RATIO | VERT_STRETCH_MODE | VERT_STRETCH_RATIO3);
1059
1060                 crtc->horz_stretching &= ~(HORZ_STRETCH_RATIO |
1061                                            HORZ_STRETCH_LOOP | AUTO_HORZ_RATIO |
1062                                            HORZ_STRETCH_MODE | HORZ_STRETCH_EN);
1063                 if (xres < par->lcd_width && crtc->lcd_gen_cntl & LCD_ON) {
1064                         do {
1065                                 /*
1066                                  * The horizontal blender misbehaves when
1067                                  * HDisplay is less than a certain threshold
1068                                  * (440 for a 1024-wide panel).  It doesn't
1069                                  * stretch such modes enough.  Use pixel
1070                                  * replication instead of blending to stretch
1071                                  * modes that can be made to exactly fit the
1072                                  * panel width.  The undocumented "NoLCDBlend"
1073                                  * option allows the pixel-replicated mode to
1074                                  * be slightly wider or narrower than the
1075                                  * panel width.  It also causes a mode that is
1076                                  * exactly half as wide as the panel to be
1077                                  * pixel-replicated, rather than blended.
1078                                  */
1079                                 int HDisplay  = xres & ~7;
1080                                 int nStretch  = par->lcd_width / HDisplay;
1081                                 int Remainder = par->lcd_width % HDisplay;
1082
1083                                 if ((!Remainder && ((nStretch > 2))) ||
1084                                     (((HDisplay * 16) / par->lcd_width) < 7)) {
1085                                         static const char StretchLoops[] = { 10, 12, 13, 15, 16 };
1086                                         int horz_stretch_loop = -1, BestRemainder;
1087                                         int Numerator = HDisplay, Denominator = par->lcd_width;
1088                                         int Index = 5;
1089                                         ATIReduceRatio(&Numerator, &Denominator);
1090
1091                                         BestRemainder = (Numerator * 16) / Denominator;
1092                                         while (--Index >= 0) {
1093                                                 Remainder = ((Denominator - Numerator) * StretchLoops[Index]) %
1094                                                         Denominator;
1095                                                 if (Remainder < BestRemainder) {
1096                                                         horz_stretch_loop = Index;
1097                                                         if (!(BestRemainder = Remainder))
1098                                                                 break;
1099                                                 }
1100                                         }
1101
1102                                         if ((horz_stretch_loop >= 0) && !BestRemainder) {
1103                                                 int horz_stretch_ratio = 0, Accumulator = 0;
1104                                                 int reuse_previous = 1;
1105
1106                                                 Index = StretchLoops[horz_stretch_loop];
1107
1108                                                 while (--Index >= 0) {
1109                                                         if (Accumulator > 0)
1110                                                                 horz_stretch_ratio |= reuse_previous;
1111                                                         else
1112                                                                 Accumulator += Denominator;
1113                                                         Accumulator -= Numerator;
1114                                                         reuse_previous <<= 1;
1115                                                 }
1116
1117                                                 crtc->horz_stretching |= (HORZ_STRETCH_EN |
1118                                                         ((horz_stretch_loop & HORZ_STRETCH_LOOP) << 16) |
1119                                                         (horz_stretch_ratio & HORZ_STRETCH_RATIO));
1120                                                 break;      /* Out of the do { ... } while (0) */
1121                                         }
1122                                 }
1123
1124                                 crtc->horz_stretching |= (HORZ_STRETCH_MODE | HORZ_STRETCH_EN |
1125                                         (((HDisplay * (HORZ_STRETCH_BLEND + 1)) / par->lcd_width) & HORZ_STRETCH_BLEND));
1126                         } while (0);
1127                 }
1128
1129                 if (vdisplay < par->lcd_height && crtc->lcd_gen_cntl & LCD_ON) {
1130                         crtc->vert_stretching = (VERT_STRETCH_USE0 | VERT_STRETCH_EN |
1131                                 (((vdisplay * (VERT_STRETCH_RATIO0 + 1)) / par->lcd_height) & VERT_STRETCH_RATIO0));
1132
1133                         if (!M64_HAS(LT_LCD_REGS) &&
1134                             xres <= (M64_HAS(MOBIL_BUS) ? 1024 : 800))
1135                                 crtc->ext_vert_stretch |= VERT_STRETCH_MODE;
1136                 } else {
1137                         /*
1138                          * Don't use vertical blending if the mode is too wide
1139                          * or not vertically stretched.
1140                          */
1141                         crtc->vert_stretching = 0;
1142                 }
1143                 /* copy to shadow crtc */
1144                 crtc->shadow_h_tot_disp = crtc->h_tot_disp;
1145                 crtc->shadow_h_sync_strt_wid = crtc->h_sync_strt_wid;
1146                 crtc->shadow_v_tot_disp = crtc->v_tot_disp;
1147                 crtc->shadow_v_sync_strt_wid = crtc->v_sync_strt_wid;
1148         }
1149 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
1150
1151         if (M64_HAS(MAGIC_FIFO)) {
1152                 /* FIXME: display FIFO low watermark values */
1153                 crtc->gen_cntl |= (aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_FIFO_LWM);
1154         }
1155         crtc->dp_pix_width = dp_pix_width;
1156         crtc->dp_chain_mask = dp_chain_mask;
1157
1158         return 0;
1159 }
1160
1161 static int aty_crtc_to_var(const struct crtc *crtc,
1162                            struct fb_var_screeninfo *var)
1163 {
1164         u32 xres, yres, bpp, left, right, upper, lower, hslen, vslen, sync;
1165         u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol;
1166         u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync;
1167         u32 pix_width;
1168         u32 double_scan, interlace;
1169
1170         /* input */
1171         h_total = crtc->h_tot_disp & 0x1ff;
1172         h_disp = (crtc->h_tot_disp >> 16) & 0xff;
1173         h_sync_strt = (crtc->h_sync_strt_wid & 0xff) | ((crtc->h_sync_strt_wid >> 4) & 0x100);
1174         h_sync_dly = (crtc->h_sync_strt_wid >> 8) & 0x7;
1175         h_sync_wid = (crtc->h_sync_strt_wid >> 16) & 0x1f;
1176         h_sync_pol = (crtc->h_sync_strt_wid >> 21) & 0x1;
1177         v_total = crtc->v_tot_disp & 0x7ff;
1178         v_disp = (crtc->v_tot_disp >> 16) & 0x7ff;
1179         v_sync_strt = crtc->v_sync_strt_wid & 0x7ff;
1180         v_sync_wid = (crtc->v_sync_strt_wid >> 16) & 0x1f;
1181         v_sync_pol = (crtc->v_sync_strt_wid >> 21) & 0x1;
1182         c_sync = crtc->gen_cntl & CRTC_CSYNC_EN ? 1 : 0;
1183         pix_width = crtc->gen_cntl & CRTC_PIX_WIDTH_MASK;
1184         double_scan = crtc->gen_cntl & CRTC_DBL_SCAN_EN;
1185         interlace = crtc->gen_cntl & CRTC_INTERLACE_EN;
1186
1187         /* convert */
1188         xres = (h_disp + 1) * 8;
1189         yres = v_disp + 1;
1190         left = (h_total - h_sync_strt - h_sync_wid) * 8 - h_sync_dly;
1191         right = (h_sync_strt - h_disp) * 8 + h_sync_dly;
1192         hslen = h_sync_wid * 8;
1193         upper = v_total - v_sync_strt - v_sync_wid;
1194         lower = v_sync_strt - v_disp;
1195         vslen = v_sync_wid;
1196         sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) |
1197                 (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT) |
1198                 (c_sync ? FB_SYNC_COMP_HIGH_ACT : 0);
1199
1200         switch (pix_width) {
1201         case CRTC_PIX_WIDTH_8BPP:
1202                 bpp = 8;
1203                 var->red.offset = 0;
1204                 var->red.length = 8;
1205                 var->green.offset = 0;
1206                 var->green.length = 8;
1207                 var->blue.offset = 0;
1208                 var->blue.length = 8;
1209                 var->transp.offset = 0;
1210                 var->transp.length = 0;
1211                 break;
1212         case CRTC_PIX_WIDTH_15BPP:      /* RGB 555 */
1213                 bpp = 16;
1214                 var->red.offset = 10;
1215                 var->red.length = 5;
1216                 var->green.offset = 5;
1217                 var->green.length = 5;
1218                 var->blue.offset = 0;
1219                 var->blue.length = 5;
1220                 var->transp.offset = 0;
1221                 var->transp.length = 0;
1222                 break;
1223         case CRTC_PIX_WIDTH_16BPP:      /* RGB 565 */
1224                 bpp = 16;
1225                 var->red.offset = 11;
1226                 var->red.length = 5;
1227                 var->green.offset = 5;
1228                 var->green.length = 6;
1229                 var->blue.offset = 0;
1230                 var->blue.length = 5;
1231                 var->transp.offset = 0;
1232                 var->transp.length = 0;
1233                 break;
1234         case CRTC_PIX_WIDTH_24BPP:      /* RGB 888 */
1235                 bpp = 24;
1236                 var->red.offset = 16;
1237                 var->red.length = 8;
1238                 var->green.offset = 8;
1239                 var->green.length = 8;
1240                 var->blue.offset = 0;
1241                 var->blue.length = 8;
1242                 var->transp.offset = 0;
1243                 var->transp.length = 0;
1244                 break;
1245         case CRTC_PIX_WIDTH_32BPP:      /* ARGB 8888 */
1246                 bpp = 32;
1247                 var->red.offset = 16;
1248                 var->red.length = 8;
1249                 var->green.offset = 8;
1250                 var->green.length = 8;
1251                 var->blue.offset = 0;
1252                 var->blue.length = 8;
1253                 var->transp.offset = 24;
1254                 var->transp.length = 8;
1255                 break;
1256         default:
1257                 PRINTKE("Invalid pixel width\n");
1258                 return -EINVAL;
1259         }
1260
1261         /* output */
1262         var->xres = xres;
1263         var->yres = yres;
1264         var->xres_virtual = crtc->vxres;
1265         var->yres_virtual = crtc->vyres;
1266         var->bits_per_pixel = bpp;
1267         var->left_margin = left;
1268         var->right_margin = right;
1269         var->upper_margin = upper;
1270         var->lower_margin = lower;
1271         var->hsync_len = hslen;
1272         var->vsync_len = vslen;
1273         var->sync = sync;
1274         var->vmode = FB_VMODE_NONINTERLACED;
1275         /*
1276          * In double scan mode, the vertical parameters are doubled,
1277          * so we need to halve them to get the right values.
1278          * In interlaced mode the values are already correct,
1279          * so no correction is necessary.
1280          */
1281         if (interlace)
1282                 var->vmode = FB_VMODE_INTERLACED;
1283
1284         if (double_scan) {
1285                 var->vmode = FB_VMODE_DOUBLE;
1286                 var->yres >>= 1;
1287                 var->upper_margin >>= 1;
1288                 var->lower_margin >>= 1;
1289                 var->vsync_len >>= 1;
1290         }
1291
1292         return 0;
1293 }
1294
1295 /* ------------------------------------------------------------------------- */
1296
1297 static int atyfb_set_par(struct fb_info *info)
1298 {
1299         struct atyfb_par *par = (struct atyfb_par *) info->par;
1300         struct fb_var_screeninfo *var = &info->var;
1301         u32 tmp, pixclock;
1302         int err;
1303 #ifdef DEBUG
1304         struct fb_var_screeninfo debug;
1305         u32 pixclock_in_ps;
1306 #endif
1307         if (par->asleep)
1308                 return 0;
1309
1310         err = aty_var_to_crtc(info, var, &par->crtc);
1311         if (err)
1312                 return err;
1313
1314         pixclock = atyfb_get_pixclock(var, par);
1315
1316         if (pixclock == 0) {
1317                 PRINTKE("Invalid pixclock\n");
1318                 return -EINVAL;
1319         } else {
1320                 err = par->pll_ops->var_to_pll(info, pixclock,
1321                                                var->bits_per_pixel, &par->pll);
1322                 if (err)
1323                         return err;
1324         }
1325
1326         par->accel_flags = var->accel_flags; /* hack */
1327
1328         if (var->accel_flags) {
1329                 info->fbops->fb_sync = atyfb_sync;
1330                 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1331         } else {
1332                 info->fbops->fb_sync = NULL;
1333                 info->flags |= FBINFO_HWACCEL_DISABLED;
1334         }
1335
1336         if (par->blitter_may_be_busy)
1337                 wait_for_idle(par);
1338
1339         aty_set_crtc(par, &par->crtc);
1340         par->dac_ops->set_dac(info, &par->pll,
1341                               var->bits_per_pixel, par->accel_flags);
1342         par->pll_ops->set_pll(info, &par->pll);
1343
1344 #ifdef DEBUG
1345         if (par->pll_ops && par->pll_ops->pll_to_var)
1346                 pixclock_in_ps = par->pll_ops->pll_to_var(info, &par->pll);
1347         else
1348                 pixclock_in_ps = 0;
1349
1350         if (0 == pixclock_in_ps) {
1351                 PRINTKE("ALERT ops->pll_to_var get 0\n");
1352                 pixclock_in_ps = pixclock;
1353         }
1354
1355         memset(&debug, 0, sizeof(debug));
1356         if (!aty_crtc_to_var(&par->crtc, &debug)) {
1357                 u32 hSync, vRefresh;
1358                 u32 h_disp, h_sync_strt, h_sync_end, h_total;
1359                 u32 v_disp, v_sync_strt, v_sync_end, v_total;
1360
1361                 h_disp = debug.xres;
1362                 h_sync_strt = h_disp + debug.right_margin;
1363                 h_sync_end = h_sync_strt + debug.hsync_len;
1364                 h_total = h_sync_end + debug.left_margin;
1365                 v_disp = debug.yres;
1366                 v_sync_strt = v_disp + debug.lower_margin;
1367                 v_sync_end = v_sync_strt + debug.vsync_len;
1368                 v_total = v_sync_end + debug.upper_margin;
1369
1370                 hSync = 1000000000 / (pixclock_in_ps * h_total);
1371                 vRefresh = (hSync * 1000) / v_total;
1372                 if (par->crtc.gen_cntl & CRTC_INTERLACE_EN)
1373                         vRefresh *= 2;
1374                 if (par->crtc.gen_cntl & CRTC_DBL_SCAN_EN)
1375                         vRefresh /= 2;
1376
1377                 DPRINTK("atyfb_set_par\n");
1378                 DPRINTK(" Set Visible Mode to %ix%i-%i\n",
1379                         var->xres, var->yres, var->bits_per_pixel);
1380                 DPRINTK(" Virtual resolution %ix%i, "
1381                         "pixclock_in_ps %i (calculated %i)\n",
1382                         var->xres_virtual, var->yres_virtual,
1383                         pixclock, pixclock_in_ps);
1384                 DPRINTK(" Dot clock:           %i MHz\n",
1385                         1000000 / pixclock_in_ps);
1386                 DPRINTK(" Horizontal sync:     %i kHz\n", hSync);
1387                 DPRINTK(" Vertical refresh:    %i Hz\n", vRefresh);
1388                 DPRINTK(" x  style: %i.%03i %i %i %i %i   %i %i %i %i\n",
1389                         1000000 / pixclock_in_ps, 1000000 % pixclock_in_ps,
1390                         h_disp, h_sync_strt, h_sync_end, h_total,
1391                         v_disp, v_sync_strt, v_sync_end, v_total);
1392                 DPRINTK(" fb style: %i  %i %i %i %i %i %i %i %i\n",
1393                         pixclock_in_ps,
1394                         debug.left_margin, h_disp, debug.right_margin, debug.hsync_len,
1395                         debug.upper_margin, v_disp, debug.lower_margin, debug.vsync_len);
1396         }
1397 #endif /* DEBUG */
1398
1399         if (!M64_HAS(INTEGRATED)) {
1400                 /* Don't forget MEM_CNTL */
1401                 tmp = aty_ld_le32(MEM_CNTL, par) & 0xf0ffffff;
1402                 switch (var->bits_per_pixel) {
1403                 case 8:
1404                         tmp |= 0x02000000;
1405                         break;
1406                 case 16:
1407                         tmp |= 0x03000000;
1408                         break;
1409                 case 32:
1410                         tmp |= 0x06000000;
1411                         break;
1412                 }
1413                 aty_st_le32(MEM_CNTL, tmp, par);
1414         } else {
1415                 tmp = aty_ld_le32(MEM_CNTL, par) & 0xf00fffff;
1416                 if (!M64_HAS(MAGIC_POSTDIV))
1417                         tmp |= par->mem_refresh_rate << 20;
1418                 switch (var->bits_per_pixel) {
1419                 case 8:
1420                 case 24:
1421                         tmp |= 0x00000000;
1422                         break;
1423                 case 16:
1424                         tmp |= 0x04000000;
1425                         break;
1426                 case 32:
1427                         tmp |= 0x08000000;
1428                         break;
1429                 }
1430                 if (M64_HAS(CT_BUS)) {
1431                         aty_st_le32(DAC_CNTL, 0x87010184, par);
1432                         aty_st_le32(BUS_CNTL, 0x680000f9, par);
1433                 } else if (M64_HAS(VT_BUS)) {
1434                         aty_st_le32(DAC_CNTL, 0x87010184, par);
1435                         aty_st_le32(BUS_CNTL, 0x680000f9, par);
1436                 } else if (M64_HAS(MOBIL_BUS)) {
1437                         aty_st_le32(DAC_CNTL, 0x80010102, par);
1438                         aty_st_le32(BUS_CNTL, 0x7b33a040 | (par->aux_start ? BUS_APER_REG_DIS : 0), par);
1439                 } else {
1440                         /* GT */
1441                         aty_st_le32(DAC_CNTL, 0x86010102, par);
1442                         aty_st_le32(BUS_CNTL, 0x7b23a040 | (par->aux_start ? BUS_APER_REG_DIS : 0), par);
1443                         aty_st_le32(EXT_MEM_CNTL, aty_ld_le32(EXT_MEM_CNTL, par) | 0x5000001, par);
1444                 }
1445                 aty_st_le32(MEM_CNTL, tmp, par);
1446         }
1447         aty_st_8(DAC_MASK, 0xff, par);
1448
1449         info->fix.line_length = calc_line_length(par, var->xres_virtual,
1450                                                  var->bits_per_pixel);
1451
1452         info->fix.visual = var->bits_per_pixel <= 8 ?
1453                 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1454
1455         /* Initialize the graphics engine */
1456         if (par->accel_flags & FB_ACCELF_TEXT)
1457                 aty_init_engine(par, info);
1458
1459 #ifdef CONFIG_BOOTX_TEXT
1460         btext_update_display(info->fix.smem_start,
1461                 (((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8,
1462                 ((par->crtc.v_tot_disp >> 16) & 0x7ff) + 1,
1463                 var->bits_per_pixel,
1464                 par->crtc.vxres * var->bits_per_pixel / 8);
1465 #endif /* CONFIG_BOOTX_TEXT */
1466 #ifdef DEBUG
1467 {
1468         /* dump non shadow CRTC, pll, LCD registers */
1469         int i; u32 base;
1470
1471         /* CRTC registers */
1472         base = 0x2000;
1473         printk("debug atyfb: Mach64 non-shadow register values:");
1474         for (i = 0; i < 256; i = i+4) {
1475                 if (i % 16 == 0) {
1476                         pr_cont("\n");
1477                         printk("debug atyfb: 0x%04X: ", base + i);
1478                 }
1479                 pr_cont(" %08X", aty_ld_le32(i, par));
1480         }
1481         pr_cont("\n\n");
1482
1483 #ifdef CONFIG_FB_ATY_CT
1484         /* PLL registers */
1485         base = 0x00;
1486         printk("debug atyfb: Mach64 PLL register values:");
1487         for (i = 0; i < 64; i++) {
1488                 if (i % 16 == 0) {
1489                         pr_cont("\n");
1490                         printk("debug atyfb: 0x%02X: ", base + i);
1491                 }
1492                 if (i % 4 == 0)
1493                         pr_cont(" ");
1494                 pr_cont("%02X", aty_ld_pll_ct(i, par));
1495         }
1496         pr_cont("\n\n");
1497 #endif  /* CONFIG_FB_ATY_CT */
1498
1499 #ifdef CONFIG_FB_ATY_GENERIC_LCD
1500         if (par->lcd_table != 0) {
1501                 /* LCD registers */
1502                 base = 0x00;
1503                 printk("debug atyfb: LCD register values:");
1504                 if (M64_HAS(LT_LCD_REGS)) {
1505                         for (i = 0; i <= POWER_MANAGEMENT; i++) {
1506                                 if (i == EXT_VERT_STRETCH)
1507                                         continue;
1508                                 pr_cont("\ndebug atyfb: 0x%04X: ",
1509                                        lt_lcd_regs[i]);
1510                                 pr_cont(" %08X", aty_ld_lcd(i, par));
1511                         }
1512                 } else {
1513                         for (i = 0; i < 64; i++) {
1514                                 if (i % 4 == 0)
1515                                         pr_cont("\ndebug atyfb: 0x%02X: ",
1516                                                base + i);
1517                                 pr_cont(" %08X", aty_ld_lcd(i, par));
1518                         }
1519                 }
1520                 pr_cont("\n\n");
1521         }
1522 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
1523 }
1524 #endif /* DEBUG */
1525         return 0;
1526 }
1527
1528 static int atyfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1529 {
1530         struct atyfb_par *par = (struct atyfb_par *) info->par;
1531         int err;
1532         struct crtc crtc;
1533         union aty_pll pll;
1534         u32 pixclock;
1535
1536         memcpy(&pll, &par->pll, sizeof(pll));
1537
1538         err = aty_var_to_crtc(info, var, &crtc);
1539         if (err)
1540                 return err;
1541
1542         pixclock = atyfb_get_pixclock(var, par);
1543
1544         if (pixclock == 0) {
1545                 if (!(var->activate & FB_ACTIVATE_TEST))
1546                         PRINTKE("Invalid pixclock\n");
1547                 return -EINVAL;
1548         } else {
1549                 err = par->pll_ops->var_to_pll(info, pixclock,
1550                                                var->bits_per_pixel, &pll);
1551                 if (err)
1552                         return err;
1553         }
1554
1555         if (var->accel_flags & FB_ACCELF_TEXT)
1556                 info->var.accel_flags = FB_ACCELF_TEXT;
1557         else
1558                 info->var.accel_flags = 0;
1559
1560         aty_crtc_to_var(&crtc, var);
1561         var->pixclock = par->pll_ops->pll_to_var(info, &pll);
1562         return 0;
1563 }
1564
1565 static void set_off_pitch(struct atyfb_par *par, const struct fb_info *info)
1566 {
1567         u32 xoffset = info->var.xoffset;
1568         u32 yoffset = info->var.yoffset;
1569         u32 line_length = info->fix.line_length;
1570         u32 bpp = info->var.bits_per_pixel;
1571
1572         par->crtc.off_pitch =
1573                 ((yoffset * line_length + xoffset * bpp / 8) / 8) |
1574                 ((line_length / bpp) << 22);
1575 }
1576
1577
1578 /*
1579  * Open/Release the frame buffer device
1580  */
1581
1582 static int atyfb_open(struct fb_info *info, int user)
1583 {
1584         struct atyfb_par *par = (struct atyfb_par *) info->par;
1585
1586         if (user) {
1587                 par->open++;
1588 #ifdef __sparc__
1589                 par->mmaped = 0;
1590 #endif
1591         }
1592         return 0;
1593 }
1594
1595 static irqreturn_t aty_irq(int irq, void *dev_id)
1596 {
1597         struct atyfb_par *par = dev_id;
1598         int handled = 0;
1599         u32 int_cntl;
1600
1601         spin_lock(&par->int_lock);
1602
1603         int_cntl = aty_ld_le32(CRTC_INT_CNTL, par);
1604
1605         if (int_cntl & CRTC_VBLANK_INT) {
1606                 /* clear interrupt */
1607                 aty_st_le32(CRTC_INT_CNTL, (int_cntl & CRTC_INT_EN_MASK) |
1608                             CRTC_VBLANK_INT_AK, par);
1609                 par->vblank.count++;
1610                 if (par->vblank.pan_display) {
1611                         par->vblank.pan_display = 0;
1612                         aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1613                 }
1614                 wake_up_interruptible(&par->vblank.wait);
1615                 handled = 1;
1616         }
1617
1618         spin_unlock(&par->int_lock);
1619
1620         return IRQ_RETVAL(handled);
1621 }
1622
1623 static int aty_enable_irq(struct atyfb_par *par, int reenable)
1624 {
1625         u32 int_cntl;
1626
1627         if (!test_and_set_bit(0, &par->irq_flags)) {
1628                 if (request_irq(par->irq, aty_irq, IRQF_SHARED, "atyfb", par)) {
1629                         clear_bit(0, &par->irq_flags);
1630                         return -EINVAL;
1631                 }
1632                 spin_lock_irq(&par->int_lock);
1633                 int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1634                 /* clear interrupt */
1635                 aty_st_le32(CRTC_INT_CNTL, int_cntl | CRTC_VBLANK_INT_AK, par);
1636                 /* enable interrupt */
1637                 aty_st_le32(CRTC_INT_CNTL, int_cntl | CRTC_VBLANK_INT_EN, par);
1638                 spin_unlock_irq(&par->int_lock);
1639         } else if (reenable) {
1640                 spin_lock_irq(&par->int_lock);
1641                 int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1642                 if (!(int_cntl & CRTC_VBLANK_INT_EN)) {
1643                         printk("atyfb: someone disabled IRQ [%08x]\n",
1644                                int_cntl);
1645                         /* re-enable interrupt */
1646                         aty_st_le32(CRTC_INT_CNTL, int_cntl |
1647                                     CRTC_VBLANK_INT_EN, par);
1648                 }
1649                 spin_unlock_irq(&par->int_lock);
1650         }
1651
1652         return 0;
1653 }
1654
1655 static int aty_disable_irq(struct atyfb_par *par)
1656 {
1657         u32 int_cntl;
1658
1659         if (test_and_clear_bit(0, &par->irq_flags)) {
1660                 if (par->vblank.pan_display) {
1661                         par->vblank.pan_display = 0;
1662                         aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1663                 }
1664                 spin_lock_irq(&par->int_lock);
1665                 int_cntl = aty_ld_le32(CRTC_INT_CNTL, par) & CRTC_INT_EN_MASK;
1666                 /* disable interrupt */
1667                 aty_st_le32(CRTC_INT_CNTL, int_cntl & ~CRTC_VBLANK_INT_EN, par);
1668                 spin_unlock_irq(&par->int_lock);
1669                 free_irq(par->irq, par);
1670         }
1671
1672         return 0;
1673 }
1674
1675 static int atyfb_release(struct fb_info *info, int user)
1676 {
1677         struct atyfb_par *par = (struct atyfb_par *) info->par;
1678 #ifdef __sparc__
1679         int was_mmaped;
1680 #endif
1681
1682         if (!user)
1683                 return 0;
1684
1685         par->open--;
1686         mdelay(1);
1687         wait_for_idle(par);
1688
1689         if (par->open)
1690                 return 0;
1691
1692 #ifdef __sparc__
1693         was_mmaped = par->mmaped;
1694
1695         par->mmaped = 0;
1696
1697         if (was_mmaped) {
1698                 struct fb_var_screeninfo var;
1699
1700                 /*
1701                  * Now reset the default display config, we have
1702                  * no idea what the program(s) which mmap'd the
1703                  * chip did to the configuration, nor whether it
1704                  * restored it correctly.
1705                  */
1706                 var = default_var;
1707                 if (noaccel)
1708                         var.accel_flags &= ~FB_ACCELF_TEXT;
1709                 else
1710                         var.accel_flags |= FB_ACCELF_TEXT;
1711                 if (var.yres == var.yres_virtual) {
1712                         u32 videoram = (info->fix.smem_len - (PAGE_SIZE << 2));
1713                         var.yres_virtual =
1714                                 ((videoram * 8) / var.bits_per_pixel) /
1715                                 var.xres_virtual;
1716                         if (var.yres_virtual < var.yres)
1717                                 var.yres_virtual = var.yres;
1718                 }
1719         }
1720 #endif
1721         aty_disable_irq(par);
1722
1723         return 0;
1724 }
1725
1726 /*
1727  * Pan or Wrap the Display
1728  *
1729  * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
1730  */
1731
1732 static int atyfb_pan_display(struct fb_var_screeninfo *var,
1733                              struct fb_info *info)
1734 {
1735         struct atyfb_par *par = (struct atyfb_par *) info->par;
1736         u32 xres, yres, xoffset, yoffset;
1737
1738         xres = (((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8;
1739         yres = ((par->crtc.v_tot_disp >> 16) & 0x7ff) + 1;
1740         if (par->crtc.gen_cntl & CRTC_DBL_SCAN_EN)
1741                 yres >>= 1;
1742         xoffset = (var->xoffset + 7) & ~7;
1743         yoffset = var->yoffset;
1744         if (xoffset + xres > par->crtc.vxres ||
1745             yoffset + yres > par->crtc.vyres)
1746                 return -EINVAL;
1747         info->var.xoffset = xoffset;
1748         info->var.yoffset = yoffset;
1749         if (par->asleep)
1750                 return 0;
1751
1752         set_off_pitch(par, info);
1753         if ((var->activate & FB_ACTIVATE_VBL) && !aty_enable_irq(par, 0)) {
1754                 par->vblank.pan_display = 1;
1755         } else {
1756                 par->vblank.pan_display = 0;
1757                 aty_st_le32(CRTC_OFF_PITCH, par->crtc.off_pitch, par);
1758         }
1759
1760         return 0;
1761 }
1762
1763 static int aty_waitforvblank(struct atyfb_par *par, u32 crtc)
1764 {
1765         struct aty_interrupt *vbl;
1766         unsigned int count;
1767         int ret;
1768
1769         switch (crtc) {
1770         case 0:
1771                 vbl = &par->vblank;
1772                 break;
1773         default:
1774                 return -ENODEV;
1775         }
1776
1777         ret = aty_enable_irq(par, 0);
1778         if (ret)
1779                 return ret;
1780
1781         count = vbl->count;
1782         ret = wait_event_interruptible_timeout(vbl->wait,
1783                                                count != vbl->count, HZ/10);
1784         if (ret < 0)
1785                 return ret;
1786         if (ret == 0) {
1787                 aty_enable_irq(par, 1);
1788                 return -ETIMEDOUT;
1789         }
1790
1791         return 0;
1792 }
1793
1794
1795 #ifdef DEBUG
1796 #define ATYIO_CLKR              0x41545900      /* ATY\00 */
1797 #define ATYIO_CLKW              0x41545901      /* ATY\01 */
1798
1799 struct atyclk {
1800         u32 ref_clk_per;
1801         u8 pll_ref_div;
1802         u8 mclk_fb_div;
1803         u8 mclk_post_div;       /* 1,2,3,4,8 */
1804         u8 mclk_fb_mult;        /* 2 or 4 */
1805         u8 xclk_post_div;       /* 1,2,3,4,8 */
1806         u8 vclk_fb_div;
1807         u8 vclk_post_div;       /* 1,2,3,4,6,8,12 */
1808         u32 dsp_xclks_per_row;  /* 0-16383 */
1809         u32 dsp_loop_latency;   /* 0-15 */
1810         u32 dsp_precision;      /* 0-7 */
1811         u32 dsp_on;             /* 0-2047 */
1812         u32 dsp_off;            /* 0-2047 */
1813 };
1814
1815 #define ATYIO_FEATR             0x41545902      /* ATY\02 */
1816 #define ATYIO_FEATW             0x41545903      /* ATY\03 */
1817 #endif
1818
1819 static int atyfb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
1820 {
1821         struct atyfb_par *par = (struct atyfb_par *) info->par;
1822 #ifdef __sparc__
1823         struct fbtype fbtyp;
1824 #endif
1825
1826         switch (cmd) {
1827 #ifdef __sparc__
1828         case FBIOGTYPE:
1829                 fbtyp.fb_type = FBTYPE_PCI_GENERIC;
1830                 fbtyp.fb_width = par->crtc.vxres;
1831                 fbtyp.fb_height = par->crtc.vyres;
1832                 fbtyp.fb_depth = info->var.bits_per_pixel;
1833                 fbtyp.fb_cmsize = info->cmap.len;
1834                 fbtyp.fb_size = info->fix.smem_len;
1835                 if (copy_to_user((struct fbtype __user *) arg, &fbtyp,
1836                                  sizeof(fbtyp)))
1837                         return -EFAULT;
1838                 break;
1839 #endif /* __sparc__ */
1840
1841         case FBIO_WAITFORVSYNC:
1842                 {
1843                         u32 crtc;
1844
1845                         if (get_user(crtc, (__u32 __user *) arg))
1846                                 return -EFAULT;
1847
1848                         return aty_waitforvblank(par, crtc);
1849                 }
1850
1851 #if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
1852         case ATYIO_CLKR:
1853                 if (M64_HAS(INTEGRATED)) {
1854                         struct atyclk clk = { 0 };
1855                         union aty_pll *pll = &par->pll;
1856                         u32 dsp_config = pll->ct.dsp_config;
1857                         u32 dsp_on_off = pll->ct.dsp_on_off;
1858                         clk.ref_clk_per = par->ref_clk_per;
1859                         clk.pll_ref_div = pll->ct.pll_ref_div;
1860                         clk.mclk_fb_div = pll->ct.mclk_fb_div;
1861                         clk.mclk_post_div = pll->ct.mclk_post_div_real;
1862                         clk.mclk_fb_mult = pll->ct.mclk_fb_mult;
1863                         clk.xclk_post_div = pll->ct.xclk_post_div_real;
1864                         clk.vclk_fb_div = pll->ct.vclk_fb_div;
1865                         clk.vclk_post_div = pll->ct.vclk_post_div_real;
1866                         clk.dsp_xclks_per_row = dsp_config & 0x3fff;
1867                         clk.dsp_loop_latency = (dsp_config >> 16) & 0xf;
1868                         clk.dsp_precision = (dsp_config >> 20) & 7;
1869                         clk.dsp_off = dsp_on_off & 0x7ff;
1870                         clk.dsp_on = (dsp_on_off >> 16) & 0x7ff;
1871                         if (copy_to_user((struct atyclk __user *) arg, &clk,
1872                                          sizeof(clk)))
1873                                 return -EFAULT;
1874                 } else
1875                         return -EINVAL;
1876                 break;
1877         case ATYIO_CLKW:
1878                 if (M64_HAS(INTEGRATED)) {
1879                         struct atyclk clk;
1880                         union aty_pll *pll = &par->pll;
1881                         if (copy_from_user(&clk, (struct atyclk __user *) arg,
1882                                            sizeof(clk)))
1883                                 return -EFAULT;
1884                         par->ref_clk_per = clk.ref_clk_per;
1885                         pll->ct.pll_ref_div = clk.pll_ref_div;
1886                         pll->ct.mclk_fb_div = clk.mclk_fb_div;
1887                         pll->ct.mclk_post_div_real = clk.mclk_post_div;
1888                         pll->ct.mclk_fb_mult = clk.mclk_fb_mult;
1889                         pll->ct.xclk_post_div_real = clk.xclk_post_div;
1890                         pll->ct.vclk_fb_div = clk.vclk_fb_div;
1891                         pll->ct.vclk_post_div_real = clk.vclk_post_div;
1892                         pll->ct.dsp_config = (clk.dsp_xclks_per_row & 0x3fff) |
1893                                 ((clk.dsp_loop_latency & 0xf) << 16) |
1894                                 ((clk.dsp_precision & 7) << 20);
1895                         pll->ct.dsp_on_off = (clk.dsp_off & 0x7ff) |
1896                                 ((clk.dsp_on & 0x7ff) << 16);
1897                         /*aty_calc_pll_ct(info, &pll->ct);*/
1898                         aty_set_pll_ct(info, pll);
1899                 } else
1900                         return -EINVAL;
1901                 break;
1902         case ATYIO_FEATR:
1903                 if (get_user(par->features, (u32 __user *) arg))
1904                         return -EFAULT;
1905                 break;
1906         case ATYIO_FEATW:
1907                 if (put_user(par->features, (u32 __user *) arg))
1908                         return -EFAULT;
1909                 break;
1910 #endif /* DEBUG && CONFIG_FB_ATY_CT */
1911         default:
1912                 return -EINVAL;
1913         }
1914         return 0;
1915 }
1916
1917 static int atyfb_sync(struct fb_info *info)
1918 {
1919         struct atyfb_par *par = (struct atyfb_par *) info->par;
1920
1921         if (par->blitter_may_be_busy)
1922                 wait_for_idle(par);
1923         return 0;
1924 }
1925
1926 #ifdef __sparc__
1927 static int atyfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
1928 {
1929         struct atyfb_par *par = (struct atyfb_par *) info->par;
1930         unsigned int size, page, map_size = 0;
1931         unsigned long map_offset = 0;
1932         unsigned long off;
1933         int i;
1934
1935         if (!par->mmap_map)
1936                 return -ENXIO;
1937
1938         if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
1939                 return -EINVAL;
1940
1941         off = vma->vm_pgoff << PAGE_SHIFT;
1942         size = vma->vm_end - vma->vm_start;
1943
1944         /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */
1945
1946         if (((vma->vm_pgoff == 0) && (size == info->fix.smem_len)) ||
1947             ((off == info->fix.smem_len) && (size == PAGE_SIZE)))
1948                 off += 0x8000000000000000UL;
1949
1950         vma->vm_pgoff = off >> PAGE_SHIFT;      /* propagate off changes */
1951
1952         /* Each page, see which map applies */
1953         for (page = 0; page < size;) {
1954                 map_size = 0;
1955                 for (i = 0; par->mmap_map[i].size; i++) {
1956                         unsigned long start = par->mmap_map[i].voff;
1957                         unsigned long end = start + par->mmap_map[i].size;
1958                         unsigned long offset = off + page;
1959
1960                         if (start > offset)
1961                                 continue;
1962                         if (offset >= end)
1963                                 continue;
1964
1965                         map_size = par->mmap_map[i].size - (offset - start);
1966                         map_offset = par->mmap_map[i].poff + (offset - start);
1967                         break;
1968                 }
1969                 if (!map_size) {
1970                         page += PAGE_SIZE;
1971                         continue;
1972                 }
1973                 if (page + map_size > size)
1974                         map_size = size - page;
1975
1976                 pgprot_val(vma->vm_page_prot) &= ~(par->mmap_map[i].prot_mask);
1977                 pgprot_val(vma->vm_page_prot) |= par->mmap_map[i].prot_flag;
1978
1979                 if (remap_pfn_range(vma, vma->vm_start + page,
1980                         map_offset >> PAGE_SHIFT, map_size, vma->vm_page_prot))
1981                         return -EAGAIN;
1982
1983                 page += map_size;
1984         }
1985
1986         if (!map_size)
1987                 return -EINVAL;
1988
1989         if (!par->mmaped)
1990                 par->mmaped = 1;
1991         return 0;
1992 }
1993 #endif /* __sparc__ */
1994
1995
1996
1997 #if defined(CONFIG_PM) && defined(CONFIG_PCI)
1998
1999 #ifdef CONFIG_PPC_PMAC
2000 /* Power management routines. Those are used for PowerBook sleep.
2001  */
2002 static int aty_power_mgmt(int sleep, struct atyfb_par *par)
2003 {
2004         u32 pm;
2005         int timeout;
2006
2007         pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2008         pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG;
2009         aty_st_lcd(POWER_MANAGEMENT, pm, par);
2010         pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2011
2012         timeout = 2000;
2013         if (sleep) {
2014                 /* Sleep */
2015                 pm &= ~PWR_MGT_ON;
2016                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2017                 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2018                 udelay(10);
2019                 pm &= ~(PWR_BLON | AUTO_PWR_UP);
2020                 pm |= SUSPEND_NOW;
2021                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2022                 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2023                 udelay(10);
2024                 pm |= PWR_MGT_ON;
2025                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2026                 do {
2027                         pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2028                         mdelay(1);
2029                         if ((--timeout) == 0)
2030                                 break;
2031                 } while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND);
2032         } else {
2033                 /* Wakeup */
2034                 pm &= ~PWR_MGT_ON;
2035                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2036                 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2037                 udelay(10);
2038                 pm &= ~SUSPEND_NOW;
2039                 pm |= (PWR_BLON | AUTO_PWR_UP);
2040                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2041                 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2042                 udelay(10);
2043                 pm |= PWR_MGT_ON;
2044                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2045                 do {
2046                         pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2047                         mdelay(1);
2048                         if ((--timeout) == 0)
2049                                 break;
2050                 } while ((pm & PWR_MGT_STATUS_MASK) != 0);
2051         }
2052         mdelay(500);
2053
2054         return timeout ? 0 : -EIO;
2055 }
2056 #endif /* CONFIG_PPC_PMAC */
2057
2058 static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
2059 {
2060         struct fb_info *info = pci_get_drvdata(pdev);
2061         struct atyfb_par *par = (struct atyfb_par *) info->par;
2062
2063         if (state.event == pdev->dev.power.power_state.event)
2064                 return 0;
2065
2066         console_lock();
2067
2068         fb_set_suspend(info, 1);
2069
2070         /* Idle & reset engine */
2071         wait_for_idle(par);
2072         aty_reset_engine(par);
2073
2074         /* Blank display and LCD */
2075         atyfb_blank(FB_BLANK_POWERDOWN, info);
2076
2077         par->asleep = 1;
2078         par->lock_blank = 1;
2079
2080         /*
2081          * Because we may change PCI D state ourselves, we need to
2082          * first save the config space content so the core can
2083          * restore it properly on resume.
2084          */
2085         pci_save_state(pdev);
2086
2087 #ifdef CONFIG_PPC_PMAC
2088         /* Set chip to "suspend" mode */
2089         if (machine_is(powermac) && aty_power_mgmt(1, par)) {
2090                 par->asleep = 0;
2091                 par->lock_blank = 0;
2092                 atyfb_blank(FB_BLANK_UNBLANK, info);
2093                 fb_set_suspend(info, 0);
2094                 console_unlock();
2095                 return -EIO;
2096         }
2097 #else
2098         pci_set_power_state(pdev, pci_choose_state(pdev, state));
2099 #endif
2100
2101         console_unlock();
2102
2103         pdev->dev.power.power_state = state;
2104
2105         return 0;
2106 }
2107
2108 static void aty_resume_chip(struct fb_info *info)
2109 {
2110         struct atyfb_par *par = info->par;
2111
2112         aty_st_le32(MEM_CNTL, par->mem_cntl, par);
2113
2114         if (par->pll_ops->resume_pll)
2115                 par->pll_ops->resume_pll(info, &par->pll);
2116
2117         if (par->aux_start)
2118                 aty_st_le32(BUS_CNTL,
2119                         aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par);
2120 }
2121
2122 static int atyfb_pci_resume(struct pci_dev *pdev)
2123 {
2124         struct fb_info *info = pci_get_drvdata(pdev);
2125         struct atyfb_par *par = (struct atyfb_par *) info->par;
2126
2127         if (pdev->dev.power.power_state.event == PM_EVENT_ON)
2128                 return 0;
2129
2130         console_lock();
2131
2132         /*
2133          * PCI state will have been restored by the core, so
2134          * we should be in D0 now with our config space fully
2135          * restored
2136          */
2137
2138 #ifdef CONFIG_PPC_PMAC
2139         if (machine_is(powermac) &&
2140             pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
2141                 aty_power_mgmt(0, par);
2142 #endif
2143
2144         aty_resume_chip(info);
2145
2146         par->asleep = 0;
2147
2148         /* Restore display */
2149         atyfb_set_par(info);
2150
2151         /* Refresh */
2152         fb_set_suspend(info, 0);
2153
2154         /* Unblank */
2155         par->lock_blank = 0;
2156         atyfb_blank(FB_BLANK_UNBLANK, info);
2157
2158         console_unlock();
2159
2160         pdev->dev.power.power_state = PMSG_ON;
2161
2162         return 0;
2163 }
2164
2165 #endif /*  defined(CONFIG_PM) && defined(CONFIG_PCI) */
2166
2167 /* Backlight */
2168 #ifdef CONFIG_FB_ATY_BACKLIGHT
2169 #define MAX_LEVEL 0xFF
2170
2171 static int aty_bl_get_level_brightness(struct atyfb_par *par, int level)
2172 {
2173         struct fb_info *info = pci_get_drvdata(par->pdev);
2174         int atylevel;
2175
2176         /* Get and convert the value */
2177         /* No locking of bl_curve since we read a single value */
2178         atylevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL;
2179
2180         if (atylevel < 0)
2181                 atylevel = 0;
2182         else if (atylevel > MAX_LEVEL)
2183                 atylevel = MAX_LEVEL;
2184
2185         return atylevel;
2186 }
2187
2188 static int aty_bl_update_status(struct backlight_device *bd)
2189 {
2190         struct atyfb_par *par = bl_get_data(bd);
2191         unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, par);
2192         int level;
2193
2194         if (bd->props.power != FB_BLANK_UNBLANK ||
2195             bd->props.fb_blank != FB_BLANK_UNBLANK)
2196                 level = 0;
2197         else
2198                 level = bd->props.brightness;
2199
2200         reg |= (BLMOD_EN | BIASMOD_EN);
2201         if (level > 0) {
2202                 reg &= ~BIAS_MOD_LEVEL_MASK;
2203                 reg |= (aty_bl_get_level_brightness(par, level) << BIAS_MOD_LEVEL_SHIFT);
2204         } else {
2205                 reg &= ~BIAS_MOD_LEVEL_MASK;
2206                 reg |= (aty_bl_get_level_brightness(par, 0) << BIAS_MOD_LEVEL_SHIFT);
2207         }
2208         aty_st_lcd(LCD_MISC_CNTL, reg, par);
2209
2210         return 0;
2211 }
2212
2213 static const struct backlight_ops aty_bl_data = {
2214         .update_status  = aty_bl_update_status,
2215 };
2216
2217 static void aty_bl_init(struct atyfb_par *par)
2218 {
2219         struct backlight_properties props;
2220         struct fb_info *info = pci_get_drvdata(par->pdev);
2221         struct backlight_device *bd;
2222         char name[12];
2223
2224 #ifdef CONFIG_PMAC_BACKLIGHT
2225         if (!pmac_has_backlight_type("ati"))
2226                 return;
2227 #endif
2228
2229         snprintf(name, sizeof(name), "atybl%d", info->node);
2230
2231         memset(&props, 0, sizeof(struct backlight_properties));
2232         props.type = BACKLIGHT_RAW;
2233         props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
2234         bd = backlight_device_register(name, info->dev, par, &aty_bl_data,
2235                                        &props);
2236         if (IS_ERR(bd)) {
2237                 info->bl_dev = NULL;
2238                 printk(KERN_WARNING "aty: Backlight registration failed\n");
2239                 goto error;
2240         }
2241
2242         info->bl_dev = bd;
2243         fb_bl_default_curve(info, 0,
2244                             0x3F * FB_BACKLIGHT_MAX / MAX_LEVEL,
2245                             0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL);
2246
2247         bd->props.brightness = bd->props.max_brightness;
2248         bd->props.power = FB_BLANK_UNBLANK;
2249         backlight_update_status(bd);
2250
2251         printk("aty: Backlight initialized (%s)\n", name);
2252
2253         return;
2254
2255 error:
2256         return;
2257 }
2258
2259 #ifdef CONFIG_PCI
2260 static void aty_bl_exit(struct backlight_device *bd)
2261 {
2262         backlight_device_unregister(bd);
2263         printk("aty: Backlight unloaded\n");
2264 }
2265 #endif /* CONFIG_PCI */
2266
2267 #endif /* CONFIG_FB_ATY_BACKLIGHT */
2268
2269 static void aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
2270 {
2271         static const int ragepro_tbl[] = {
2272                 44, 50, 55, 66, 75, 80, 100
2273         };
2274         static const int ragexl_tbl[] = {
2275                 50, 66, 75, 83, 90, 95, 100, 105,
2276                 110, 115, 120, 125, 133, 143, 166
2277         };
2278         const int *refresh_tbl;
2279         int i, size;
2280
2281         if (M64_HAS(XL_MEM)) {
2282                 refresh_tbl = ragexl_tbl;
2283                 size = ARRAY_SIZE(ragexl_tbl);
2284         } else {
2285                 refresh_tbl = ragepro_tbl;
2286                 size = ARRAY_SIZE(ragepro_tbl);
2287         }
2288
2289         for (i = 0; i < size; i++) {
2290                 if (xclk < refresh_tbl[i])
2291                         break;
2292         }
2293         par->mem_refresh_rate = i;
2294 }
2295
2296 /*
2297  * Initialisation
2298  */
2299
2300 static struct fb_info *fb_list = NULL;
2301
2302 #if defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD)
2303 static int atyfb_get_timings_from_lcd(struct atyfb_par *par,
2304                                       struct fb_var_screeninfo *var)
2305 {
2306         int ret = -EINVAL;
2307
2308         if (par->lcd_table != 0 && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2309                 *var = default_var;
2310                 var->xres = var->xres_virtual = par->lcd_hdisp;
2311                 var->right_margin = par->lcd_right_margin;
2312                 var->left_margin = par->lcd_hblank_len -
2313                         (par->lcd_right_margin + par->lcd_hsync_dly +
2314                          par->lcd_hsync_len);
2315                 var->hsync_len = par->lcd_hsync_len + par->lcd_hsync_dly;
2316                 var->yres = var->yres_virtual = par->lcd_vdisp;
2317                 var->lower_margin = par->lcd_lower_margin;
2318                 var->upper_margin = par->lcd_vblank_len -
2319                         (par->lcd_lower_margin + par->lcd_vsync_len);
2320                 var->vsync_len = par->lcd_vsync_len;
2321                 var->pixclock = par->lcd_pixclock;
2322                 ret = 0;
2323         }
2324
2325         return ret;
2326 }
2327 #endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */
2328
2329 static int aty_init(struct fb_info *info)
2330 {
2331         struct atyfb_par *par = (struct atyfb_par *) info->par;
2332         const char *ramname = NULL, *xtal;
2333         int gtb_memsize, has_var = 0;
2334         struct fb_var_screeninfo var;
2335         int ret;
2336
2337         init_waitqueue_head(&par->vblank.wait);
2338         spin_lock_init(&par->int_lock);
2339
2340 #ifdef CONFIG_FB_ATY_GX
2341         if (!M64_HAS(INTEGRATED)) {
2342                 u32 stat0;
2343                 u8 dac_type, dac_subtype, clk_type;
2344                 stat0 = aty_ld_le32(CNFG_STAT0, par);
2345                 par->bus_type = (stat0 >> 0) & 0x07;
2346                 par->ram_type = (stat0 >> 3) & 0x07;
2347                 ramname = aty_gx_ram[par->ram_type];
2348                 /* FIXME: clockchip/RAMDAC probing? */
2349                 dac_type = (aty_ld_le32(DAC_CNTL, par) >> 16) & 0x07;
2350 #ifdef CONFIG_ATARI
2351                 clk_type = CLK_ATI18818_1;
2352                 dac_type = (stat0 >> 9) & 0x07;
2353                 if (dac_type == 0x07)
2354                         dac_subtype = DAC_ATT20C408;
2355                 else
2356                         dac_subtype = (aty_ld_8(SCRATCH_REG1 + 1, par) & 0xF0) | dac_type;
2357 #else
2358                 dac_type = DAC_IBMRGB514;
2359                 dac_subtype = DAC_IBMRGB514;
2360                 clk_type = CLK_IBMRGB514;
2361 #endif
2362                 switch (dac_subtype) {
2363                 case DAC_IBMRGB514:
2364                         par->dac_ops = &aty_dac_ibm514;
2365                         break;
2366 #ifdef CONFIG_ATARI
2367                 case DAC_ATI68860_B:
2368                 case DAC_ATI68860_C:
2369                         par->dac_ops = &aty_dac_ati68860b;
2370                         break;
2371                 case DAC_ATT20C408:
2372                 case DAC_ATT21C498:
2373                         par->dac_ops = &aty_dac_att21c498;
2374                         break;
2375 #endif
2376                 default:
2377                         PRINTKI("aty_init: DAC type not implemented yet!\n");
2378                         par->dac_ops = &aty_dac_unsupported;
2379                         break;
2380                 }
2381                 switch (clk_type) {
2382 #ifdef CONFIG_ATARI
2383                 case CLK_ATI18818_1:
2384                         par->pll_ops = &aty_pll_ati18818_1;
2385                         break;
2386 #else
2387                 case CLK_IBMRGB514:
2388                         par->pll_ops = &aty_pll_ibm514;
2389                         break;
2390 #endif
2391                 default:
2392                         PRINTKI("aty_init: CLK type not implemented yet!");
2393                         par->pll_ops = &aty_pll_unsupported;
2394                         break;
2395                 }
2396         }
2397 #endif /* CONFIG_FB_ATY_GX */
2398 #ifdef CONFIG_FB_ATY_CT
2399         if (M64_HAS(INTEGRATED)) {
2400                 par->dac_ops = &aty_dac_ct;
2401                 par->pll_ops = &aty_pll_ct;
2402                 par->bus_type = PCI;
2403                 par->ram_type = (aty_ld_le32(CNFG_STAT0, par) & 0x07);
2404                 if (M64_HAS(XL_MEM))
2405                         ramname = aty_xl_ram[par->ram_type];
2406                 else
2407                         ramname = aty_ct_ram[par->ram_type];
2408                 /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */
2409                 if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM)
2410                         par->pll_limits.mclk = 63;
2411                 /* Mobility + 32bit memory interface need halved XCLK. */
2412                 if (M64_HAS(MOBIL_BUS) && par->ram_type == SDRAM32)
2413                         par->pll_limits.xclk = (par->pll_limits.xclk + 1) >> 1;
2414         }
2415 #endif
2416 #ifdef CONFIG_PPC_PMAC
2417         /*
2418          * The Apple iBook1 uses non-standard memory frequencies.
2419          * We detect it and set the frequency manually.
2420          */
2421         if (of_machine_is_compatible("PowerBook2,1")) {
2422                 par->pll_limits.mclk = 70;
2423                 par->pll_limits.xclk = 53;
2424         }
2425 #endif
2426
2427         /* Allow command line to override clocks. */
2428         if (pll)
2429                 par->pll_limits.pll_max = pll;
2430         if (mclk)
2431                 par->pll_limits.mclk = mclk;
2432         if (xclk)
2433                 par->pll_limits.xclk = xclk;
2434
2435         aty_calc_mem_refresh(par, par->pll_limits.xclk);
2436         par->pll_per = 1000000/par->pll_limits.pll_max;
2437         par->mclk_per = 1000000/par->pll_limits.mclk;
2438         par->xclk_per = 1000000/par->pll_limits.xclk;
2439
2440         par->ref_clk_per = 1000000000000ULL / 14318180;
2441         xtal = "14.31818";
2442
2443 #ifdef CONFIG_FB_ATY_CT
2444         if (M64_HAS(GTB_DSP)) {
2445                 u8 pll_ref_div = aty_ld_pll_ct(PLL_REF_DIV, par);
2446
2447                 if (pll_ref_div) {
2448                         int diff1, diff2;
2449                         diff1 = 510 * 14 / pll_ref_div - par->pll_limits.pll_max;
2450                         diff2 = 510 * 29 / pll_ref_div - par->pll_limits.pll_max;
2451                         if (diff1 < 0)
2452                                 diff1 = -diff1;
2453                         if (diff2 < 0)
2454                                 diff2 = -diff2;
2455                         if (diff2 < diff1) {
2456                                 par->ref_clk_per = 1000000000000ULL / 29498928;
2457                                 xtal = "29.498928";
2458                         }
2459                 }
2460         }
2461 #endif /* CONFIG_FB_ATY_CT */
2462
2463         /* save previous video mode */
2464         aty_get_crtc(par, &par->saved_crtc);
2465         if (par->pll_ops->get_pll)
2466                 par->pll_ops->get_pll(info, &par->saved_pll);
2467
2468         par->mem_cntl = aty_ld_le32(MEM_CNTL, par);
2469         gtb_memsize = M64_HAS(GTB_DSP);
2470         if (gtb_memsize)
2471                 /* 0xF used instead of MEM_SIZE_ALIAS */
2472                 switch (par->mem_cntl & 0xF) {
2473                 case MEM_SIZE_512K:
2474                         info->fix.smem_len = 0x80000;
2475                         break;
2476                 case MEM_SIZE_1M:
2477                         info->fix.smem_len = 0x100000;
2478                         break;
2479                 case MEM_SIZE_2M_GTB:
2480                         info->fix.smem_len = 0x200000;
2481                         break;
2482                 case MEM_SIZE_4M_GTB:
2483                         info->fix.smem_len = 0x400000;
2484                         break;
2485                 case MEM_SIZE_6M_GTB:
2486                         info->fix.smem_len = 0x600000;
2487                         break;
2488                 case MEM_SIZE_8M_GTB:
2489                         info->fix.smem_len = 0x800000;
2490                         break;
2491                 default:
2492                         info->fix.smem_len = 0x80000;
2493         } else
2494                 switch (par->mem_cntl & MEM_SIZE_ALIAS) {
2495                 case MEM_SIZE_512K:
2496                         info->fix.smem_len = 0x80000;
2497                         break;
2498                 case MEM_SIZE_1M:
2499                         info->fix.smem_len = 0x100000;
2500                         break;
2501                 case MEM_SIZE_2M:
2502                         info->fix.smem_len = 0x200000;
2503                         break;
2504                 case MEM_SIZE_4M:
2505                         info->fix.smem_len = 0x400000;
2506                         break;
2507                 case MEM_SIZE_6M:
2508                         info->fix.smem_len = 0x600000;
2509                         break;
2510                 case MEM_SIZE_8M:
2511                         info->fix.smem_len = 0x800000;
2512                         break;
2513                 default:
2514                         info->fix.smem_len = 0x80000;
2515                 }
2516
2517         if (M64_HAS(MAGIC_VRAM_SIZE)) {
2518                 if (aty_ld_le32(CNFG_STAT1, par) & 0x40000000)
2519                         info->fix.smem_len += 0x400000;
2520         }
2521
2522         if (vram) {
2523                 info->fix.smem_len = vram * 1024;
2524                 par->mem_cntl &= ~(gtb_memsize ? 0xF : MEM_SIZE_ALIAS);
2525                 if (info->fix.smem_len <= 0x80000)
2526                         par->mem_cntl |= MEM_SIZE_512K;
2527                 else if (info->fix.smem_len <= 0x100000)
2528                         par->mem_cntl |= MEM_SIZE_1M;
2529                 else if (info->fix.smem_len <= 0x200000)
2530                         par->mem_cntl |= gtb_memsize ? MEM_SIZE_2M_GTB : MEM_SIZE_2M;
2531                 else if (info->fix.smem_len <= 0x400000)
2532                         par->mem_cntl |= gtb_memsize ? MEM_SIZE_4M_GTB : MEM_SIZE_4M;
2533                 else if (info->fix.smem_len <= 0x600000)
2534                         par->mem_cntl |= gtb_memsize ? MEM_SIZE_6M_GTB : MEM_SIZE_6M;
2535                 else
2536                         par->mem_cntl |= gtb_memsize ? MEM_SIZE_8M_GTB : MEM_SIZE_8M;
2537                 aty_st_le32(MEM_CNTL, par->mem_cntl, par);
2538         }
2539
2540         /*
2541          * Reg Block 0 (CT-compatible block) is at mmio_start
2542          * Reg Block 1 (multimedia extensions) is at mmio_start - 0x400
2543          */
2544         if (M64_HAS(GX)) {
2545                 info->fix.mmio_len = 0x400;
2546                 info->fix.accel = FB_ACCEL_ATI_MACH64GX;
2547         } else if (M64_HAS(CT)) {
2548                 info->fix.mmio_len = 0x400;
2549                 info->fix.accel = FB_ACCEL_ATI_MACH64CT;
2550         } else if (M64_HAS(VT)) {
2551                 info->fix.mmio_start -= 0x400;
2552                 info->fix.mmio_len = 0x800;
2553                 info->fix.accel = FB_ACCEL_ATI_MACH64VT;
2554         } else {/* GT */
2555                 info->fix.mmio_start -= 0x400;
2556                 info->fix.mmio_len = 0x800;
2557                 info->fix.accel = FB_ACCEL_ATI_MACH64GT;
2558         }
2559
2560         PRINTKI("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK, %d MHz XCLK\n",
2561                 info->fix.smem_len == 0x80000 ? 512 : (info->fix.smem_len>>20),
2562                 info->fix.smem_len == 0x80000 ? 'K' : 'M', ramname, xtal,
2563                 par->pll_limits.pll_max, par->pll_limits.mclk,
2564                 par->pll_limits.xclk);
2565
2566 #if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
2567         if (M64_HAS(INTEGRATED)) {
2568                 int i;
2569                 printk("debug atyfb: BUS_CNTL DAC_CNTL MEM_CNTL "
2570                        "EXT_MEM_CNTL CRTC_GEN_CNTL DSP_CONFIG "
2571                        "DSP_ON_OFF CLOCK_CNTL\n"
2572                        "debug atyfb: %08x %08x %08x "
2573                        "%08x     %08x      %08x   "
2574                        "%08x   %08x\n"
2575                        "debug atyfb: PLL",
2576                        aty_ld_le32(BUS_CNTL, par),
2577                        aty_ld_le32(DAC_CNTL, par),
2578                        aty_ld_le32(MEM_CNTL, par),
2579                        aty_ld_le32(EXT_MEM_CNTL, par),
2580                        aty_ld_le32(CRTC_GEN_CNTL, par),
2581                        aty_ld_le32(DSP_CONFIG, par),
2582                        aty_ld_le32(DSP_ON_OFF, par),
2583                        aty_ld_le32(CLOCK_CNTL, par));
2584                 for (i = 0; i < 40; i++)
2585                         pr_cont(" %02x", aty_ld_pll_ct(i, par));
2586                 pr_cont("\n");
2587         }
2588 #endif
2589         if (par->pll_ops->init_pll)
2590                 par->pll_ops->init_pll(info, &par->pll);
2591         if (par->pll_ops->resume_pll)
2592                 par->pll_ops->resume_pll(info, &par->pll);
2593
2594         aty_fudge_framebuffer_len(info);
2595
2596         /*
2597          * Disable register access through the linear aperture
2598          * if the auxiliary aperture is used so we can access
2599          * the full 8 MB of video RAM on 8 MB boards.
2600          */
2601         if (par->aux_start)
2602                 aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) |
2603                             BUS_APER_REG_DIS, par);
2604
2605         if (!nomtrr)
2606                 /*
2607                  * Only the ioremap_wc()'d area will get WC here
2608                  * since ioremap_uc() was used on the entire PCI BAR.
2609                  */
2610                 par->wc_cookie = arch_phys_wc_add(par->res_start,
2611                                                   par->res_size);
2612
2613         info->fbops = &atyfb_ops;
2614         info->pseudo_palette = par->pseudo_palette;
2615         info->flags = FBINFO_DEFAULT           |
2616                       FBINFO_HWACCEL_IMAGEBLIT |
2617                       FBINFO_HWACCEL_FILLRECT  |
2618                       FBINFO_HWACCEL_COPYAREA  |
2619                       FBINFO_HWACCEL_YPAN      |
2620                       FBINFO_READS_FAST;
2621
2622 #ifdef CONFIG_PMAC_BACKLIGHT
2623         if (M64_HAS(G3_PB_1_1) && of_machine_is_compatible("PowerBook1,1")) {
2624                 /*
2625                  * these bits let the 101 powerbook
2626                  * wake up from sleep -- paulus
2627                  */
2628                 aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, par) |
2629                            USE_F32KHZ | TRISTATE_MEM_EN, par);
2630         } else
2631 #endif
2632         if (M64_HAS(MOBIL_BUS) && backlight) {
2633 #ifdef CONFIG_FB_ATY_BACKLIGHT
2634                 aty_bl_init(par);
2635 #endif
2636         }
2637
2638         memset(&var, 0, sizeof(var));
2639 #ifdef CONFIG_PPC
2640         if (machine_is(powermac)) {
2641                 /*
2642                  * FIXME: The NVRAM stuff should be put in a Mac-specific file,
2643                  *        as it applies to all Mac video cards
2644                  */
2645                 if (mode) {
2646                         if (mac_find_mode(&var, info, mode, 8))
2647                                 has_var = 1;
2648                 } else {
2649                         if (default_vmode == VMODE_CHOOSE) {
2650                                 int sense;
2651                                 if (M64_HAS(G3_PB_1024x768))
2652                                         /* G3 PowerBook with 1024x768 LCD */
2653                                         default_vmode = VMODE_1024_768_60;
2654                                 else if (of_machine_is_compatible("iMac"))
2655                                         default_vmode = VMODE_1024_768_75;
2656                                 else if (of_machine_is_compatible("PowerBook2,1"))
2657                                         /* iBook with 800x600 LCD */
2658                                         default_vmode = VMODE_800_600_60;
2659                                 else
2660                                         default_vmode = VMODE_640_480_67;
2661                                 sense = read_aty_sense(par);
2662                                 PRINTKI("monitor sense=%x, mode %d\n",
2663                                         sense,  mac_map_monitor_sense(sense));
2664                         }
2665                         if (default_vmode <= 0 || default_vmode > VMODE_MAX)
2666                                 default_vmode = VMODE_640_480_60;
2667                         if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
2668                                 default_cmode = CMODE_8;
2669                         if (!mac_vmode_to_var(default_vmode, default_cmode,
2670                                               &var))
2671                                 has_var = 1;
2672                 }
2673         }
2674
2675 #endif /* !CONFIG_PPC */
2676
2677 #if defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD)
2678         if (!atyfb_get_timings_from_lcd(par, &var))
2679                 has_var = 1;
2680 #endif
2681
2682         if (mode && fb_find_mode(&var, info, mode, NULL, 0, &defmode, 8))
2683                 has_var = 1;
2684
2685         if (!has_var)
2686                 var = default_var;
2687
2688         if (noaccel)
2689                 var.accel_flags &= ~FB_ACCELF_TEXT;
2690         else
2691                 var.accel_flags |= FB_ACCELF_TEXT;
2692
2693         if (comp_sync != -1) {
2694                 if (!comp_sync)
2695                         var.sync &= ~FB_SYNC_COMP_HIGH_ACT;
2696                 else
2697                         var.sync |= FB_SYNC_COMP_HIGH_ACT;
2698         }
2699
2700         if (var.yres == var.yres_virtual) {
2701                 u32 videoram = (info->fix.smem_len - (PAGE_SIZE << 2));
2702                 var.yres_virtual = ((videoram * 8) / var.bits_per_pixel) / var.xres_virtual;
2703                 if (var.yres_virtual < var.yres)
2704                         var.yres_virtual = var.yres;
2705         }
2706
2707         ret = atyfb_check_var(&var, info);
2708         if (ret) {
2709                 PRINTKE("can't set default video mode\n");
2710                 goto aty_init_exit;
2711         }
2712
2713 #ifdef CONFIG_FB_ATY_CT
2714         if (!noaccel && M64_HAS(INTEGRATED))
2715                 aty_init_cursor(info);
2716 #endif /* CONFIG_FB_ATY_CT */
2717         info->var = var;
2718
2719         ret = fb_alloc_cmap(&info->cmap, 256, 0);
2720         if (ret < 0)
2721                 goto aty_init_exit;
2722
2723         ret = register_framebuffer(info);
2724         if (ret < 0) {
2725                 fb_dealloc_cmap(&info->cmap);
2726                 goto aty_init_exit;
2727         }
2728
2729         fb_list = info;
2730
2731         PRINTKI("fb%d: %s frame buffer device on %s\n",
2732                 info->node, info->fix.id, par->bus_type == ISA ? "ISA" : "PCI");
2733         return 0;
2734
2735 aty_init_exit:
2736         /* restore video mode */
2737         aty_set_crtc(par, &par->saved_crtc);
2738         par->pll_ops->set_pll(info, &par->saved_pll);
2739         arch_phys_wc_del(par->wc_cookie);
2740
2741         return ret;
2742 }
2743
2744 #if defined(CONFIG_ATARI) && !defined(MODULE)
2745 static int store_video_par(char *video_str, unsigned char m64_num)
2746 {
2747         char *p;
2748         unsigned long vmembase, size, guiregbase;
2749
2750         PRINTKI("store_video_par() '%s' \n", video_str);
2751
2752         if (!(p = strsep(&video_str, ";")) || !*p)
2753                 goto mach64_invalid;
2754         vmembase = simple_strtoul(p, NULL, 0);
2755         if (!(p = strsep(&video_str, ";")) || !*p)
2756                 goto mach64_invalid;
2757         size = simple_strtoul(p, NULL, 0);
2758         if (!(p = strsep(&video_str, ";")) || !*p)
2759                 goto mach64_invalid;
2760         guiregbase = simple_strtoul(p, NULL, 0);
2761
2762         phys_vmembase[m64_num] = vmembase;
2763         phys_size[m64_num] = size;
2764         phys_guiregbase[m64_num] = guiregbase;
2765         PRINTKI("stored them all: $%08lX $%08lX $%08lX \n", vmembase, size,
2766                 guiregbase);
2767         return 0;
2768
2769  mach64_invalid:
2770         phys_vmembase[m64_num] = 0;
2771         return -1;
2772 }
2773 #endif /* CONFIG_ATARI && !MODULE */
2774
2775 /*
2776  * Blank the display.
2777  */
2778
2779 static int atyfb_blank(int blank, struct fb_info *info)
2780 {
2781         struct atyfb_par *par = (struct atyfb_par *) info->par;
2782         u32 gen_cntl;
2783
2784         if (par->lock_blank || par->asleep)
2785                 return 0;
2786
2787 #ifdef CONFIG_FB_ATY_GENERIC_LCD
2788         if (par->lcd_table && blank > FB_BLANK_NORMAL &&
2789             (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2790                 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2791                 pm &= ~PWR_BLON;
2792                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2793         }
2794 #endif
2795
2796         gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
2797         gen_cntl &= ~0x400004c;
2798         switch (blank) {
2799         case FB_BLANK_UNBLANK:
2800                 break;
2801         case FB_BLANK_NORMAL:
2802                 gen_cntl |= 0x4000040;
2803                 break;
2804         case FB_BLANK_VSYNC_SUSPEND:
2805                 gen_cntl |= 0x4000048;
2806                 break;
2807         case FB_BLANK_HSYNC_SUSPEND:
2808                 gen_cntl |= 0x4000044;
2809                 break;
2810         case FB_BLANK_POWERDOWN:
2811                 gen_cntl |= 0x400004c;
2812                 break;
2813         }
2814         aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
2815
2816 #ifdef CONFIG_FB_ATY_GENERIC_LCD
2817         if (par->lcd_table && blank <= FB_BLANK_NORMAL &&
2818             (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
2819                 u32 pm = aty_ld_lcd(POWER_MANAGEMENT, par);
2820                 pm |= PWR_BLON;
2821                 aty_st_lcd(POWER_MANAGEMENT, pm, par);
2822         }
2823 #endif
2824
2825         return 0;
2826 }
2827
2828 static void aty_st_pal(u_int regno, u_int red, u_int green, u_int blue,
2829                        const struct atyfb_par *par)
2830 {
2831         aty_st_8(DAC_W_INDEX, regno, par);
2832         aty_st_8(DAC_DATA, red, par);
2833         aty_st_8(DAC_DATA, green, par);
2834         aty_st_8(DAC_DATA, blue, par);
2835 }
2836
2837 /*
2838  * Set a single color register. The values supplied are already
2839  * rounded down to the hardware's capabilities (according to the
2840  * entries in the var structure). Return != 0 for invalid regno.
2841  * !! 4 & 8 =  PSEUDO, > 8 = DIRECTCOLOR
2842  */
2843
2844 static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
2845                            u_int transp, struct fb_info *info)
2846 {
2847         struct atyfb_par *par = (struct atyfb_par *) info->par;
2848         int i, depth;
2849         u32 *pal = info->pseudo_palette;
2850
2851         depth = info->var.bits_per_pixel;
2852         if (depth == 16)
2853                 depth = (info->var.green.length == 5) ? 15 : 16;
2854
2855         if (par->asleep)
2856                 return 0;
2857
2858         if (regno > 255 ||
2859             (depth == 16 && regno > 63) ||
2860             (depth == 15 && regno > 31))
2861                 return 1;
2862
2863         red >>= 8;
2864         green >>= 8;
2865         blue >>= 8;
2866
2867         par->palette[regno].red = red;
2868         par->palette[regno].green = green;
2869         par->palette[regno].blue = blue;
2870
2871         if (regno < 16) {
2872                 switch (depth) {
2873                 case 15:
2874                         pal[regno] = (regno << 10) | (regno << 5) | regno;
2875                         break;
2876                 case 16:
2877                         pal[regno] = (regno << 11) | (regno << 5) | regno;
2878                         break;
2879                 case 24:
2880                         pal[regno] = (regno << 16) | (regno << 8) | regno;
2881                         break;
2882                 case 32:
2883                         i = (regno << 8) | regno;
2884                         pal[regno] = (i << 16) | i;
2885                         break;
2886                 }
2887         }
2888
2889         i = aty_ld_8(DAC_CNTL, par) & 0xfc;
2890         if (M64_HAS(EXTRA_BRIGHT))
2891                 i |= 0x2; /* DAC_CNTL | 0x2 turns off the extra brightness for gt */
2892         aty_st_8(DAC_CNTL, i, par);
2893         aty_st_8(DAC_MASK, 0xff, par);
2894
2895         if (M64_HAS(INTEGRATED)) {
2896                 if (depth == 16) {
2897                         if (regno < 32)
2898                                 aty_st_pal(regno << 3, red,
2899                                            par->palette[regno << 1].green,
2900                                            blue, par);
2901                         red = par->palette[regno >> 1].red;
2902                         blue = par->palette[regno >> 1].blue;
2903                         regno <<= 2;
2904                 } else if (depth == 15) {
2905                         regno <<= 3;
2906                         for (i = 0; i < 8; i++)
2907                                 aty_st_pal(regno + i, red, green, blue, par);
2908                 }
2909         }
2910         aty_st_pal(regno, red, green, blue, par);
2911
2912         return 0;
2913 }
2914
2915 #ifdef CONFIG_PCI
2916
2917 #ifdef __sparc__
2918
2919 static int atyfb_setup_sparc(struct pci_dev *pdev, struct fb_info *info,
2920                              unsigned long addr)
2921 {
2922         struct atyfb_par *par = info->par;
2923         struct device_node *dp;
2924         u32 mem, chip_id;
2925         int i, j, ret;
2926
2927         /*
2928          * Map memory-mapped registers.
2929          */
2930         par->ati_regbase = (void *)addr + 0x7ffc00UL;
2931         info->fix.mmio_start = addr + 0x7ffc00UL;
2932
2933         /*
2934          * Map in big-endian aperture.
2935          */
2936         info->screen_base = (char *) (addr + 0x800000UL);
2937         info->fix.smem_start = addr + 0x800000UL;
2938
2939         /*
2940          * Figure mmap addresses from PCI config space.
2941          * Split Framebuffer in big- and little-endian halfs.
2942          */
2943         for (i = 0; i < 6 && pdev->resource[i].start; i++)
2944                 /* nothing */ ;
2945         j = i + 4;
2946
2947         par->mmap_map = kcalloc(j, sizeof(*par->mmap_map), GFP_ATOMIC);
2948         if (!par->mmap_map) {
2949                 PRINTKE("atyfb_setup_sparc() can't alloc mmap_map\n");
2950                 return -ENOMEM;
2951         }
2952
2953         for (i = 0, j = 2; i < 6 && pdev->resource[i].start; i++) {
2954                 struct resource *rp = &pdev->resource[i];
2955                 int io, breg = PCI_BASE_ADDRESS_0 + (i << 2);
2956                 unsigned long base;
2957                 u32 size, pbase;
2958
2959                 base = rp->start;
2960
2961                 io = (rp->flags & IORESOURCE_IO);
2962
2963                 size = rp->end - base + 1;
2964
2965                 pci_read_config_dword(pdev, breg, &pbase);
2966
2967                 if (io)
2968                         size &= ~1;
2969
2970                 /*
2971                  * Map the framebuffer a second time, this time without
2972                  * the braindead _PAGE_IE setting. This is used by the
2973                  * fixed Xserver, but we need to maintain the old mapping
2974                  * to stay compatible with older ones...
2975                  */
2976                 if (base == addr) {
2977                         par->mmap_map[j].voff = (pbase + 0x10000000) & PAGE_MASK;
2978                         par->mmap_map[j].poff = base & PAGE_MASK;
2979                         par->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK;
2980                         par->mmap_map[j].prot_mask = _PAGE_CACHE;
2981                         par->mmap_map[j].prot_flag = _PAGE_E;
2982                         j++;
2983                 }
2984
2985                 /*
2986                  * Here comes the old framebuffer mapping with _PAGE_IE
2987                  * set for the big endian half of the framebuffer...
2988                  */
2989                 if (base == addr) {
2990                         par->mmap_map[j].voff = (pbase + 0x800000) & PAGE_MASK;
2991                         par->mmap_map[j].poff = (base + 0x800000) & PAGE_MASK;
2992                         par->mmap_map[j].size = 0x800000;
2993                         par->mmap_map[j].prot_mask = _PAGE_CACHE;
2994                         par->mmap_map[j].prot_flag = _PAGE_E | _PAGE_IE;
2995                         size -= 0x800000;
2996                         j++;
2997                 }
2998
2999                 par->mmap_map[j].voff = pbase & PAGE_MASK;
3000                 par->mmap_map[j].poff = base & PAGE_MASK;
3001                 par->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK;
3002                 par->mmap_map[j].prot_mask = _PAGE_CACHE;
3003                 par->mmap_map[j].prot_flag = _PAGE_E;
3004                 j++;
3005         }
3006
3007         ret = correct_chipset(par);
3008         if (ret)
3009                 return ret;
3010
3011         if (IS_XL(pdev->device)) {
3012                 /*
3013                  * Fix PROMs idea of MEM_CNTL settings...
3014                  */
3015                 mem = aty_ld_le32(MEM_CNTL, par);
3016                 chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
3017                 if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) {
3018                         switch (mem & 0x0f) {
3019                         case 3:
3020                                 mem = (mem & ~(0x0f)) | 2;
3021                                 break;
3022                         case 7:
3023                                 mem = (mem & ~(0x0f)) | 3;
3024                                 break;
3025                         case 9:
3026                                 mem = (mem & ~(0x0f)) | 4;
3027                                 break;
3028                         case 11:
3029                                 mem = (mem & ~(0x0f)) | 5;
3030                                 break;
3031                         default:
3032                                 break;
3033                         }
3034                         if ((aty_ld_le32(CNFG_STAT0, par) & 7) >= SDRAM)
3035                                 mem &= ~(0x00700000);
3036                 }
3037                 mem &= ~(0xcf80e000);   /* Turn off all undocumented bits. */
3038                 aty_st_le32(MEM_CNTL, mem, par);
3039         }
3040
3041         dp = pci_device_to_OF_node(pdev);
3042         if (dp == of_console_device) {
3043                 struct fb_var_screeninfo *var = &default_var;
3044                 unsigned int N, P, Q, M, T, R;
3045                 u32 v_total, h_total;
3046                 struct crtc crtc;
3047                 u8 pll_regs[16];
3048                 u8 clock_cntl;
3049
3050                 crtc.vxres = of_getintprop_default(dp, "width", 1024);
3051                 crtc.vyres = of_getintprop_default(dp, "height", 768);
3052                 var->bits_per_pixel = of_getintprop_default(dp, "depth", 8);
3053                 var->xoffset = var->yoffset = 0;
3054                 crtc.h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
3055                 crtc.h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);
3056                 crtc.v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, par);
3057                 crtc.v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, par);
3058                 crtc.gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, par);
3059                 aty_crtc_to_var(&crtc, var);
3060
3061                 h_total = var->xres + var->right_margin + var->hsync_len + var->left_margin;
3062                 v_total = var->yres + var->lower_margin + var->vsync_len + var->upper_margin;
3063
3064                 /*
3065                  * Read the PLL to figure actual Refresh Rate.
3066                  */
3067                 clock_cntl = aty_ld_8(CLOCK_CNTL, par);
3068                 /* DPRINTK("CLOCK_CNTL %02x\n", clock_cntl); */
3069                 for (i = 0; i < 16; i++)
3070                         pll_regs[i] = aty_ld_pll_ct(i, par);
3071
3072                 /*
3073                  * PLL Reference Divider M:
3074                  */
3075                 M = pll_regs[PLL_REF_DIV];
3076
3077                 /*
3078                  * PLL Feedback Divider N (Dependent on CLOCK_CNTL):
3079                  */
3080                 N = pll_regs[VCLK0_FB_DIV + (clock_cntl & 3)];
3081
3082                 /*
3083                  * PLL Post Divider P (Dependent on CLOCK_CNTL):
3084                  */
3085                 P = aty_postdividers[((pll_regs[VCLK_POST_DIV] >> ((clock_cntl & 3) << 1)) & 3) |
3086                                      ((pll_regs[PLL_EXT_CNTL] >> (2 + (clock_cntl & 3))) & 4)];
3087
3088                 /*
3089                  * PLL Divider Q:
3090                  */
3091                 Q = N / P;
3092
3093                 /*
3094                  * Target Frequency:
3095                  *
3096                  *      T * M
3097                  * Q = -------
3098                  *      2 * R
3099                  *
3100                  * where R is XTALIN (= 14318 or 29498 kHz).
3101                  */
3102                 if (IS_XL(pdev->device))
3103                         R = 29498;
3104                 else
3105                         R = 14318;
3106
3107                 T = 2 * Q * R / M;
3108
3109                 default_var.pixclock = 1000000000 / T;
3110         }
3111
3112         return 0;
3113 }
3114
3115 #else /* __sparc__ */
3116
3117 #ifdef __i386__
3118 #ifdef CONFIG_FB_ATY_GENERIC_LCD
3119 static void aty_init_lcd(struct atyfb_par *par, u32 bios_base)
3120 {
3121         u32 driv_inf_tab, sig;
3122         u16 lcd_ofs;
3123
3124         /*
3125          * To support an LCD panel, we should know it's dimensions and
3126          *  it's desired pixel clock.
3127          * There are two ways to do it:
3128          *  - Check the startup video mode and calculate the panel
3129          *    size from it. This is unreliable.
3130          *  - Read it from the driver information table in the video BIOS.
3131          */
3132         /* Address of driver information table is at offset 0x78. */
3133         driv_inf_tab = bios_base + *((u16 *)(bios_base+0x78));
3134
3135         /* Check for the driver information table signature. */
3136         sig = *(u32 *)driv_inf_tab;
3137         if ((sig == 0x54504c24) || /* Rage LT pro */
3138             (sig == 0x544d5224) || /* Rage mobility */
3139             (sig == 0x54435824) || /* Rage XC */
3140             (sig == 0x544c5824)) { /* Rage XL */
3141                 PRINTKI("BIOS contains driver information table.\n");
3142                 lcd_ofs = *(u16 *)(driv_inf_tab + 10);
3143                 par->lcd_table = 0;
3144                 if (lcd_ofs != 0)
3145                         par->lcd_table = bios_base + lcd_ofs;
3146         }
3147
3148         if (par->lcd_table != 0) {
3149                 char model[24];
3150                 char strbuf[16];
3151                 char refresh_rates_buf[100];
3152                 int id, tech, f, i, m, default_refresh_rate;
3153                 char *txtcolour;
3154                 char *txtmonitor;
3155                 char *txtdual;
3156                 char *txtformat;
3157                 u16 width, height, panel_type, refresh_rates;
3158                 u16 *lcdmodeptr;
3159                 u32 format;
3160                 u8 lcd_refresh_rates[16] = { 50, 56, 60, 67, 70, 72, 75, 76, 85,
3161                                              90, 100, 120, 140, 150, 160, 200 };
3162                 /*
3163                  * The most important information is the panel size at
3164                  * offset 25 and 27, but there's some other nice information
3165                  * which we print to the screen.
3166                  */
3167                 id = *(u8 *)par->lcd_table;
3168                 strncpy(model, (char *)par->lcd_table+1, 24);
3169                 model[23] = 0;
3170
3171                 width = par->lcd_width = *(u16 *)(par->lcd_table+25);
3172                 height = par->lcd_height = *(u16 *)(par->lcd_table+27);
3173                 panel_type = *(u16 *)(par->lcd_table+29);
3174                 if (panel_type & 1)
3175                         txtcolour = "colour";
3176                 else
3177                         txtcolour = "monochrome";
3178                 if (panel_type & 2)
3179                         txtdual = "dual (split) ";
3180                 else
3181                         txtdual = "";
3182                 tech = (panel_type >> 2) & 63;
3183                 switch (tech) {
3184                 case 0:
3185                         txtmonitor = "passive matrix";
3186                         break;
3187                 case 1:
3188                         txtmonitor = "active matrix";
3189                         break;
3190                 case 2:
3191                         txtmonitor = "active addressed STN";
3192                         break;
3193                 case 3:
3194                         txtmonitor = "EL";
3195                         break;
3196                 case 4:
3197                         txtmonitor = "plasma";
3198                         break;
3199                 default:
3200                         txtmonitor = "unknown";
3201                 }
3202                 format = *(u32 *)(par->lcd_table+57);
3203                 if (tech == 0 || tech == 2) {
3204                         switch (format & 7) {
3205                         case 0:
3206                                 txtformat = "12 bit interface";
3207                                 break;
3208                         case 1:
3209                                 txtformat = "16 bit interface";
3210                                 break;
3211                         case 2:
3212                                 txtformat = "24 bit interface";
3213                                 break;
3214                         default:
3215                                 txtformat = "unknown format";
3216                         }
3217                 } else {
3218                         switch (format & 7) {
3219                         case 0:
3220                                 txtformat = "8 colours";
3221                                 break;
3222                         case 1:
3223                                 txtformat = "512 colours";
3224                                 break;
3225                         case 2:
3226                                 txtformat = "4096 colours";
3227                                 break;
3228                         case 4:
3229                                 txtformat = "262144 colours (LT mode)";
3230                                 break;
3231                         case 5:
3232                                 txtformat = "16777216 colours";
3233                                 break;
3234                         case 6:
3235                                 txtformat = "262144 colours (FDPI-2 mode)";
3236                                 break;
3237                         default:
3238                                 txtformat = "unknown format";
3239                         }
3240                 }
3241                 PRINTKI("%s%s %s monitor detected: %s\n",
3242                         txtdual, txtcolour, txtmonitor, model);
3243                 PRINTKI("       id=%d, %dx%d pixels, %s\n",
3244                         id, width, height, txtformat);
3245                 refresh_rates_buf[0] = 0;
3246                 refresh_rates = *(u16 *)(par->lcd_table+62);
3247                 m = 1;
3248                 f = 0;
3249                 for (i = 0; i < 16; i++) {
3250                         if (refresh_rates & m) {
3251                                 if (f == 0) {
3252                                         sprintf(strbuf, "%d",
3253                                                 lcd_refresh_rates[i]);
3254                                         f++;
3255                                 } else {
3256                                         sprintf(strbuf, ",%d",
3257                                                 lcd_refresh_rates[i]);
3258                                 }
3259                                 strcat(refresh_rates_buf, strbuf);
3260                         }
3261                         m = m << 1;
3262                 }
3263                 default_refresh_rate = (*(u8 *)(par->lcd_table+61) & 0xf0) >> 4;
3264                 PRINTKI("       supports refresh rates [%s], default %d Hz\n",
3265                         refresh_rates_buf, lcd_refresh_rates[default_refresh_rate]);
3266                 par->lcd_refreshrate = lcd_refresh_rates[default_refresh_rate];
3267                 /*
3268                  * We now need to determine the crtc parameters for the
3269                  * LCD monitor. This is tricky, because they are not stored
3270                  * individually in the BIOS. Instead, the BIOS contains a
3271                  * table of display modes that work for this monitor.
3272                  *
3273                  * The idea is that we search for a mode of the same dimensions
3274                  * as the dimensions of the LCD monitor. Say our LCD monitor
3275                  * is 800x600 pixels, we search for a 800x600 monitor.
3276                  * The CRTC parameters we find here are the ones that we need
3277                  * to use to simulate other resolutions on the LCD screen.
3278                  */
3279                 lcdmodeptr = (u16 *)(par->lcd_table + 64);
3280                 while (*lcdmodeptr != 0) {
3281                         u32 modeptr;
3282                         u16 mwidth, mheight, lcd_hsync_start, lcd_vsync_start;
3283                         modeptr = bios_base + *lcdmodeptr;
3284
3285                         mwidth = *((u16 *)(modeptr+0));
3286                         mheight = *((u16 *)(modeptr+2));
3287
3288                         if (mwidth == width && mheight == height) {
3289                                 par->lcd_pixclock = 100000000 / *((u16 *)(modeptr+9));
3290                                 par->lcd_htotal = *((u16 *)(modeptr+17)) & 511;
3291                                 par->lcd_hdisp = *((u16 *)(modeptr+19)) & 511;
3292                                 lcd_hsync_start = *((u16 *)(modeptr+21)) & 511;
3293                                 par->lcd_hsync_dly = (*((u16 *)(modeptr+21)) >> 9) & 7;
3294                                 par->lcd_hsync_len = *((u8 *)(modeptr+23)) & 63;
3295
3296                                 par->lcd_vtotal = *((u16 *)(modeptr+24)) & 2047;
3297                                 par->lcd_vdisp = *((u16 *)(modeptr+26)) & 2047;
3298                                 lcd_vsync_start = *((u16 *)(modeptr+28)) & 2047;
3299                                 par->lcd_vsync_len = (*((u16 *)(modeptr+28)) >> 11) & 31;
3300
3301                                 par->lcd_htotal = (par->lcd_htotal + 1) * 8;
3302                                 par->lcd_hdisp = (par->lcd_hdisp + 1) * 8;
3303                                 lcd_hsync_start = (lcd_hsync_start + 1) * 8;
3304                                 par->lcd_hsync_len = par->lcd_hsync_len * 8;
3305
3306                                 par->lcd_vtotal++;
3307                                 par->lcd_vdisp++;
3308                                 lcd_vsync_start++;
3309
3310                                 par->lcd_right_margin = lcd_hsync_start - par->lcd_hdisp;
3311                                 par->lcd_lower_margin = lcd_vsync_start - par->lcd_vdisp;
3312                                 par->lcd_hblank_len = par->lcd_htotal - par->lcd_hdisp;
3313                                 par->lcd_vblank_len = par->lcd_vtotal - par->lcd_vdisp;
3314                                 break;
3315                         }
3316
3317                         lcdmodeptr++;
3318                 }
3319                 if (*lcdmodeptr == 0) {
3320                         PRINTKE("LCD monitor CRTC parameters not found!!!\n");
3321                         /* To do: Switch to CRT if possible. */
3322                 } else {
3323                         PRINTKI("       LCD CRTC parameters: %d.%d  %d %d %d %d  %d %d %d %d\n",
3324                                 1000000 / par->lcd_pixclock, 1000000 % par->lcd_pixclock,
3325                                 par->lcd_hdisp,
3326                                 par->lcd_hdisp + par->lcd_right_margin,
3327                                 par->lcd_hdisp + par->lcd_right_margin
3328                                         + par->lcd_hsync_dly + par->lcd_hsync_len,
3329                                 par->lcd_htotal,
3330                                 par->lcd_vdisp,
3331                                 par->lcd_vdisp + par->lcd_lower_margin,
3332                                 par->lcd_vdisp + par->lcd_lower_margin + par->lcd_vsync_len,
3333                                 par->lcd_vtotal);
3334                         PRINTKI("                          : %d %d %d %d %d %d %d %d %d\n",
3335                                 par->lcd_pixclock,
3336                                 par->lcd_hblank_len - (par->lcd_right_margin +
3337                                         par->lcd_hsync_dly + par->lcd_hsync_len),
3338                                 par->lcd_hdisp,
3339                                 par->lcd_right_margin,
3340                                 par->lcd_hsync_len,
3341                                 par->lcd_vblank_len - (par->lcd_lower_margin + par->lcd_vsync_len),
3342                                 par->lcd_vdisp,
3343                                 par->lcd_lower_margin,
3344                                 par->lcd_vsync_len);
3345                 }
3346         }
3347 }
3348 #endif /* CONFIG_FB_ATY_GENERIC_LCD */
3349
3350 static int init_from_bios(struct atyfb_par *par)
3351 {
3352         u32 bios_base, rom_addr;
3353         int ret;
3354
3355         rom_addr = 0xc0000 + ((aty_ld_le32(SCRATCH_REG1, par) & 0x7f) << 11);
3356         bios_base = (unsigned long)ioremap(rom_addr, 0x10000);
3357
3358         /* The BIOS starts with 0xaa55. */
3359         if (*((u16 *)bios_base) == 0xaa55) {
3360
3361                 u8 *bios_ptr;
3362                 u16 rom_table_offset, freq_table_offset;
3363                 PLL_BLOCK_MACH64 pll_block;
3364
3365                 PRINTKI("Mach64 BIOS is located at %x, mapped at %x.\n", rom_addr, bios_base);
3366
3367                 /* check for frequncy table */
3368                 bios_ptr = (u8*)bios_base;
3369                 rom_table_offset = (u16)(bios_ptr[0x48] | (bios_ptr[0x49] << 8));
3370                 freq_table_offset = bios_ptr[rom_table_offset + 16] | (bios_ptr[rom_table_offset + 17] << 8);
3371                 memcpy(&pll_block, bios_ptr + freq_table_offset, sizeof(PLL_BLOCK_MACH64));
3372
3373                 PRINTKI("BIOS frequency table:\n");
3374                 PRINTKI("PCLK_min_freq %d, PCLK_max_freq %d, ref_freq %d, ref_divider %d\n",
3375                         pll_block.PCLK_min_freq, pll_block.PCLK_max_freq,
3376                         pll_block.ref_freq, pll_block.ref_divider);
3377                 PRINTKI("MCLK_pwd %d, MCLK_max_freq %d, XCLK_max_freq %d, SCLK_freq %d\n",
3378                         pll_block.MCLK_pwd, pll_block.MCLK_max_freq,
3379                         pll_block.XCLK_max_freq, pll_block.SCLK_freq);
3380
3381                 par->pll_limits.pll_min = pll_block.PCLK_min_freq/100;
3382                 par->pll_limits.pll_max = pll_block.PCLK_max_freq/100;
3383                 par->pll_limits.ref_clk = pll_block.ref_freq/100;
3384                 par->pll_limits.ref_div = pll_block.ref_divider;
3385                 par->pll_limits.sclk = pll_block.SCLK_freq/100;
3386                 par->pll_limits.mclk = pll_block.MCLK_max_freq/100;
3387                 par->pll_limits.mclk_pm = pll_block.MCLK_pwd/100;
3388                 par->pll_limits.xclk = pll_block.XCLK_max_freq/100;
3389 #ifdef CONFIG_FB_ATY_GENERIC_LCD
3390                 aty_init_lcd(par, bios_base);
3391 #endif
3392                 ret = 0;
3393         } else {
3394                 PRINTKE("no BIOS frequency table found, use parameters\n");
3395                 ret = -ENXIO;
3396         }
3397         iounmap((void __iomem *)bios_base);
3398
3399         return ret;
3400 }
3401 #endif /* __i386__ */
3402
3403 static int atyfb_setup_generic(struct pci_dev *pdev, struct fb_info *info,
3404                                unsigned long addr)
3405 {
3406         struct atyfb_par *par = info->par;
3407         u16 tmp;
3408         unsigned long raddr;
3409         struct resource *rrp;
3410         int ret = 0;
3411
3412         raddr = addr + 0x7ff000UL;
3413         rrp = &pdev->resource[2];
3414         if ((rrp->flags & IORESOURCE_MEM) &&
3415             request_mem_region(rrp->start, resource_size(rrp), "atyfb")) {
3416                 par->aux_start = rrp->start;
3417                 par->aux_size = resource_size(rrp);
3418                 raddr = rrp->start;
3419                 PRINTKI("using auxiliary register aperture\n");
3420         }
3421
3422         info->fix.mmio_start = raddr;
3423         /*
3424          * By using strong UC we force the MTRR to never have an
3425          * effect on the MMIO region on both non-PAT and PAT systems.
3426          */
3427         par->ati_regbase = ioremap_uc(info->fix.mmio_start, 0x1000);
3428         if (par->ati_regbase == NULL)
3429                 return -ENOMEM;
3430
3431         info->fix.mmio_start += par->aux_start ? 0x400 : 0xc00;
3432         par->ati_regbase += par->aux_start ? 0x400 : 0xc00;
3433
3434         /*
3435          * Enable memory-space accesses using config-space
3436          * command register.
3437          */
3438         pci_read_config_word(pdev, PCI_COMMAND, &tmp);
3439         if (!(tmp & PCI_COMMAND_MEMORY)) {
3440                 tmp |= PCI_COMMAND_MEMORY;
3441                 pci_write_config_word(pdev, PCI_COMMAND, tmp);
3442         }
3443 #ifdef __BIG_ENDIAN
3444         /* Use the big-endian aperture */
3445         addr += 0x800000;
3446 #endif
3447
3448         /* Map in frame buffer */
3449         info->fix.smem_start = addr;
3450
3451         /*
3452          * The framebuffer is not always 8 MiB, that's just the size of the
3453          * PCI BAR. We temporarily abuse smem_len here to store the size
3454          * of the BAR. aty_init() will later correct it to match the actual
3455          * framebuffer size.
3456          *
3457          * On devices that don't have the auxiliary register aperture, the
3458          * registers are housed at the top end of the framebuffer PCI BAR.
3459          * aty_fudge_framebuffer_len() is used to reduce smem_len to not
3460          * overlap with the registers.
3461          */
3462         info->fix.smem_len = 0x800000;
3463
3464         aty_fudge_framebuffer_len(info);
3465
3466         info->screen_base = ioremap_wc(info->fix.smem_start,
3467                                        info->fix.smem_len);
3468         if (info->screen_base == NULL) {
3469                 ret = -ENOMEM;
3470                 goto atyfb_setup_generic_fail;
3471         }
3472
3473         ret = correct_chipset(par);
3474         if (ret)
3475                 goto atyfb_setup_generic_fail;
3476 #ifdef __i386__
3477         ret = init_from_bios(par);
3478         if (ret)
3479                 goto atyfb_setup_generic_fail;
3480 #endif
3481         if (!(aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_EXT_DISP_EN))
3482                 par->clk_wr_offset = (inb(R_GENMO) & 0x0CU) >> 2;
3483         else
3484                 par->clk_wr_offset = aty_ld_8(CLOCK_CNTL, par) & 0x03U;
3485
3486         /* according to ATI, we should use clock 3 for acelerated mode */
3487         par->clk_wr_offset = 3;
3488
3489         return 0;
3490
3491 atyfb_setup_generic_fail:
3492         iounmap(par->ati_regbase);
3493         par->ati_regbase = NULL;
3494         if (info->screen_base) {
3495                 iounmap(info->screen_base);
3496                 info->screen_base = NULL;
3497         }
3498         return ret;
3499 }
3500
3501 #endif /* !__sparc__ */
3502
3503 static int atyfb_pci_probe(struct pci_dev *pdev,
3504                            const struct pci_device_id *ent)
3505 {
3506         unsigned long addr, res_start, res_size;
3507         struct fb_info *info;
3508         struct resource *rp;
3509         struct atyfb_par *par;
3510         int rc = -ENOMEM;
3511
3512         /* Enable device in PCI config */
3513         if (pci_enable_device(pdev)) {
3514                 PRINTKE("Cannot enable PCI device\n");
3515                 return -ENXIO;
3516         }
3517
3518         /* Find which resource to use */
3519         rp = &pdev->resource[0];
3520         if (rp->flags & IORESOURCE_IO)
3521                 rp = &pdev->resource[1];
3522         addr = rp->start;
3523         if (!addr)
3524                 return -ENXIO;
3525
3526         /* Reserve space */
3527         res_start = rp->start;
3528         res_size = resource_size(rp);
3529         if (!request_mem_region(res_start, res_size, "atyfb"))
3530                 return -EBUSY;
3531
3532         /* Allocate framebuffer */
3533         info = framebuffer_alloc(sizeof(struct atyfb_par), &pdev->dev);
3534         if (!info)
3535                 return -ENOMEM;
3536
3537         par = info->par;
3538         par->bus_type = PCI;
3539         info->fix = atyfb_fix;
3540         info->device = &pdev->dev;
3541         par->pci_id = pdev->device;
3542         par->res_start = res_start;
3543         par->res_size = res_size;
3544         par->irq = pdev->irq;
3545         par->pdev = pdev;
3546
3547         /* Setup "info" structure */
3548 #ifdef __sparc__
3549         rc = atyfb_setup_sparc(pdev, info, addr);
3550 #else
3551         rc = atyfb_setup_generic(pdev, info, addr);
3552 #endif
3553         if (rc)
3554                 goto err_release_mem;
3555
3556         pci_set_drvdata(pdev, info);
3557
3558         /* Init chip & register framebuffer */
3559         rc = aty_init(info);
3560         if (rc)
3561                 goto err_release_io;
3562
3563 #ifdef __sparc__
3564         /*
3565          * Add /dev/fb mmap values.
3566          */
3567         par->mmap_map[0].voff = 0x8000000000000000UL;
3568         par->mmap_map[0].poff = (unsigned long) info->screen_base & PAGE_MASK;
3569         par->mmap_map[0].size = info->fix.smem_len;
3570         par->mmap_map[0].prot_mask = _PAGE_CACHE;
3571         par->mmap_map[0].prot_flag = _PAGE_E;
3572         par->mmap_map[1].voff = par->mmap_map[0].voff + info->fix.smem_len;
3573         par->mmap_map[1].poff = (long)par->ati_regbase & PAGE_MASK;
3574         par->mmap_map[1].size = PAGE_SIZE;
3575         par->mmap_map[1].prot_mask = _PAGE_CACHE;
3576         par->mmap_map[1].prot_flag = _PAGE_E;
3577 #endif /* __sparc__ */
3578
3579         mutex_lock(&reboot_lock);
3580         if (!reboot_info)
3581                 reboot_info = info;
3582         mutex_unlock(&reboot_lock);
3583
3584         return 0;
3585
3586 err_release_io:
3587 #ifdef __sparc__
3588         kfree(par->mmap_map);
3589 #else
3590         if (par->ati_regbase)
3591                 iounmap(par->ati_regbase);
3592         if (info->screen_base)
3593                 iounmap(info->screen_base);
3594 #endif
3595 err_release_mem:
3596         if (par->aux_start)
3597                 release_mem_region(par->aux_start, par->aux_size);
3598
3599         release_mem_region(par->res_start, par->res_size);
3600         framebuffer_release(info);
3601
3602         return rc;
3603 }
3604
3605 #endif /* CONFIG_PCI */
3606
3607 #ifdef CONFIG_ATARI
3608
3609 static int __init atyfb_atari_probe(void)
3610 {
3611         struct atyfb_par *par;
3612         struct fb_info *info;
3613         int m64_num;
3614         u32 clock_r;
3615         int num_found = 0;
3616
3617         for (m64_num = 0; m64_num < mach64_count; m64_num++) {
3618                 if (!phys_vmembase[m64_num] || !phys_size[m64_num] ||
3619                     !phys_guiregbase[m64_num]) {
3620                         PRINTKI("phys_*[%d] parameters not set => "
3621                                 "returning early. \n", m64_num);
3622                         continue;
3623                 }
3624
3625                 info = framebuffer_alloc(sizeof(struct atyfb_par), NULL);
3626                 if (!info)
3627                         return -ENOMEM;
3628
3629                 par = info->par;
3630
3631                 info->fix = atyfb_fix;
3632
3633                 par->irq = (unsigned int) -1; /* something invalid */
3634
3635                 /*
3636                  * Map the video memory (physical address given)
3637                  * to somewhere in the kernel address space.
3638                  */
3639                 info->screen_base = ioremap_wc(phys_vmembase[m64_num],
3640                                                phys_size[m64_num]);
3641                 info->fix.smem_start = (unsigned long)info->screen_base; /* Fake! */
3642                 par->ati_regbase = ioremap(phys_guiregbase[m64_num], 0x10000) +
3643                                                 0xFC00ul;
3644                 info->fix.mmio_start = (unsigned long)par->ati_regbase; /* Fake! */
3645
3646                 aty_st_le32(CLOCK_CNTL, 0x12345678, par);
3647                 clock_r = aty_ld_le32(CLOCK_CNTL, par);
3648
3649                 switch (clock_r & 0x003F) {
3650                 case 0x12:
3651                         par->clk_wr_offset = 3; /*  */
3652                         break;
3653                 case 0x34:
3654                         par->clk_wr_offset = 2; /* Medusa ST-IO ISA Adapter etc. */
3655                         break;
3656                 case 0x16:
3657                         par->clk_wr_offset = 1; /*  */
3658                         break;
3659                 case 0x38:
3660                         par->clk_wr_offset = 0; /* Panther 1 ISA Adapter (Gerald) */
3661                         break;
3662                 }
3663
3664                 /* Fake pci_id for correct_chipset() */
3665                 switch (aty_ld_le32(CNFG_CHIP_ID, par) & CFG_CHIP_TYPE) {
3666                 case 0x00d7:
3667                         par->pci_id = PCI_CHIP_MACH64GX;
3668                         break;
3669                 case 0x0057:
3670                         par->pci_id = PCI_CHIP_MACH64CX;
3671                         break;
3672                 default:
3673                         break;
3674                 }
3675
3676                 if (correct_chipset(par) || aty_init(info)) {
3677                         iounmap(info->screen_base);
3678                         iounmap(par->ati_regbase);
3679                         framebuffer_release(info);
3680                 } else {
3681                         num_found++;
3682                 }
3683         }
3684
3685         return num_found ? 0 : -ENXIO;
3686 }
3687
3688 #endif /* CONFIG_ATARI */
3689
3690 #ifdef CONFIG_PCI
3691
3692 static void atyfb_remove(struct fb_info *info)
3693 {
3694         struct atyfb_par *par = (struct atyfb_par *) info->par;
3695
3696         /* restore video mode */
3697         aty_set_crtc(par, &par->saved_crtc);
3698         par->pll_ops->set_pll(info, &par->saved_pll);
3699
3700         unregister_framebuffer(info);
3701
3702 #ifdef CONFIG_FB_ATY_BACKLIGHT
3703         if (M64_HAS(MOBIL_BUS))
3704                 aty_bl_exit(info->bl_dev);
3705 #endif
3706         arch_phys_wc_del(par->wc_cookie);
3707
3708 #ifndef __sparc__
3709         if (par->ati_regbase)
3710                 iounmap(par->ati_regbase);
3711         if (info->screen_base)
3712                 iounmap(info->screen_base);
3713 #ifdef __BIG_ENDIAN
3714         if (info->sprite.addr)
3715                 iounmap(info->sprite.addr);
3716 #endif
3717 #endif
3718 #ifdef __sparc__
3719         kfree(par->mmap_map);
3720 #endif
3721         if (par->aux_start)
3722                 release_mem_region(par->aux_start, par->aux_size);
3723
3724         if (par->res_start)
3725                 release_mem_region(par->res_start, par->res_size);
3726
3727         framebuffer_release(info);
3728 }
3729
3730
3731 static void atyfb_pci_remove(struct pci_dev *pdev)
3732 {
3733         struct fb_info *info = pci_get_drvdata(pdev);
3734
3735         mutex_lock(&reboot_lock);
3736         if (reboot_info == info)
3737                 reboot_info = NULL;
3738         mutex_unlock(&reboot_lock);
3739
3740         atyfb_remove(info);
3741 }
3742
3743 static const struct pci_device_id atyfb_pci_tbl[] = {
3744 #ifdef CONFIG_FB_ATY_GX
3745         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GX) },
3746         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CX) },
3747 #endif /* CONFIG_FB_ATY_GX */
3748
3749 #ifdef CONFIG_FB_ATY_CT
3750         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64CT) },
3751         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64ET) },
3752
3753         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LT) },
3754
3755         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VT) },
3756         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GT) },
3757
3758         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VU) },
3759         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GU) },
3760
3761         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LG) },
3762
3763         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64VV) },
3764
3765         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GV) },
3766         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GW) },
3767         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GY) },
3768         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GZ) },
3769
3770         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GB) },
3771         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GD) },
3772         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GI) },
3773         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GP) },
3774         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GQ) },
3775
3776         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LB) },
3777         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LD) },
3778         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LI) },
3779         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LP) },
3780         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LQ) },
3781
3782         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GM) },
3783         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GN) },
3784         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GO) },
3785         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GL) },
3786         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GR) },
3787         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64GS) },
3788
3789         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LM) },
3790         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LN) },
3791         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LR) },
3792         { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_CHIP_MACH64LS) },
3793 #endif /* CONFIG_FB_ATY_CT */
3794         { }
3795 };
3796
3797 MODULE_DEVICE_TABLE(pci, atyfb_pci_tbl);
3798
3799 static struct pci_driver atyfb_driver = {
3800         .name           = "atyfb",
3801         .id_table       = atyfb_pci_tbl,
3802         .probe          = atyfb_pci_probe,
3803         .remove         = atyfb_pci_remove,
3804 #ifdef CONFIG_PM
3805         .suspend        = atyfb_pci_suspend,
3806         .resume         = atyfb_pci_resume,
3807 #endif /* CONFIG_PM */
3808 };
3809
3810 #endif /* CONFIG_PCI */
3811
3812 #ifndef MODULE
3813 static int __init atyfb_setup(char *options)
3814 {
3815         char *this_opt;
3816
3817         if (!options || !*options)
3818                 return 0;
3819
3820         while ((this_opt = strsep(&options, ",")) != NULL) {
3821                 if (!strncmp(this_opt, "noaccel", 7)) {
3822                         noaccel = 1;
3823                 } else if (!strncmp(this_opt, "nomtrr", 6)) {
3824                         nomtrr = 1;
3825                 } else if (!strncmp(this_opt, "vram:", 5))
3826                         vram = simple_strtoul(this_opt + 5, NULL, 0);
3827                 else if (!strncmp(this_opt, "pll:", 4))
3828                         pll = simple_strtoul(this_opt + 4, NULL, 0);
3829                 else if (!strncmp(this_opt, "mclk:", 5))
3830                         mclk = simple_strtoul(this_opt + 5, NULL, 0);
3831                 else if (!strncmp(this_opt, "xclk:", 5))
3832                         xclk = simple_strtoul(this_opt+5, NULL, 0);
3833                 else if (!strncmp(this_opt, "comp_sync:", 10))
3834                         comp_sync = simple_strtoul(this_opt+10, NULL, 0);
3835                 else if (!strncmp(this_opt, "backlight:", 10))
3836                         backlight = simple_strtoul(this_opt+10, NULL, 0);
3837 #ifdef CONFIG_PPC
3838                 else if (!strncmp(this_opt, "vmode:", 6)) {
3839                         unsigned int vmode =
3840                             simple_strtoul(this_opt + 6, NULL, 0);
3841                         if (vmode > 0 && vmode <= VMODE_MAX)
3842                                 default_vmode = vmode;
3843                 } else if (!strncmp(this_opt, "cmode:", 6)) {
3844                         unsigned int cmode =
3845                             simple_strtoul(this_opt + 6, NULL, 0);
3846                         switch (cmode) {
3847                         case 0:
3848                         case 8:
3849                                 default_cmode = CMODE_8;
3850                                 break;
3851                         case 15:
3852                         case 16:
3853                                 default_cmode = CMODE_16;
3854                                 break;
3855                         case 24:
3856                         case 32:
3857                                 default_cmode = CMODE_32;
3858                                 break;
3859                         }
3860                 }
3861 #endif
3862 #ifdef CONFIG_ATARI
3863                 /*
3864                  * Why do we need this silly Mach64 argument?
3865                  * We are already here because of mach64= so its redundant.
3866                  */
3867                 else if (MACH_IS_ATARI
3868                          && (!strncmp(this_opt, "Mach64:", 7))) {
3869                         static unsigned char m64_num;
3870                         static char mach64_str[80];
3871                         strlcpy(mach64_str, this_opt + 7, sizeof(mach64_str));
3872                         if (!store_video_par(mach64_str, m64_num)) {
3873                                 m64_num++;
3874                                 mach64_count = m64_num;
3875                         }
3876                 }
3877 #endif
3878                 else
3879                         mode = this_opt;
3880         }
3881         return 0;
3882 }
3883 #endif  /*  MODULE  */
3884
3885 static int atyfb_reboot_notify(struct notifier_block *nb,
3886                                unsigned long code, void *unused)
3887 {
3888         struct atyfb_par *par;
3889
3890         if (code != SYS_RESTART)
3891                 return NOTIFY_DONE;
3892
3893         mutex_lock(&reboot_lock);
3894
3895         if (!reboot_info)
3896                 goto out;
3897
3898         lock_fb_info(reboot_info);
3899
3900         par = reboot_info->par;
3901
3902         /*
3903          * HP OmniBook 500's BIOS doesn't like the state of the
3904          * hardware after atyfb has been used. Restore the hardware
3905          * to the original state to allow successful reboots.
3906          */
3907         aty_set_crtc(par, &par->saved_crtc);
3908         par->pll_ops->set_pll(reboot_info, &par->saved_pll);
3909
3910         unlock_fb_info(reboot_info);
3911  out:
3912         mutex_unlock(&reboot_lock);
3913
3914         return NOTIFY_DONE;
3915 }
3916
3917 static struct notifier_block atyfb_reboot_notifier = {
3918         .notifier_call = atyfb_reboot_notify,
3919 };
3920
3921 static const struct dmi_system_id atyfb_reboot_ids[] __initconst = {
3922         {
3923                 .ident = "HP OmniBook 500",
3924                 .matches = {
3925                         DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
3926                         DMI_MATCH(DMI_PRODUCT_NAME, "HP OmniBook PC"),
3927                         DMI_MATCH(DMI_PRODUCT_VERSION, "HP OmniBook 500 FA"),
3928                 },
3929         },
3930
3931         { }
3932 };
3933 static bool registered_notifier = false;
3934
3935 static int __init atyfb_init(void)
3936 {
3937         int err1 = 1, err2 = 1;
3938 #ifndef MODULE
3939         char *option = NULL;
3940
3941         if (fb_get_options("atyfb", &option))
3942                 return -ENODEV;
3943         atyfb_setup(option);
3944 #endif
3945
3946 #ifdef CONFIG_PCI
3947         err1 = pci_register_driver(&atyfb_driver);
3948 #endif
3949 #ifdef CONFIG_ATARI
3950         err2 = atyfb_atari_probe();
3951 #endif
3952
3953         if (err1 && err2)
3954                 return -ENODEV;
3955
3956         if (dmi_check_system(atyfb_reboot_ids)) {
3957                 register_reboot_notifier(&atyfb_reboot_notifier);
3958                 registered_notifier = true;
3959         }
3960
3961         return 0;
3962 }
3963
3964 static void __exit atyfb_exit(void)
3965 {
3966         if (registered_notifier)
3967                 unregister_reboot_notifier(&atyfb_reboot_notifier);
3968
3969 #ifdef CONFIG_PCI
3970         pci_unregister_driver(&atyfb_driver);
3971 #endif
3972 }
3973
3974 module_init(atyfb_init);
3975 module_exit(atyfb_exit);
3976
3977 MODULE_DESCRIPTION("FBDev driver for ATI Mach64 cards");
3978 MODULE_LICENSE("GPL");
3979 module_param(noaccel, bool, 0);
3980 MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
3981 module_param(vram, int, 0);
3982 MODULE_PARM_DESC(vram, "int: override size of video ram");
3983 module_param(pll, int, 0);
3984 MODULE_PARM_DESC(pll, "int: override video clock");
3985 module_param(mclk, int, 0);
3986 MODULE_PARM_DESC(mclk, "int: override memory clock");
3987 module_param(xclk, int, 0);
3988 MODULE_PARM_DESC(xclk, "int: override accelerated engine clock");
3989 module_param(comp_sync, int, 0);
3990 MODULE_PARM_DESC(comp_sync, "Set composite sync signal to low (0) or high (1)");
3991 module_param(mode, charp, 0);
3992 MODULE_PARM_DESC(mode, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
3993 module_param(nomtrr, bool, 0);
3994 MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers");