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