2 * linux/drivers/video/riva/fbdev.c - nVidia RIVA 128/TNT/TNT2 fb driver
4 * Maintained by Ani Joshi <ajoshi@shell.unixbox.com>
6 * Copyright 1999-2000 Jeff Garzik
10 * Ani Joshi: Lots of debugging and cleanup work, really helped
11 * get the driver going
13 * Ferenc Bakonyi: Bug fixes, cleanup, modularization
15 * Jindrich Makovicka: Accel code help, hw cursor, mtrr
17 * Paul Richards: Bug fixes, updates
19 * Initial template from skeletonfb.c, created 28 Dec 1997 by Geert Uytterhoeven
20 * Includes riva_hw.c from nVidia, see copyright below.
21 * KGI code provided the basis for state storage, init, and mode switching.
23 * This file is subject to the terms and conditions of the GNU General Public
24 * License. See the file COPYING in the main directory of this archive
27 * Known bugs and issues:
28 * restoring text mode fails
29 * doublescan modes are broken
32 #include <linux/config.h>
33 #include <linux/module.h>
34 #include <linux/kernel.h>
35 #include <linux/errno.h>
36 #include <linux/string.h>
38 #include <linux/tty.h>
39 #include <linux/slab.h>
40 #include <linux/delay.h>
42 #include <linux/init.h>
43 #include <linux/pci.h>
44 #include <linux/backlight.h>
50 #include <asm/pci-bridge.h>
52 #ifdef CONFIG_PMAC_BACKLIGHT
53 #include <asm/machdep.h>
54 #include <asm/backlight.h>
60 #ifndef CONFIG_PCI /* sanity check */
61 #error This driver requires PCI support.
64 /* version number of this driver */
65 #define RIVAFB_VERSION "0.9.5b"
67 /* ------------------------------------------------------------------------- *
69 * various helpful macros and constants
71 * ------------------------------------------------------------------------- */
72 #ifdef CONFIG_FB_RIVA_DEBUG
73 #define NVTRACE printk
75 #define NVTRACE if(0) printk
78 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
79 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
81 #ifdef CONFIG_FB_RIVA_DEBUG
82 #define assert(expr) \
84 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
85 #expr,__FILE__,__FUNCTION__,__LINE__); \
92 #define PFX "rivafb: "
94 /* macro that allows you to set overflow bits */
95 #define SetBitField(value,from,to) SetBF(to,GetBF(value,from))
96 #define SetBit(n) (1<<(n))
97 #define Set8Bits(value) ((value)&0xff)
99 /* HW cursor parameters */
102 /* ------------------------------------------------------------------------- *
106 * ------------------------------------------------------------------------- */
108 static int rivafb_blank(int blank, struct fb_info *info);
110 /* ------------------------------------------------------------------------- *
112 * card identification
114 * ------------------------------------------------------------------------- */
116 static struct pci_device_id rivafb_pci_tbl[] = {
117 { PCI_VENDOR_ID_NVIDIA_SGS, PCI_DEVICE_ID_NVIDIA_SGS_RIVA128,
118 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
119 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT,
120 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
121 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT2,
122 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
123 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UTNT2,
124 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
125 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_VTNT2,
126 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
127 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UVTNT2,
128 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
129 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_ITNT2,
130 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
131 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR,
132 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
133 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR,
134 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
135 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO,
136 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
137 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX,
138 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
139 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2,
140 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
141 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO,
142 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
143 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR,
144 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
145 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS,
146 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
147 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2,
148 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
149 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA,
150 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
151 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO,
152 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
153 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460,
154 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
155 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440,
156 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
157 // NF2/IGP version, GeForce 4 MX, NV18
158 { PCI_VENDOR_ID_NVIDIA, 0x01f0,
159 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
160 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420,
161 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
162 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO,
163 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
164 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO,
165 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
166 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32,
167 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
168 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL,
169 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
170 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64,
171 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
172 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_200,
173 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
174 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL,
175 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
176 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL,
177 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
178 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_IGEFORCE2,
179 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
180 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3,
181 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
182 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_1,
183 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
184 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_2,
185 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
186 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_DDC,
187 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
188 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600,
189 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
190 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400,
191 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
192 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200,
193 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
194 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL,
195 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
196 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL,
197 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
198 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL,
199 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
200 { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO_5200,
201 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
202 { 0, } /* terminate list */
204 MODULE_DEVICE_TABLE(pci, rivafb_pci_tbl);
206 /* ------------------------------------------------------------------------- *
210 * ------------------------------------------------------------------------- */
212 /* command line data, set in rivafb_setup() */
213 static int flatpanel __devinitdata = -1; /* Autodetect later */
214 static int forceCRTC __devinitdata = -1;
215 static int noaccel __devinitdata = 0;
217 static int nomtrr __devinitdata = 0;
220 static char *mode_option __devinitdata = NULL;
221 static int strictmode = 0;
223 static struct fb_fix_screeninfo __devinitdata rivafb_fix = {
224 .type = FB_TYPE_PACKED_PIXELS,
229 static struct fb_var_screeninfo __devinitdata rivafb_default_var = {
239 .activate = FB_ACTIVATE_NOW,
249 .vmode = FB_VMODE_NONINTERLACED
253 static const struct riva_regs reg_template = {
254 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* ATTR */
255 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
256 0x41, 0x01, 0x0F, 0x00, 0x00},
257 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* CRT */
258 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, /* 0x10 */
260 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20 */
262 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30 */
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, /* GRA */
269 {0x03, 0x01, 0x0F, 0x00, 0x0E}, /* SEQ */
276 #ifdef CONFIG_FB_RIVA_BACKLIGHT
277 /* We do not have any information about which values are allowed, thus
278 * we used safe values.
280 #define MIN_LEVEL 0x158
281 #define MAX_LEVEL 0x534
283 static struct backlight_properties riva_bl_data;
285 static int riva_bl_get_level_brightness(struct riva_par *par,
288 struct fb_info *info = pci_get_drvdata(par->pdev);
291 /* Get and convert the value */
292 mutex_lock(&info->bl_mutex);
293 nlevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL;
294 mutex_unlock(&info->bl_mutex);
298 else if (nlevel < MIN_LEVEL)
300 else if (nlevel > MAX_LEVEL)
306 static int riva_bl_update_status(struct backlight_device *bd)
308 struct riva_par *par = class_get_devdata(&bd->class_dev);
309 U032 tmp_pcrt, tmp_pmc;
312 if (bd->props->power != FB_BLANK_UNBLANK ||
313 bd->props->fb_blank != FB_BLANK_UNBLANK)
316 level = bd->props->brightness;
318 tmp_pmc = par->riva.PMC[0x10F0/4] & 0x0000FFFF;
319 tmp_pcrt = par->riva.PCRTC0[0x081C/4] & 0xFFFFFFFC;
322 tmp_pmc |= (1 << 31); /* backlight bit */
323 tmp_pmc |= riva_bl_get_level_brightness(par, level) << 16; /* level */
325 par->riva.PCRTC0[0x081C/4] = tmp_pcrt;
326 par->riva.PMC[0x10F0/4] = tmp_pmc;
331 static int riva_bl_get_brightness(struct backlight_device *bd)
333 return bd->props->brightness;
336 static struct backlight_properties riva_bl_data = {
337 .owner = THIS_MODULE,
338 .get_brightness = riva_bl_get_brightness,
339 .update_status = riva_bl_update_status,
340 .max_brightness = (FB_BACKLIGHT_LEVELS - 1),
343 static void riva_bl_init(struct riva_par *par)
345 struct fb_info *info = pci_get_drvdata(par->pdev);
346 struct backlight_device *bd;
352 #ifdef CONFIG_PMAC_BACKLIGHT
353 if (!machine_is(powermac) ||
354 !pmac_has_backlight_type("mnca"))
358 snprintf(name, sizeof(name), "rivabl%d", info->node);
360 bd = backlight_device_register(name, par, &riva_bl_data);
363 printk("riva: Backlight registration failed\n");
367 mutex_lock(&info->bl_mutex);
369 fb_bl_default_curve(info, 0,
370 0x158 * FB_BACKLIGHT_MAX / MAX_LEVEL,
371 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL);
372 mutex_unlock(&info->bl_mutex);
375 bd->props->brightness = riva_bl_data.max_brightness;
376 bd->props->power = FB_BLANK_UNBLANK;
377 bd->props->update_status(bd);
380 #ifdef CONFIG_PMAC_BACKLIGHT
381 mutex_lock(&pmac_backlight_mutex);
384 mutex_unlock(&pmac_backlight_mutex);
387 printk("riva: Backlight initialized (%s)\n", name);
395 static void riva_bl_exit(struct riva_par *par)
397 struct fb_info *info = pci_get_drvdata(par->pdev);
399 #ifdef CONFIG_PMAC_BACKLIGHT
400 mutex_lock(&pmac_backlight_mutex);
403 mutex_lock(&info->bl_mutex);
405 #ifdef CONFIG_PMAC_BACKLIGHT
406 if (pmac_backlight == info->bl_dev)
407 pmac_backlight = NULL;
410 backlight_device_unregister(info->bl_dev);
412 printk("riva: Backlight unloaded\n");
414 mutex_unlock(&info->bl_mutex);
416 #ifdef CONFIG_PMAC_BACKLIGHT
417 mutex_unlock(&pmac_backlight_mutex);
421 static inline void riva_bl_init(struct riva_par *par) {}
422 static inline void riva_bl_exit(struct riva_par *par) {}
423 #endif /* CONFIG_FB_RIVA_BACKLIGHT */
425 /* ------------------------------------------------------------------------- *
429 * ------------------------------------------------------------------------- */
431 static inline void CRTCout(struct riva_par *par, unsigned char index,
434 VGA_WR08(par->riva.PCIO, 0x3d4, index);
435 VGA_WR08(par->riva.PCIO, 0x3d5, val);
438 static inline unsigned char CRTCin(struct riva_par *par,
441 VGA_WR08(par->riva.PCIO, 0x3d4, index);
442 return (VGA_RD08(par->riva.PCIO, 0x3d5));
445 static inline void GRAout(struct riva_par *par, unsigned char index,
448 VGA_WR08(par->riva.PVIO, 0x3ce, index);
449 VGA_WR08(par->riva.PVIO, 0x3cf, val);
452 static inline unsigned char GRAin(struct riva_par *par,
455 VGA_WR08(par->riva.PVIO, 0x3ce, index);
456 return (VGA_RD08(par->riva.PVIO, 0x3cf));
459 static inline void SEQout(struct riva_par *par, unsigned char index,
462 VGA_WR08(par->riva.PVIO, 0x3c4, index);
463 VGA_WR08(par->riva.PVIO, 0x3c5, val);
466 static inline unsigned char SEQin(struct riva_par *par,
469 VGA_WR08(par->riva.PVIO, 0x3c4, index);
470 return (VGA_RD08(par->riva.PVIO, 0x3c5));
473 static inline void ATTRout(struct riva_par *par, unsigned char index,
476 VGA_WR08(par->riva.PCIO, 0x3c0, index);
477 VGA_WR08(par->riva.PCIO, 0x3c0, val);
480 static inline unsigned char ATTRin(struct riva_par *par,
483 VGA_WR08(par->riva.PCIO, 0x3c0, index);
484 return (VGA_RD08(par->riva.PCIO, 0x3c1));
487 static inline void MISCout(struct riva_par *par, unsigned char val)
489 VGA_WR08(par->riva.PVIO, 0x3c2, val);
492 static inline unsigned char MISCin(struct riva_par *par)
494 return (VGA_RD08(par->riva.PVIO, 0x3cc));
497 static u8 byte_rev[256] = {
498 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
499 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
500 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
501 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
502 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
503 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
504 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
505 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
506 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
507 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
508 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
509 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
510 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
511 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
512 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
513 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
514 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
515 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
516 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
517 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
518 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
519 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
520 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
521 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
522 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
523 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
524 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
525 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
526 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
527 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
528 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
529 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
532 static inline void reverse_order(u32 *l)
535 *a = byte_rev[*a], a++;
536 *a = byte_rev[*a], a++;
537 *a = byte_rev[*a], a++;
541 /* ------------------------------------------------------------------------- *
545 * ------------------------------------------------------------------------- */
548 * rivafb_load_cursor_image - load cursor image to hardware
549 * @data: address to monochrome bitmap (1 = foreground color, 0 = background)
550 * @par: pointer to private data
551 * @w: width of cursor image in pixels
552 * @h: height of cursor image in scanlines
553 * @bg: background color (ARGB1555) - alpha bit determines opacity
554 * @fg: foreground color (ARGB1555)
557 * Loads cursor image based on a monochrome source and mask bitmap. The
558 * image bits determines the color of the pixel, 0 for background, 1 for
559 * foreground. Only the affected region (as determined by @w and @h
560 * parameters) will be updated.
565 static void rivafb_load_cursor_image(struct riva_par *par, u8 *data8,
566 u16 bg, u16 fg, u32 w, u32 h)
570 u32 *data = (u32 *)data8;
571 bg = le16_to_cpu(bg);
572 fg = le16_to_cpu(fg);
576 for (i = 0; i < h; i++) {
580 for (j = 0; j < w/2; j++) {
582 #if defined (__BIG_ENDIAN)
583 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
585 tmp |= (b & (1 << 31)) ? fg : bg;
588 tmp = (b & 1) ? fg : bg;
590 tmp |= (b & 1) ? fg << 16 : bg << 16;
593 writel(tmp, &par->riva.CURSOR[k++]);
595 k += (MAX_CURS - w)/2;
599 /* ------------------------------------------------------------------------- *
601 * general utility functions
603 * ------------------------------------------------------------------------- */
606 * riva_wclut - set CLUT entry
607 * @chip: pointer to RIVA_HW_INST object
608 * @regnum: register number
609 * @red: red component
610 * @green: green component
611 * @blue: blue component
614 * Sets color register @regnum.
619 static void riva_wclut(RIVA_HW_INST *chip,
620 unsigned char regnum, unsigned char red,
621 unsigned char green, unsigned char blue)
623 VGA_WR08(chip->PDIO, 0x3c8, regnum);
624 VGA_WR08(chip->PDIO, 0x3c9, red);
625 VGA_WR08(chip->PDIO, 0x3c9, green);
626 VGA_WR08(chip->PDIO, 0x3c9, blue);
630 * riva_rclut - read fromCLUT register
631 * @chip: pointer to RIVA_HW_INST object
632 * @regnum: register number
633 * @red: red component
634 * @green: green component
635 * @blue: blue component
638 * Reads red, green, and blue from color register @regnum.
643 static void riva_rclut(RIVA_HW_INST *chip,
644 unsigned char regnum, unsigned char *red,
645 unsigned char *green, unsigned char *blue)
648 VGA_WR08(chip->PDIO, 0x3c7, regnum);
649 *red = VGA_RD08(chip->PDIO, 0x3c9);
650 *green = VGA_RD08(chip->PDIO, 0x3c9);
651 *blue = VGA_RD08(chip->PDIO, 0x3c9);
655 * riva_save_state - saves current chip state
656 * @par: pointer to riva_par object containing info for current riva board
657 * @regs: pointer to riva_regs object
660 * Saves current chip state to @regs.
666 static void riva_save_state(struct riva_par *par, struct riva_regs *regs)
671 par->riva.LockUnlock(&par->riva, 0);
673 par->riva.UnloadStateExt(&par->riva, ®s->ext);
675 regs->misc_output = MISCin(par);
677 for (i = 0; i < NUM_CRT_REGS; i++)
678 regs->crtc[i] = CRTCin(par, i);
680 for (i = 0; i < NUM_ATC_REGS; i++)
681 regs->attr[i] = ATTRin(par, i);
683 for (i = 0; i < NUM_GRC_REGS; i++)
684 regs->gra[i] = GRAin(par, i);
686 for (i = 0; i < NUM_SEQ_REGS; i++)
687 regs->seq[i] = SEQin(par, i);
692 * riva_load_state - loads current chip state
693 * @par: pointer to riva_par object containing info for current riva board
694 * @regs: pointer to riva_regs object
697 * Loads chip state from @regs.
700 * riva_load_video_mode()
705 static void riva_load_state(struct riva_par *par, struct riva_regs *regs)
707 RIVA_HW_STATE *state = ®s->ext;
711 CRTCout(par, 0x11, 0x00);
713 par->riva.LockUnlock(&par->riva, 0);
715 par->riva.LoadStateExt(&par->riva, state);
717 MISCout(par, regs->misc_output);
719 for (i = 0; i < NUM_CRT_REGS; i++) {
725 CRTCout(par, i, regs->crtc[i]);
729 for (i = 0; i < NUM_ATC_REGS; i++)
730 ATTRout(par, i, regs->attr[i]);
732 for (i = 0; i < NUM_GRC_REGS; i++)
733 GRAout(par, i, regs->gra[i]);
735 for (i = 0; i < NUM_SEQ_REGS; i++)
736 SEQout(par, i, regs->seq[i]);
741 * riva_load_video_mode - calculate timings
742 * @info: pointer to fb_info object containing info for current riva board
745 * Calculate some timings and then send em off to riva_load_state().
750 static void riva_load_video_mode(struct fb_info *info)
752 int bpp, width, hDisplaySize, hDisplay, hStart,
753 hEnd, hTotal, height, vDisplay, vStart, vEnd, vTotal, dotClock;
754 int hBlankStart, hBlankEnd, vBlankStart, vBlankEnd;
755 struct riva_par *par = info->par;
756 struct riva_regs newmode;
759 /* time to calculate */
760 rivafb_blank(1, info);
762 bpp = info->var.bits_per_pixel;
763 if (bpp == 16 && info->var.green.length == 5)
765 width = info->var.xres_virtual;
766 hDisplaySize = info->var.xres;
767 hDisplay = (hDisplaySize / 8) - 1;
768 hStart = (hDisplaySize + info->var.right_margin) / 8 - 1;
769 hEnd = (hDisplaySize + info->var.right_margin +
770 info->var.hsync_len) / 8 - 1;
771 hTotal = (hDisplaySize + info->var.right_margin +
772 info->var.hsync_len + info->var.left_margin) / 8 - 5;
773 hBlankStart = hDisplay;
774 hBlankEnd = hTotal + 4;
776 height = info->var.yres_virtual;
777 vDisplay = info->var.yres - 1;
778 vStart = info->var.yres + info->var.lower_margin - 1;
779 vEnd = info->var.yres + info->var.lower_margin +
780 info->var.vsync_len - 1;
781 vTotal = info->var.yres + info->var.lower_margin +
782 info->var.vsync_len + info->var.upper_margin + 2;
783 vBlankStart = vDisplay;
784 vBlankEnd = vTotal + 1;
785 dotClock = 1000000000 / info->var.pixclock;
787 memcpy(&newmode, ®_template, sizeof(struct riva_regs));
789 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED)
792 if (par->FlatPanel) {
795 vBlankStart = vStart;
798 hBlankEnd = hTotal + 4;
801 newmode.crtc[0x0] = Set8Bits (hTotal);
802 newmode.crtc[0x1] = Set8Bits (hDisplay);
803 newmode.crtc[0x2] = Set8Bits (hBlankStart);
804 newmode.crtc[0x3] = SetBitField (hBlankEnd, 4: 0, 4:0) | SetBit (7);
805 newmode.crtc[0x4] = Set8Bits (hStart);
806 newmode.crtc[0x5] = SetBitField (hBlankEnd, 5: 5, 7:7)
807 | SetBitField (hEnd, 4: 0, 4:0);
808 newmode.crtc[0x6] = SetBitField (vTotal, 7: 0, 7:0);
809 newmode.crtc[0x7] = SetBitField (vTotal, 8: 8, 0:0)
810 | SetBitField (vDisplay, 8: 8, 1:1)
811 | SetBitField (vStart, 8: 8, 2:2)
812 | SetBitField (vBlankStart, 8: 8, 3:3)
814 | SetBitField (vTotal, 9: 9, 5:5)
815 | SetBitField (vDisplay, 9: 9, 6:6)
816 | SetBitField (vStart, 9: 9, 7:7);
817 newmode.crtc[0x9] = SetBitField (vBlankStart, 9: 9, 5:5)
819 newmode.crtc[0x10] = Set8Bits (vStart);
820 newmode.crtc[0x11] = SetBitField (vEnd, 3: 0, 3:0)
822 newmode.crtc[0x12] = Set8Bits (vDisplay);
823 newmode.crtc[0x13] = (width / 8) * ((bpp + 1) / 8);
824 newmode.crtc[0x15] = Set8Bits (vBlankStart);
825 newmode.crtc[0x16] = Set8Bits (vBlankEnd);
827 newmode.ext.screen = SetBitField(hBlankEnd,6:6,4:4)
828 | SetBitField(vBlankStart,10:10,3:3)
829 | SetBitField(vStart,10:10,2:2)
830 | SetBitField(vDisplay,10:10,1:1)
831 | SetBitField(vTotal,10:10,0:0);
832 newmode.ext.horiz = SetBitField(hTotal,8:8,0:0)
833 | SetBitField(hDisplay,8:8,1:1)
834 | SetBitField(hBlankStart,8:8,2:2)
835 | SetBitField(hStart,8:8,3:3);
836 newmode.ext.extra = SetBitField(vTotal,11:11,0:0)
837 | SetBitField(vDisplay,11:11,2:2)
838 | SetBitField(vStart,11:11,4:4)
839 | SetBitField(vBlankStart,11:11,6:6);
841 if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
842 int tmp = (hTotal >> 1) & ~1;
843 newmode.ext.interlace = Set8Bits(tmp);
844 newmode.ext.horiz |= SetBitField(tmp, 8:8,4:4);
846 newmode.ext.interlace = 0xff; /* interlace off */
848 if (par->riva.Architecture >= NV_ARCH_10)
849 par->riva.CURSOR = (U032 __iomem *)(info->screen_base + par->riva.CursorStart);
851 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
852 newmode.misc_output &= ~0x40;
854 newmode.misc_output |= 0x40;
855 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
856 newmode.misc_output &= ~0x80;
858 newmode.misc_output |= 0x80;
860 par->riva.CalcStateExt(&par->riva, &newmode.ext, bpp, width,
861 hDisplaySize, height, dotClock);
863 newmode.ext.scale = NV_RD32(par->riva.PRAMDAC, 0x00000848) &
865 if (par->FlatPanel == 1) {
866 newmode.ext.pixel |= (1 << 7);
867 newmode.ext.scale |= (1 << 8);
869 if (par->SecondCRTC) {
870 newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) &
872 newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) |
874 newmode.ext.crtcOwner = 3;
875 newmode.ext.pllsel |= 0x20000800;
876 newmode.ext.vpll2 = newmode.ext.vpll;
877 } else if (par->riva.twoHeads) {
878 newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) |
880 newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) &
882 newmode.ext.crtcOwner = 0;
883 newmode.ext.vpll2 = NV_RD32(par->riva.PRAMDAC0, 0x00000520);
885 if (par->FlatPanel == 1) {
886 newmode.ext.pixel |= (1 << 7);
887 newmode.ext.scale |= (1 << 8);
889 newmode.ext.cursorConfig = 0x02000100;
890 par->current_state = newmode;
891 riva_load_state(par, &par->current_state);
892 par->riva.LockUnlock(&par->riva, 0); /* important for HW cursor */
893 rivafb_blank(0, info);
897 static void riva_update_var(struct fb_var_screeninfo *var, struct fb_videomode *modedb)
900 var->xres = var->xres_virtual = modedb->xres;
901 var->yres = modedb->yres;
902 if (var->yres_virtual < var->yres)
903 var->yres_virtual = var->yres;
904 var->xoffset = var->yoffset = 0;
905 var->pixclock = modedb->pixclock;
906 var->left_margin = modedb->left_margin;
907 var->right_margin = modedb->right_margin;
908 var->upper_margin = modedb->upper_margin;
909 var->lower_margin = modedb->lower_margin;
910 var->hsync_len = modedb->hsync_len;
911 var->vsync_len = modedb->vsync_len;
912 var->sync = modedb->sync;
913 var->vmode = modedb->vmode;
918 * rivafb_do_maximize -
919 * @info: pointer to fb_info object containing info for current riva board
928 * -EINVAL on failure, 0 on success
934 static int rivafb_do_maximize(struct fb_info *info,
935 struct fb_var_screeninfo *var,
951 /* use highest possible virtual resolution */
952 if (var->xres_virtual == -1 && var->yres_virtual == -1) {
953 printk(KERN_WARNING PFX
954 "using maximum available virtual resolution\n");
955 for (i = 0; modes[i].xres != -1; i++) {
956 if (modes[i].xres * nom / den * modes[i].yres <
960 if (modes[i].xres == -1) {
962 "could not find a virtual resolution that fits into video memory!!\n");
963 NVTRACE("EXIT - EINVAL error\n");
966 var->xres_virtual = modes[i].xres;
967 var->yres_virtual = modes[i].yres;
970 "virtual resolution set to maximum of %dx%d\n",
971 var->xres_virtual, var->yres_virtual);
972 } else if (var->xres_virtual == -1) {
973 var->xres_virtual = (info->fix.smem_len * den /
974 (nom * var->yres_virtual)) & ~15;
975 printk(KERN_WARNING PFX
976 "setting virtual X resolution to %d\n", var->xres_virtual);
977 } else if (var->yres_virtual == -1) {
978 var->xres_virtual = (var->xres_virtual + 15) & ~15;
979 var->yres_virtual = info->fix.smem_len * den /
980 (nom * var->xres_virtual);
981 printk(KERN_WARNING PFX
982 "setting virtual Y resolution to %d\n", var->yres_virtual);
984 var->xres_virtual = (var->xres_virtual + 15) & ~15;
985 if (var->xres_virtual * nom / den * var->yres_virtual > info->fix.smem_len) {
987 "mode %dx%dx%d rejected...resolution too high to fit into video memory!\n",
988 var->xres, var->yres, var->bits_per_pixel);
989 NVTRACE("EXIT - EINVAL error\n");
994 if (var->xres_virtual * nom / den >= 8192) {
995 printk(KERN_WARNING PFX
996 "virtual X resolution (%d) is too high, lowering to %d\n",
997 var->xres_virtual, 8192 * den / nom - 16);
998 var->xres_virtual = 8192 * den / nom - 16;
1001 if (var->xres_virtual < var->xres) {
1003 "virtual X resolution (%d) is smaller than real\n", var->xres_virtual);
1007 if (var->yres_virtual < var->yres) {
1009 "virtual Y resolution (%d) is smaller than real\n", var->yres_virtual);
1012 if (var->yres_virtual > 0x7fff/nom)
1013 var->yres_virtual = 0x7fff/nom;
1014 if (var->xres_virtual > 0x7fff/nom)
1015 var->xres_virtual = 0x7fff/nom;
1021 riva_set_pattern(struct riva_par *par, int clr0, int clr1, int pat0, int pat1)
1023 RIVA_FIFO_FREE(par->riva, Patt, 4);
1024 NV_WR32(&par->riva.Patt->Color0, 0, clr0);
1025 NV_WR32(&par->riva.Patt->Color1, 0, clr1);
1026 NV_WR32(par->riva.Patt->Monochrome, 0, pat0);
1027 NV_WR32(par->riva.Patt->Monochrome, 4, pat1);
1030 /* acceleration routines */
1031 static inline void wait_for_idle(struct riva_par *par)
1033 while (par->riva.Busy(&par->riva));
1037 * Set ROP. Translate X rop into ROP3. Internal routine.
1040 riva_set_rop_solid(struct riva_par *par, int rop)
1042 riva_set_pattern(par, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
1043 RIVA_FIFO_FREE(par->riva, Rop, 1);
1044 NV_WR32(&par->riva.Rop->Rop3, 0, rop);
1048 static void riva_setup_accel(struct fb_info *info)
1050 struct riva_par *par = info->par;
1052 RIVA_FIFO_FREE(par->riva, Clip, 2);
1053 NV_WR32(&par->riva.Clip->TopLeft, 0, 0x0);
1054 NV_WR32(&par->riva.Clip->WidthHeight, 0,
1055 (info->var.xres_virtual & 0xffff) |
1056 (info->var.yres_virtual << 16));
1057 riva_set_rop_solid(par, 0xcc);
1062 * riva_get_cmap_len - query current color map length
1063 * @var: standard kernel fb changeable data
1066 * Get current color map length.
1069 * Length of color map
1072 * rivafb_setcolreg()
1074 static int riva_get_cmap_len(const struct fb_var_screeninfo *var)
1076 int rc = 256; /* reasonable default */
1078 switch (var->green.length) {
1080 rc = 256; /* 256 entries (2^8), 8 bpp and RGB8888 */
1083 rc = 32; /* 32 entries (2^5), 16 bpp, RGB555 */
1086 rc = 64; /* 64 entries (2^6), 16 bpp, RGB565 */
1089 /* should not occur */
1095 /* ------------------------------------------------------------------------- *
1097 * framebuffer operations
1099 * ------------------------------------------------------------------------- */
1101 static int rivafb_open(struct fb_info *info, int user)
1103 struct riva_par *par = info->par;
1104 int cnt = atomic_read(&par->ref_count);
1109 memset(&par->state, 0, sizeof(struct vgastate));
1110 par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS;
1111 /* save the DAC for Riva128 */
1112 if (par->riva.Architecture == NV_ARCH_03)
1113 par->state.flags |= VGA_SAVE_CMAP;
1114 save_vga(&par->state);
1116 /* vgaHWunlock() + riva unlock (0x7F) */
1117 CRTCout(par, 0x11, 0xFF);
1118 par->riva.LockUnlock(&par->riva, 0);
1120 riva_save_state(par, &par->initial_state);
1122 atomic_inc(&par->ref_count);
1127 static int rivafb_release(struct fb_info *info, int user)
1129 struct riva_par *par = info->par;
1130 int cnt = atomic_read(&par->ref_count);
1136 par->riva.LockUnlock(&par->riva, 0);
1137 par->riva.LoadStateExt(&par->riva, &par->initial_state.ext);
1138 riva_load_state(par, &par->initial_state);
1140 restore_vga(&par->state);
1142 par->riva.LockUnlock(&par->riva, 1);
1144 atomic_dec(&par->ref_count);
1149 static int rivafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
1151 struct fb_videomode *mode;
1152 struct riva_par *par = info->par;
1153 int nom, den; /* translating from pixels->bytes */
1157 switch (var->bits_per_pixel) {
1159 var->red.offset = var->green.offset = var->blue.offset = 0;
1160 var->red.length = var->green.length = var->blue.length = 8;
1161 var->bits_per_pixel = 8;
1165 var->green.length = 5;
1168 var->bits_per_pixel = 16;
1169 /* The Riva128 supports RGB555 only */
1170 if (par->riva.Architecture == NV_ARCH_03)
1171 var->green.length = 5;
1172 if (var->green.length == 5) {
1173 /* 0rrrrrgg gggbbbbb */
1174 var->red.offset = 10;
1175 var->green.offset = 5;
1176 var->blue.offset = 0;
1177 var->red.length = 5;
1178 var->green.length = 5;
1179 var->blue.length = 5;
1181 /* rrrrrggg gggbbbbb */
1182 var->red.offset = 11;
1183 var->green.offset = 5;
1184 var->blue.offset = 0;
1185 var->red.length = 5;
1186 var->green.length = 6;
1187 var->blue.length = 5;
1193 var->red.length = var->green.length = var->blue.length = 8;
1194 var->bits_per_pixel = 32;
1195 var->red.offset = 16;
1196 var->green.offset = 8;
1197 var->blue.offset = 0;
1203 "mode %dx%dx%d rejected...color depth not supported.\n",
1204 var->xres, var->yres, var->bits_per_pixel);
1205 NVTRACE("EXIT, returning -EINVAL\n");
1210 if (!info->monspecs.vfmax || !info->monspecs.hfmax ||
1211 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
1215 /* calculate modeline if supported by monitor */
1216 if (!mode_valid && info->monspecs.gtf) {
1217 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
1222 mode = fb_find_best_mode(var, &info->modelist);
1224 riva_update_var(var, mode);
1229 if (!mode_valid && info->monspecs.modedb_len)
1232 if (var->xres_virtual < var->xres)
1233 var->xres_virtual = var->xres;
1234 if (var->yres_virtual <= var->yres)
1235 var->yres_virtual = -1;
1236 if (rivafb_do_maximize(info, var, nom, den) < 0)
1239 if (var->xoffset < 0)
1241 if (var->yoffset < 0)
1244 /* truncate xoffset and yoffset to maximum if too high */
1245 if (var->xoffset > var->xres_virtual - var->xres)
1246 var->xoffset = var->xres_virtual - var->xres - 1;
1248 if (var->yoffset > var->yres_virtual - var->yres)
1249 var->yoffset = var->yres_virtual - var->yres - 1;
1251 var->red.msb_right =
1252 var->green.msb_right =
1253 var->blue.msb_right =
1254 var->transp.offset = var->transp.length = var->transp.msb_right = 0;
1259 static int rivafb_set_par(struct fb_info *info)
1261 struct riva_par *par = info->par;
1264 /* vgaHWunlock() + riva unlock (0x7F) */
1265 CRTCout(par, 0x11, 0xFF);
1266 par->riva.LockUnlock(&par->riva, 0);
1267 riva_load_video_mode(info);
1268 if(!(info->flags & FBINFO_HWACCEL_DISABLED))
1269 riva_setup_accel(info);
1271 par->cursor_reset = 1;
1272 info->fix.line_length = (info->var.xres_virtual * (info->var.bits_per_pixel >> 3));
1273 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1274 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1276 if (info->flags & FBINFO_HWACCEL_DISABLED)
1277 info->pixmap.scan_align = 1;
1279 info->pixmap.scan_align = 4;
1285 * rivafb_pan_display
1286 * @var: standard kernel fb changeable data
1288 * @info: pointer to fb_info object containing info for current riva board
1291 * Pan (or wrap, depending on the `vmode' field) the display using the
1292 * `xoffset' and `yoffset' fields of the `var' structure.
1293 * If the values don't fit, return -EINVAL.
1295 * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
1297 static int rivafb_pan_display(struct fb_var_screeninfo *var,
1298 struct fb_info *info)
1300 struct riva_par *par = info->par;
1304 base = var->yoffset * info->fix.line_length + var->xoffset;
1305 par->riva.SetStartAddress(&par->riva, base);
1310 static int rivafb_blank(int blank, struct fb_info *info)
1312 struct riva_par *par= info->par;
1313 unsigned char tmp, vesa;
1315 tmp = SEQin(par, 0x01) & ~0x20; /* screen on/off */
1316 vesa = CRTCin(par, 0x1a) & ~0xc0; /* sync on/off */
1324 case FB_BLANK_UNBLANK:
1325 case FB_BLANK_NORMAL:
1327 case FB_BLANK_VSYNC_SUSPEND:
1330 case FB_BLANK_HSYNC_SUSPEND:
1333 case FB_BLANK_POWERDOWN:
1338 SEQout(par, 0x01, tmp);
1339 CRTCout(par, 0x1a, vesa);
1341 #ifdef CONFIG_FB_RIVA_BACKLIGHT
1342 mutex_lock(&info->bl_mutex);
1344 down(&info->bl_dev->sem);
1345 info->bl_dev->props->power = blank;
1346 info->bl_dev->props->update_status(info->bl_dev);
1347 up(&info->bl_dev->sem);
1349 mutex_unlock(&info->bl_mutex);
1359 * @regno: register index
1360 * @red: red component
1361 * @green: green component
1362 * @blue: blue component
1363 * @transp: transparency
1364 * @info: pointer to fb_info object containing info for current riva board
1367 * Set a single color register. The values supplied have a 16 bit
1371 * Return != 0 for invalid regno.
1374 * fbcmap.c:fb_set_cmap()
1376 static int rivafb_setcolreg(unsigned regno, unsigned red, unsigned green,
1377 unsigned blue, unsigned transp,
1378 struct fb_info *info)
1380 struct riva_par *par = info->par;
1381 RIVA_HW_INST *chip = &par->riva;
1384 if (regno >= riva_get_cmap_len(&info->var))
1387 if (info->var.grayscale) {
1388 /* gray = 0.30*R + 0.59*G + 0.11*B */
1389 red = green = blue =
1390 (red * 77 + green * 151 + blue * 28) >> 8;
1393 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
1394 ((u32 *) info->pseudo_palette)[regno] =
1395 (regno << info->var.red.offset) |
1396 (regno << info->var.green.offset) |
1397 (regno << info->var.blue.offset);
1399 * The Riva128 2D engine requires color information in
1400 * TrueColor format even if framebuffer is in DirectColor
1402 if (par->riva.Architecture == NV_ARCH_03) {
1403 switch (info->var.bits_per_pixel) {
1405 par->palette[regno] = ((red & 0xf800) >> 1) |
1406 ((green & 0xf800) >> 6) |
1407 ((blue & 0xf800) >> 11);
1410 par->palette[regno] = ((red & 0xff00) << 8) |
1411 ((green & 0xff00)) |
1412 ((blue & 0xff00) >> 8);
1418 switch (info->var.bits_per_pixel) {
1420 /* "transparent" stuff is completely ignored. */
1421 riva_wclut(chip, regno, red >> 8, green >> 8, blue >> 8);
1424 if (info->var.green.length == 5) {
1425 for (i = 0; i < 8; i++) {
1426 riva_wclut(chip, regno*8+i, red >> 8,
1427 green >> 8, blue >> 8);
1433 for (i = 0; i < 8; i++) {
1434 riva_wclut(chip, regno*8+i,
1435 red >> 8, green >> 8,
1439 riva_rclut(chip, regno*4, &r, &g, &b);
1440 for (i = 0; i < 4; i++)
1441 riva_wclut(chip, regno*4+i, r,
1446 riva_wclut(chip, regno, red >> 8, green >> 8, blue >> 8);
1456 * rivafb_fillrect - hardware accelerated color fill function
1457 * @info: pointer to fb_info structure
1458 * @rect: pointer to fb_fillrect structure
1461 * This function fills up a region of framebuffer memory with a solid
1462 * color with a choice of two different ROP's, copy or invert.
1467 static void rivafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
1469 struct riva_par *par = info->par;
1470 u_int color, rop = 0;
1472 if ((info->flags & FBINFO_HWACCEL_DISABLED)) {
1473 cfb_fillrect(info, rect);
1477 if (info->var.bits_per_pixel == 8)
1478 color = rect->color;
1480 if (par->riva.Architecture != NV_ARCH_03)
1481 color = ((u32 *)info->pseudo_palette)[rect->color];
1483 color = par->palette[rect->color];
1486 switch (rect->rop) {
1496 riva_set_rop_solid(par, rop);
1498 RIVA_FIFO_FREE(par->riva, Bitmap, 1);
1499 NV_WR32(&par->riva.Bitmap->Color1A, 0, color);
1501 RIVA_FIFO_FREE(par->riva, Bitmap, 2);
1502 NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].TopLeft, 0,
1503 (rect->dx << 16) | rect->dy);
1505 NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].WidthHeight, 0,
1506 (rect->width << 16) | rect->height);
1508 riva_set_rop_solid(par, 0xcc);
1513 * rivafb_copyarea - hardware accelerated blit function
1514 * @info: pointer to fb_info structure
1515 * @region: pointer to fb_copyarea structure
1518 * This copies an area of pixels from one location to another
1523 static void rivafb_copyarea(struct fb_info *info, const struct fb_copyarea *region)
1525 struct riva_par *par = info->par;
1527 if ((info->flags & FBINFO_HWACCEL_DISABLED)) {
1528 cfb_copyarea(info, region);
1532 RIVA_FIFO_FREE(par->riva, Blt, 3);
1533 NV_WR32(&par->riva.Blt->TopLeftSrc, 0,
1534 (region->sy << 16) | region->sx);
1535 NV_WR32(&par->riva.Blt->TopLeftDst, 0,
1536 (region->dy << 16) | region->dx);
1538 NV_WR32(&par->riva.Blt->WidthHeight, 0,
1539 (region->height << 16) | region->width);
1543 static inline void convert_bgcolor_16(u32 *col)
1545 *col = ((*col & 0x0000F800) << 8)
1546 | ((*col & 0x00007E0) << 5)
1547 | ((*col & 0x0000001F) << 3)
1553 * rivafb_imageblit: hardware accelerated color expand function
1554 * @info: pointer to fb_info structure
1555 * @image: pointer to fb_image structure
1558 * If the source is a monochrome bitmap, the function fills up a a region
1559 * of framebuffer memory with pixels whose color is determined by the bit
1560 * setting of the bitmap, 1 - foreground, 0 - background.
1562 * If the source is not a monochrome bitmap, color expansion is not done.
1563 * In this case, it is channeled to a software function.
1568 static void rivafb_imageblit(struct fb_info *info,
1569 const struct fb_image *image)
1571 struct riva_par *par = info->par;
1572 u32 fgx = 0, bgx = 0, width, tmp;
1573 u8 *cdat = (u8 *) image->data;
1574 volatile u32 __iomem *d;
1577 if ((info->flags & FBINFO_HWACCEL_DISABLED) || image->depth != 1) {
1578 cfb_imageblit(info, image);
1582 switch (info->var.bits_per_pixel) {
1584 fgx = image->fg_color;
1585 bgx = image->bg_color;
1589 if (par->riva.Architecture != NV_ARCH_03) {
1590 fgx = ((u32 *)info->pseudo_palette)[image->fg_color];
1591 bgx = ((u32 *)info->pseudo_palette)[image->bg_color];
1593 fgx = par->palette[image->fg_color];
1594 bgx = par->palette[image->bg_color];
1596 if (info->var.green.length == 6)
1597 convert_bgcolor_16(&bgx);
1601 RIVA_FIFO_FREE(par->riva, Bitmap, 7);
1602 NV_WR32(&par->riva.Bitmap->ClipE.TopLeft, 0,
1603 (image->dy << 16) | (image->dx & 0xFFFF));
1604 NV_WR32(&par->riva.Bitmap->ClipE.BottomRight, 0,
1605 (((image->dy + image->height) << 16) |
1606 ((image->dx + image->width) & 0xffff)));
1607 NV_WR32(&par->riva.Bitmap->Color0E, 0, bgx);
1608 NV_WR32(&par->riva.Bitmap->Color1E, 0, fgx);
1609 NV_WR32(&par->riva.Bitmap->WidthHeightInE, 0,
1610 (image->height << 16) | ((image->width + 31) & ~31));
1611 NV_WR32(&par->riva.Bitmap->WidthHeightOutE, 0,
1612 (image->height << 16) | ((image->width + 31) & ~31));
1613 NV_WR32(&par->riva.Bitmap->PointE, 0,
1614 (image->dy << 16) | (image->dx & 0xFFFF));
1616 d = &par->riva.Bitmap->MonochromeData01E;
1618 width = (image->width + 31)/32;
1619 size = width * image->height;
1620 while (size >= 16) {
1621 RIVA_FIFO_FREE(par->riva, Bitmap, 16);
1622 for (i = 0; i < 16; i++) {
1623 tmp = *((u32 *)cdat);
1624 cdat = (u8 *)((u32 *)cdat + 1);
1625 reverse_order(&tmp);
1626 NV_WR32(d, i*4, tmp);
1631 RIVA_FIFO_FREE(par->riva, Bitmap, size);
1632 for (i = 0; i < size; i++) {
1633 tmp = *((u32 *) cdat);
1634 cdat = (u8 *)((u32 *)cdat + 1);
1635 reverse_order(&tmp);
1636 NV_WR32(d, i*4, tmp);
1642 * rivafb_cursor - hardware cursor function
1643 * @info: pointer to info structure
1644 * @cursor: pointer to fbcursor structure
1647 * A cursor function that supports displaying a cursor image via hardware.
1648 * Within the kernel, copy and invert rops are supported. If exported
1649 * to user space, only the copy rop will be supported.
1654 static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
1656 struct riva_par *par = info->par;
1657 u8 data[MAX_CURS * MAX_CURS/8];
1658 int i, set = cursor->set;
1661 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
1664 par->riva.ShowHideCursor(&par->riva, 0);
1666 if (par->cursor_reset) {
1667 set = FB_CUR_SETALL;
1668 par->cursor_reset = 0;
1671 if (set & FB_CUR_SETSIZE)
1672 memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2);
1674 if (set & FB_CUR_SETPOS) {
1677 yy = cursor->image.dy - info->var.yoffset;
1678 xx = cursor->image.dx - info->var.xoffset;
1682 NV_WR32(par->riva.PRAMDAC, 0x0000300, temp);
1686 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
1687 u32 bg_idx = cursor->image.bg_color;
1688 u32 fg_idx = cursor->image.fg_color;
1689 u32 s_pitch = (cursor->image.width+7) >> 3;
1690 u32 d_pitch = MAX_CURS/8;
1691 u8 *dat = (u8 *) cursor->image.data;
1692 u8 *msk = (u8 *) cursor->mask;
1695 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
1698 switch (cursor->rop) {
1700 for (i = 0; i < s_pitch * cursor->image.height; i++)
1701 src[i] = dat[i] ^ msk[i];
1705 for (i = 0; i < s_pitch * cursor->image.height; i++)
1706 src[i] = dat[i] & msk[i];
1710 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
1711 cursor->image.height);
1713 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
1714 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
1715 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) |
1718 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
1719 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
1720 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) |
1723 par->riva.LockUnlock(&par->riva, 0);
1725 rivafb_load_cursor_image(par, data, bg, fg,
1726 cursor->image.width,
1727 cursor->image.height);
1733 par->riva.ShowHideCursor(&par->riva, 1);
1738 static int rivafb_sync(struct fb_info *info)
1740 struct riva_par *par = info->par;
1746 /* ------------------------------------------------------------------------- *
1748 * initialization helper functions
1750 * ------------------------------------------------------------------------- */
1752 /* kernel interface */
1753 static struct fb_ops riva_fb_ops = {
1754 .owner = THIS_MODULE,
1755 .fb_open = rivafb_open,
1756 .fb_release = rivafb_release,
1757 .fb_check_var = rivafb_check_var,
1758 .fb_set_par = rivafb_set_par,
1759 .fb_setcolreg = rivafb_setcolreg,
1760 .fb_pan_display = rivafb_pan_display,
1761 .fb_blank = rivafb_blank,
1762 .fb_fillrect = rivafb_fillrect,
1763 .fb_copyarea = rivafb_copyarea,
1764 .fb_imageblit = rivafb_imageblit,
1765 .fb_cursor = rivafb_cursor,
1766 .fb_sync = rivafb_sync,
1769 static int __devinit riva_set_fbinfo(struct fb_info *info)
1771 unsigned int cmap_len;
1772 struct riva_par *par = info->par;
1775 info->flags = FBINFO_DEFAULT
1776 | FBINFO_HWACCEL_XPAN
1777 | FBINFO_HWACCEL_YPAN
1778 | FBINFO_HWACCEL_COPYAREA
1779 | FBINFO_HWACCEL_FILLRECT
1780 | FBINFO_HWACCEL_IMAGEBLIT;
1782 /* Accel seems to not work properly on NV30 yet...*/
1783 if ((par->riva.Architecture == NV_ARCH_30) || noaccel) {
1784 printk(KERN_DEBUG PFX "disabling acceleration\n");
1785 info->flags |= FBINFO_HWACCEL_DISABLED;
1788 info->var = rivafb_default_var;
1789 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1790 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1792 info->pseudo_palette = par->pseudo_palette;
1794 cmap_len = riva_get_cmap_len(&info->var);
1795 fb_alloc_cmap(&info->cmap, cmap_len, 0);
1797 info->pixmap.size = 8 * 1024;
1798 info->pixmap.buf_align = 4;
1799 info->pixmap.access_align = 32;
1800 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1801 info->var.yres_virtual = -1;
1803 return (rivafb_check_var(&info->var, info));
1806 #ifdef CONFIG_PPC_OF
1807 static int __devinit riva_get_EDID_OF(struct fb_info *info, struct pci_dev *pd)
1809 struct riva_par *par = info->par;
1810 struct device_node *dp;
1811 unsigned char *pedid = NULL;
1812 unsigned char *disptype = NULL;
1813 static char *propnames[] = {
1814 "DFP,EDID", "LCD,EDID", "EDID", "EDID1", "EDID,B", "EDID,A", NULL };
1818 dp = pci_device_to_OF_node(pd);
1819 for (; dp != NULL; dp = dp->child) {
1820 disptype = (unsigned char *)get_property(dp, "display-type", NULL);
1821 if (disptype == NULL)
1823 if (strncmp(disptype, "LCD", 3) != 0)
1825 for (i = 0; propnames[i] != NULL; ++i) {
1826 pedid = (unsigned char *)
1827 get_property(dp, propnames[i], NULL);
1828 if (pedid != NULL) {
1830 NVTRACE("LCD found.\n");
1838 #endif /* CONFIG_PPC_OF */
1840 #if defined(CONFIG_FB_RIVA_I2C) && !defined(CONFIG_PPC_OF)
1841 static int __devinit riva_get_EDID_i2c(struct fb_info *info)
1843 struct riva_par *par = info->par;
1844 struct fb_var_screeninfo var;
1848 riva_create_i2c_busses(par);
1849 for (i = 0; i < par->bus; i++) {
1850 riva_probe_i2c_connector(par, i+1, &par->EDID);
1851 if (par->EDID && !fb_parse_edid(par->EDID, &var)) {
1852 printk(PFX "Found EDID Block from BUS %i\n", i);
1858 return (par->EDID) ? 1 : 0;
1860 #endif /* CONFIG_FB_RIVA_I2C */
1862 static void __devinit riva_update_default_var(struct fb_var_screeninfo *var,
1863 struct fb_info *info)
1865 struct fb_monspecs *specs = &info->monspecs;
1866 struct fb_videomode modedb;
1869 /* respect mode options */
1871 fb_find_mode(var, info, mode_option,
1872 specs->modedb, specs->modedb_len,
1874 } else if (specs->modedb != NULL) {
1875 /* get preferred timing */
1876 if (info->monspecs.misc & FB_MISC_1ST_DETAIL) {
1879 for (i = 0; i < specs->modedb_len; i++) {
1880 if (specs->modedb[i].flag & FB_MODE_IS_FIRST) {
1881 modedb = specs->modedb[i];
1886 /* otherwise, get first mode in database */
1887 modedb = specs->modedb[0];
1889 var->bits_per_pixel = 8;
1890 riva_update_var(var, &modedb);
1896 static void __devinit riva_get_EDID(struct fb_info *info, struct pci_dev *pdev)
1899 #ifdef CONFIG_PPC_OF
1900 if (!riva_get_EDID_OF(info, pdev))
1901 printk(PFX "could not retrieve EDID from OF\n");
1902 #elif defined(CONFIG_FB_RIVA_I2C)
1903 if (!riva_get_EDID_i2c(info))
1904 printk(PFX "could not retrieve EDID from DDC/I2C\n");
1910 static void __devinit riva_get_edidinfo(struct fb_info *info)
1912 struct fb_var_screeninfo *var = &rivafb_default_var;
1913 struct riva_par *par = info->par;
1915 fb_edid_to_monspecs(par->EDID, &info->monspecs);
1916 fb_videomode_to_modelist(info->monspecs.modedb, info->monspecs.modedb_len,
1918 riva_update_default_var(var, info);
1920 /* if user specified flatpanel, we respect that */
1921 if (info->monspecs.input & FB_DISP_DDI)
1925 /* ------------------------------------------------------------------------- *
1929 * ------------------------------------------------------------------------- */
1931 static u32 __devinit riva_get_arch(struct pci_dev *pd)
1935 switch (pd->device & 0x0ff0) {
1936 case 0x0100: /* GeForce 256 */
1937 case 0x0110: /* GeForce2 MX */
1938 case 0x0150: /* GeForce2 */
1939 case 0x0170: /* GeForce4 MX */
1940 case 0x0180: /* GeForce4 MX (8x AGP) */
1941 case 0x01A0: /* nForce */
1942 case 0x01F0: /* nForce2 */
1945 case 0x0200: /* GeForce3 */
1946 case 0x0250: /* GeForce4 Ti */
1947 case 0x0280: /* GeForce4 Ti (8x AGP) */
1950 case 0x0300: /* GeForceFX 5800 */
1951 case 0x0310: /* GeForceFX 5600 */
1952 case 0x0320: /* GeForceFX 5200 */
1953 case 0x0330: /* GeForceFX 5900 */
1954 case 0x0340: /* GeForceFX 5700 */
1957 case 0x0020: /* TNT, TNT2 */
1960 case 0x0010: /* Riva128 */
1963 default: /* unknown architecture */
1969 static int __devinit rivafb_probe(struct pci_dev *pd,
1970 const struct pci_device_id *ent)
1972 struct riva_par *default_par;
1973 struct fb_info *info;
1979 info = framebuffer_alloc(sizeof(struct riva_par), &pd->dev);
1981 printk (KERN_ERR PFX "could not allocate memory\n");
1985 default_par = info->par;
1986 default_par->pdev = pd;
1988 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1989 if (info->pixmap.addr == NULL) {
1991 goto err_framebuffer_release;
1993 memset(info->pixmap.addr, 0, 8 * 1024);
1995 ret = pci_enable_device(pd);
1997 printk(KERN_ERR PFX "cannot enable PCI device\n");
1998 goto err_free_pixmap;
2001 ret = pci_request_regions(pd, "rivafb");
2003 printk(KERN_ERR PFX "cannot request PCI regions\n");
2004 goto err_disable_device;
2007 default_par->riva.Architecture = riva_get_arch(pd);
2009 default_par->Chipset = (pd->vendor << 16) | pd->device;
2010 printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset);
2012 if(default_par->riva.Architecture == 0) {
2013 printk(KERN_ERR PFX "unknown NV_ARCH\n");
2015 goto err_release_region;
2017 if(default_par->riva.Architecture == NV_ARCH_10 ||
2018 default_par->riva.Architecture == NV_ARCH_20 ||
2019 default_par->riva.Architecture == NV_ARCH_30) {
2020 sprintf(rivafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
2022 sprintf(rivafb_fix.id, "NV%x", default_par->riva.Architecture);
2025 default_par->FlatPanel = flatpanel;
2027 printk(KERN_INFO PFX "flatpanel support enabled\n");
2028 default_par->forceCRTC = forceCRTC;
2030 rivafb_fix.mmio_len = pci_resource_len(pd, 0);
2031 rivafb_fix.smem_len = pci_resource_len(pd, 1);
2034 /* enable IO and mem if not already done */
2037 pci_read_config_word(pd, PCI_COMMAND, &cmd);
2038 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
2039 pci_write_config_word(pd, PCI_COMMAND, cmd);
2042 rivafb_fix.mmio_start = pci_resource_start(pd, 0);
2043 rivafb_fix.smem_start = pci_resource_start(pd, 1);
2045 default_par->ctrl_base = ioremap(rivafb_fix.mmio_start,
2046 rivafb_fix.mmio_len);
2047 if (!default_par->ctrl_base) {
2048 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
2050 goto err_release_region;
2053 switch (default_par->riva.Architecture) {
2055 /* Riva128's PRAMIN is in the "framebuffer" space
2056 * Since these cards were never made with more than 8 megabytes
2057 * we can safely allocate this separately.
2059 default_par->riva.PRAMIN = ioremap(rivafb_fix.smem_start + 0x00C00000, 0x00008000);
2060 if (!default_par->riva.PRAMIN) {
2061 printk(KERN_ERR PFX "cannot ioremap PRAMIN region\n");
2063 goto err_iounmap_ctrl_base;
2070 default_par->riva.PCRTC0 =
2071 (u32 __iomem *)(default_par->ctrl_base + 0x00600000);
2072 default_par->riva.PRAMIN =
2073 (u32 __iomem *)(default_par->ctrl_base + 0x00710000);
2076 riva_common_setup(default_par);
2078 if (default_par->riva.Architecture == NV_ARCH_03) {
2079 default_par->riva.PCRTC = default_par->riva.PCRTC0
2080 = default_par->riva.PGRAPH;
2083 rivafb_fix.smem_len = riva_get_memlen(default_par) * 1024;
2084 default_par->dclk_max = riva_get_maxdclk(default_par) * 1000;
2085 info->screen_base = ioremap(rivafb_fix.smem_start,
2086 rivafb_fix.smem_len);
2087 if (!info->screen_base) {
2088 printk(KERN_ERR PFX "cannot ioremap FB base\n");
2090 goto err_iounmap_pramin;
2095 default_par->mtrr.vram = mtrr_add(rivafb_fix.smem_start,
2096 rivafb_fix.smem_len,
2097 MTRR_TYPE_WRCOMB, 1);
2098 if (default_par->mtrr.vram < 0) {
2099 printk(KERN_ERR PFX "unable to setup MTRR\n");
2101 default_par->mtrr.vram_valid = 1;
2102 /* let there be speed */
2103 printk(KERN_INFO PFX "RIVA MTRR set to ON\n");
2106 #endif /* CONFIG_MTRR */
2108 info->fbops = &riva_fb_ops;
2109 info->fix = rivafb_fix;
2110 riva_get_EDID(info, pd);
2111 riva_get_edidinfo(info);
2113 ret=riva_set_fbinfo(info);
2115 printk(KERN_ERR PFX "error setting initial video mode\n");
2116 goto err_iounmap_screen_base;
2119 fb_destroy_modedb(info->monspecs.modedb);
2120 info->monspecs.modedb = NULL;
2121 ret = register_framebuffer(info);
2124 "error registering riva framebuffer\n");
2125 goto err_iounmap_screen_base;
2128 pci_set_drvdata(pd, info);
2130 printk(KERN_INFO PFX
2131 "PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n",
2134 info->fix.smem_len / (1024 * 1024),
2135 info->fix.smem_start);
2137 riva_bl_init(info->par);
2142 err_iounmap_screen_base:
2143 #ifdef CONFIG_FB_RIVA_I2C
2144 riva_delete_i2c_busses(info->par);
2146 iounmap(info->screen_base);
2148 if (default_par->riva.Architecture == NV_ARCH_03)
2149 iounmap(default_par->riva.PRAMIN);
2150 err_iounmap_ctrl_base:
2151 iounmap(default_par->ctrl_base);
2153 pci_release_regions(pd);
2156 kfree(info->pixmap.addr);
2157 err_framebuffer_release:
2158 framebuffer_release(info);
2163 static void __exit rivafb_remove(struct pci_dev *pd)
2165 struct fb_info *info = pci_get_drvdata(pd);
2166 struct riva_par *par = info->par;
2172 #ifdef CONFIG_FB_RIVA_I2C
2173 riva_delete_i2c_busses(par);
2177 unregister_framebuffer(info);
2179 if (par->mtrr.vram_valid)
2180 mtrr_del(par->mtrr.vram, info->fix.smem_start,
2181 info->fix.smem_len);
2182 #endif /* CONFIG_MTRR */
2184 iounmap(par->ctrl_base);
2185 iounmap(info->screen_base);
2186 if (par->riva.Architecture == NV_ARCH_03)
2187 iounmap(par->riva.PRAMIN);
2188 pci_release_regions(pd);
2189 kfree(info->pixmap.addr);
2190 framebuffer_release(info);
2191 pci_set_drvdata(pd, NULL);
2195 /* ------------------------------------------------------------------------- *
2199 * ------------------------------------------------------------------------- */
2202 static int __init rivafb_setup(char *options)
2207 if (!options || !*options)
2210 while ((this_opt = strsep(&options, ",")) != NULL) {
2211 if (!strncmp(this_opt, "forceCRTC", 9)) {
2215 if (!*p || !*(++p)) continue;
2216 forceCRTC = *p - '0';
2217 if (forceCRTC < 0 || forceCRTC > 1)
2219 } else if (!strncmp(this_opt, "flatpanel", 9)) {
2222 } else if (!strncmp(this_opt, "nomtrr", 6)) {
2225 } else if (!strncmp(this_opt, "strictmode", 10)) {
2227 } else if (!strncmp(this_opt, "noaccel", 7)) {
2230 mode_option = this_opt;
2235 #endif /* !MODULE */
2237 static struct pci_driver rivafb_driver = {
2239 .id_table = rivafb_pci_tbl,
2240 .probe = rivafb_probe,
2241 .remove = __exit_p(rivafb_remove),
2246 /* ------------------------------------------------------------------------- *
2250 * ------------------------------------------------------------------------- */
2252 static int __devinit rivafb_init(void)
2255 char *option = NULL;
2257 if (fb_get_options("rivafb", &option))
2259 rivafb_setup(option);
2261 return pci_register_driver(&rivafb_driver);
2265 module_init(rivafb_init);
2268 static void __exit rivafb_exit(void)
2270 pci_unregister_driver(&rivafb_driver);
2273 module_exit(rivafb_exit);
2276 module_param(noaccel, bool, 0);
2277 MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
2278 module_param(flatpanel, int, 0);
2279 MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. (0 or 1=enabled) (default=0)");
2280 module_param(forceCRTC, int, 0);
2281 MODULE_PARM_DESC(forceCRTC, "Forces usage of a particular CRTC in case autodetection fails. (0 or 1) (default=autodetect)");
2283 module_param(nomtrr, bool, 0);
2284 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) (default=0)");
2286 module_param(strictmode, bool, 0);
2287 MODULE_PARM_DESC(strictmode, "Only use video modes from EDID");
2289 MODULE_AUTHOR("Ani Joshi, maintainer");
2290 MODULE_DESCRIPTION("Framebuffer driver for nVidia Riva 128, TNT, TNT2, and the GeForce series");
2291 MODULE_LICENSE("GPL");