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