2 * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver
4 * Copyright 2004 Antonino Daplas <adaplas@pol.net>
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
18 #include <linux/tty.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/pci.h>
24 #include <linux/console.h>
25 #include <linux/backlight.h>
31 #include <asm/pci-bridge.h>
39 #ifndef CONFIG_PCI /* sanity check */
40 #error This driver requires PCI support.
43 #undef CONFIG_FB_NVIDIA_DEBUG
44 #ifdef CONFIG_FB_NVIDIA_DEBUG
45 #define NVTRACE printk
47 #define NVTRACE if (0) printk
50 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
51 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
53 #ifdef CONFIG_FB_NVIDIA_DEBUG
54 #define assert(expr) \
56 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
57 #expr,__FILE__,__FUNCTION__,__LINE__); \
64 #define PFX "nvidiafb: "
66 /* HW cursor parameters */
69 static struct pci_device_id nvidiafb_pci_tbl[] = {
70 {PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
71 PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0},
74 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
76 /* command line data, set in nvidiafb_setup() */
77 static int flatpanel __devinitdata = -1; /* Autodetect later */
78 static int fpdither __devinitdata = -1;
79 static int forceCRTC __devinitdata = -1;
80 static int hwcur __devinitdata = 0;
81 static int noaccel __devinitdata = 0;
82 static int noscale __devinitdata = 0;
83 static int paneltweak __devinitdata = 0;
84 static int vram __devinitdata = 0;
85 static int bpp __devinitdata = 8;
87 static int nomtrr __devinitdata = 0;
90 static char *mode_option __devinitdata = NULL;
92 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
93 .type = FB_TYPE_PACKED_PIXELS,
98 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
108 .activate = FB_ACTIVATE_NOW,
118 .vmode = FB_VMODE_NONINTERLACED
121 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
122 u16 bg, u16 fg, u32 w, u32 h)
124 u32 *data = (u32 *) data8;
130 for (i = 0; i < h; i++) {
134 for (j = 0; j < w / 2; j++) {
136 #if defined (__BIG_ENDIAN)
137 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
139 tmp |= (b & (1 << 31)) ? fg : bg;
142 tmp = (b & 1) ? fg : bg;
144 tmp |= (b & 1) ? fg << 16 : bg << 16;
147 NV_WR32(&par->CURSOR[k++], 0, tmp);
149 k += (MAX_CURS - w) / 2;
153 static void nvidia_write_clut(struct nvidia_par *par,
154 u8 regnum, u8 red, u8 green, u8 blue)
156 NVWriteDacMask(par, 0xff);
157 NVWriteDacWriteAddr(par, regnum);
158 NVWriteDacData(par, red);
159 NVWriteDacData(par, green);
160 NVWriteDacData(par, blue);
163 static void nvidia_read_clut(struct nvidia_par *par,
164 u8 regnum, u8 * red, u8 * green, u8 * blue)
166 NVWriteDacMask(par, 0xff);
167 NVWriteDacReadAddr(par, regnum);
168 *red = NVReadDacData(par);
169 *green = NVReadDacData(par);
170 *blue = NVReadDacData(par);
173 static int nvidia_panel_tweak(struct nvidia_par *par,
174 struct _riva_hw_state *state)
178 if (par->paneltweak) {
179 tweak = par->paneltweak;
181 /* begin flat panel hacks */
182 /* This is unfortunate, but some chips need this register
183 tweaked or else you get artifacts where adjacent pixels are
184 swapped. There are no hard rules for what to set here so all
185 we can do is experiment and apply hacks. */
187 if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
188 /* At least one NV34 laptop needs this workaround. */
192 if((par->Chipset & 0xfff0) == 0x0310) {
195 /* end flat panel hacks */
201 static void nvidia_vga_protect(struct nvidia_par *par, int on)
207 * Turn off screen and disable sequencer.
209 tmp = NVReadSeq(par, 0x01);
211 NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */
212 NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */
215 * Reenable sequencer, then turn on screen.
218 tmp = NVReadSeq(par, 0x01);
220 NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */
221 NVWriteSeq(par, 0x00, 0x03); /* End Reset */
225 static void nvidia_save_vga(struct nvidia_par *par,
226 struct _riva_hw_state *state)
231 NVLockUnlock(par, 0);
233 NVUnloadStateExt(par, state);
235 state->misc_output = NVReadMiscOut(par);
237 for (i = 0; i < NUM_CRT_REGS; i++)
238 state->crtc[i] = NVReadCrtc(par, i);
240 for (i = 0; i < NUM_ATC_REGS; i++)
241 state->attr[i] = NVReadAttr(par, i);
243 for (i = 0; i < NUM_GRC_REGS; i++)
244 state->gra[i] = NVReadGr(par, i);
246 for (i = 0; i < NUM_SEQ_REGS; i++)
247 state->seq[i] = NVReadSeq(par, i);
253 static void nvidia_write_regs(struct nvidia_par *par,
254 struct _riva_hw_state *state)
260 NVLoadStateExt(par, state);
262 NVWriteMiscOut(par, state->misc_output);
264 for (i = 1; i < NUM_SEQ_REGS; i++) {
266 printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
268 NVWriteSeq(par, i, state->seq[i]);
271 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
272 NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
274 for (i = 0; i < NUM_CRT_REGS; i++) {
281 printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
283 NVWriteCrtc(par, i, state->crtc[i]);
287 for (i = 0; i < NUM_GRC_REGS; i++) {
289 printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
291 NVWriteGr(par, i, state->gra[i]);
294 for (i = 0; i < NUM_ATC_REGS; i++) {
296 printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
298 NVWriteAttr(par, i, state->attr[i]);
304 static int nvidia_calc_regs(struct fb_info *info)
306 struct nvidia_par *par = info->par;
307 struct _riva_hw_state *state = &par->ModeReg;
308 int i, depth = fb_get_color_depth(&info->var, &info->fix);
309 int h_display = info->var.xres / 8 - 1;
310 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
311 int h_end = (info->var.xres + info->var.right_margin +
312 info->var.hsync_len) / 8 - 1;
313 int h_total = (info->var.xres + info->var.right_margin +
314 info->var.hsync_len + info->var.left_margin) / 8 - 5;
315 int h_blank_s = h_display;
316 int h_blank_e = h_total + 4;
317 int v_display = info->var.yres - 1;
318 int v_start = info->var.yres + info->var.lower_margin - 1;
319 int v_end = (info->var.yres + info->var.lower_margin +
320 info->var.vsync_len) - 1;
321 int v_total = (info->var.yres + info->var.lower_margin +
322 info->var.vsync_len + info->var.upper_margin) - 2;
323 int v_blank_s = v_display;
324 int v_blank_e = v_total + 1;
327 * Set all CRTC values.
330 if (info->var.vmode & FB_VMODE_INTERLACED)
333 if (par->FlatPanel == 1) {
334 v_start = v_total - 3;
337 h_start = h_total - 5;
339 h_blank_e = h_total + 4;
342 state->crtc[0x0] = Set8Bits(h_total);
343 state->crtc[0x1] = Set8Bits(h_display);
344 state->crtc[0x2] = Set8Bits(h_blank_s);
345 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
347 state->crtc[0x4] = Set8Bits(h_start);
348 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
349 | SetBitField(h_end, 4: 0, 4:0);
350 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
351 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
352 | SetBitField(v_display, 8: 8, 1:1)
353 | SetBitField(v_start, 8: 8, 2:2)
354 | SetBitField(v_blank_s, 8: 8, 3:3)
356 | SetBitField(v_total, 9: 9, 5:5)
357 | SetBitField(v_display, 9: 9, 6:6)
358 | SetBitField(v_start, 9: 9, 7:7);
359 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
361 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
362 state->crtc[0x10] = Set8Bits(v_start);
363 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
364 state->crtc[0x12] = Set8Bits(v_display);
365 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
366 (info->var.bits_per_pixel / 8));
367 state->crtc[0x15] = Set8Bits(v_blank_s);
368 state->crtc[0x16] = Set8Bits(v_blank_e);
370 state->attr[0x10] = 0x01;
373 state->attr[0x11] = 0x00;
375 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
376 | SetBitField(v_blank_s, 10: 10, 3:3)
377 | SetBitField(v_start, 10: 10, 2:2)
378 | SetBitField(v_display, 10: 10, 1:1)
379 | SetBitField(v_total, 10: 10, 0:0);
381 state->horiz = SetBitField(h_total, 8: 8, 0:0)
382 | SetBitField(h_display, 8: 8, 1:1)
383 | SetBitField(h_blank_s, 8: 8, 2:2)
384 | SetBitField(h_start, 8: 8, 3:3);
386 state->extra = SetBitField(v_total, 11: 11, 0:0)
387 | SetBitField(v_display, 11: 11, 2:2)
388 | SetBitField(v_start, 11: 11, 4:4)
389 | SetBitField(v_blank_s, 11: 11, 6:6);
391 if (info->var.vmode & FB_VMODE_INTERLACED) {
392 h_total = (h_total >> 1) & ~1;
393 state->interlace = Set8Bits(h_total);
394 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
396 state->interlace = 0xff; /* interlace off */
400 * Calculate the extended registers.
408 if (par->Architecture >= NV_ARCH_10)
409 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
412 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
413 state->misc_output &= ~0x40;
415 state->misc_output |= 0x40;
416 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
417 state->misc_output &= ~0x80;
419 state->misc_output |= 0x80;
421 NVCalcStateExt(par, state, i, info->var.xres_virtual,
422 info->var.xres, info->var.yres_virtual,
423 1000000000 / info->var.pixclock, info->var.vmode);
425 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
426 if (par->FlatPanel == 1) {
427 state->pixel |= (1 << 7);
429 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
430 || (par->fpHeight <= info->var.yres)) {
431 state->scale |= (1 << 8);
434 if (!par->crtcSync_read) {
435 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
436 par->crtcSync_read = 1;
439 par->PanelTweak = nvidia_panel_tweak(par, state);
442 state->vpll = state->pll;
443 state->vpll2 = state->pll;
444 state->vpllB = state->pllB;
445 state->vpll2B = state->pllB;
447 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
448 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
450 if (par->CRTCnumber) {
451 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
452 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
453 state->crtcOwner = 3;
454 state->pllsel |= 0x20000800;
455 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
456 if (par->twoStagePLL)
457 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
458 } else if (par->twoHeads) {
459 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
460 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
461 state->crtcOwner = 0;
462 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
463 if (par->twoStagePLL)
464 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
467 state->cursorConfig = 0x00000100;
469 if (info->var.vmode & FB_VMODE_DOUBLE)
470 state->cursorConfig |= (1 << 4);
472 if (par->alphaCursor) {
473 if ((par->Chipset & 0x0ff0) != 0x0110)
474 state->cursorConfig |= 0x04011000;
476 state->cursorConfig |= 0x14011000;
477 state->general |= (1 << 29);
479 state->cursorConfig |= 0x02000000;
482 if ((par->Chipset & 0x0ff0) == 0x0110) {
483 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
486 state->dither |= 0x00010000;
488 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
496 state->displayV = info->var.xres;
501 static void nvidia_init_vga(struct fb_info *info)
503 struct nvidia_par *par = info->par;
504 struct _riva_hw_state *state = &par->ModeReg;
507 for (i = 0; i < 0x10; i++)
509 state->attr[0x10] = 0x41;
510 state->attr[0x11] = 0xff;
511 state->attr[0x12] = 0x0f;
512 state->attr[0x13] = 0x00;
513 state->attr[0x14] = 0x00;
515 memset(state->crtc, 0x00, NUM_CRT_REGS);
516 state->crtc[0x0a] = 0x20;
517 state->crtc[0x17] = 0xe3;
518 state->crtc[0x18] = 0xff;
519 state->crtc[0x28] = 0x40;
521 memset(state->gra, 0x00, NUM_GRC_REGS);
522 state->gra[0x05] = 0x40;
523 state->gra[0x06] = 0x05;
524 state->gra[0x07] = 0x0f;
525 state->gra[0x08] = 0xff;
527 state->seq[0x00] = 0x03;
528 state->seq[0x01] = 0x01;
529 state->seq[0x02] = 0x0f;
530 state->seq[0x03] = 0x00;
531 state->seq[0x04] = 0x0e;
533 state->misc_output = 0xeb;
536 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
538 struct nvidia_par *par = info->par;
539 u8 data[MAX_CURS * MAX_CURS / 8];
540 int i, set = cursor->set;
543 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
546 NVShowHideCursor(par, 0);
548 if (par->cursor_reset) {
550 par->cursor_reset = 0;
553 if (set & FB_CUR_SETSIZE)
554 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
556 if (set & FB_CUR_SETPOS) {
559 yy = cursor->image.dy - info->var.yoffset;
560 xx = cursor->image.dx - info->var.xoffset;
564 NV_WR32(par->PRAMDAC, 0x0000300, temp);
567 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
568 u32 bg_idx = cursor->image.bg_color;
569 u32 fg_idx = cursor->image.fg_color;
570 u32 s_pitch = (cursor->image.width + 7) >> 3;
571 u32 d_pitch = MAX_CURS / 8;
572 u8 *dat = (u8 *) cursor->image.data;
573 u8 *msk = (u8 *) cursor->mask;
576 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
579 switch (cursor->rop) {
581 for (i = 0; i < s_pitch * cursor->image.height; i++)
582 src[i] = dat[i] ^ msk[i];
586 for (i = 0; i < s_pitch * cursor->image.height; i++)
587 src[i] = dat[i] & msk[i];
591 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
592 cursor->image.height);
594 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
595 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
596 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
598 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
599 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
600 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
602 NVLockUnlock(par, 0);
604 nvidiafb_load_cursor_image(par, data, bg, fg,
606 cursor->image.height);
612 NVShowHideCursor(par, 1);
617 static int nvidiafb_set_par(struct fb_info *info)
619 struct nvidia_par *par = info->par;
623 NVLockUnlock(par, 1);
624 if (!par->FlatPanel || !par->twoHeads)
627 if (par->FPDither < 0) {
628 if ((par->Chipset & 0x0ff0) == 0x0110)
629 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
632 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
633 printk(KERN_INFO PFX "Flat panel dithering %s\n",
634 par->FPDither ? "enabled" : "disabled");
637 info->fix.visual = (info->var.bits_per_pixel == 8) ?
638 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
640 nvidia_init_vga(info);
641 nvidia_calc_regs(info);
643 NVLockUnlock(par, 0);
645 VGA_WR08(par->PCIO, 0x03D4, 0x44);
646 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
647 NVLockUnlock(par, 0);
650 nvidia_vga_protect(par, 1);
652 nvidia_write_regs(par, &par->ModeReg);
653 NVSetStartAddress(par, 0);
655 #if defined (__BIG_ENDIAN)
656 /* turn on LFB swapping */
660 VGA_WR08(par->PCIO, 0x3d4, 0x46);
661 tmp = VGA_RD08(par->PCIO, 0x3d5);
663 VGA_WR08(par->PCIO, 0x3d5, tmp);
667 info->fix.line_length = (info->var.xres_virtual *
668 info->var.bits_per_pixel) >> 3;
669 if (info->var.accel_flags) {
670 info->fbops->fb_imageblit = nvidiafb_imageblit;
671 info->fbops->fb_fillrect = nvidiafb_fillrect;
672 info->fbops->fb_copyarea = nvidiafb_copyarea;
673 info->fbops->fb_sync = nvidiafb_sync;
674 info->pixmap.scan_align = 4;
675 info->flags &= ~FBINFO_HWACCEL_DISABLED;
676 NVResetGraphics(info);
678 info->fbops->fb_imageblit = cfb_imageblit;
679 info->fbops->fb_fillrect = cfb_fillrect;
680 info->fbops->fb_copyarea = cfb_copyarea;
681 info->fbops->fb_sync = NULL;
682 info->pixmap.scan_align = 1;
683 info->flags |= FBINFO_HWACCEL_DISABLED;
686 par->cursor_reset = 1;
688 nvidia_vga_protect(par, 0);
694 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
695 unsigned blue, unsigned transp,
696 struct fb_info *info)
698 struct nvidia_par *par = info->par;
702 if (regno >= (1 << info->var.green.length))
705 if (info->var.grayscale) {
706 /* gray = 0.30*R + 0.59*G + 0.11*B */
707 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
710 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
711 ((u32 *) info->pseudo_palette)[regno] =
712 (regno << info->var.red.offset) |
713 (regno << info->var.green.offset) |
714 (regno << info->var.blue.offset);
717 switch (info->var.bits_per_pixel) {
719 /* "transparent" stuff is completely ignored. */
720 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
723 if (info->var.green.length == 5) {
724 for (i = 0; i < 8; i++) {
725 nvidia_write_clut(par, regno * 8 + i, red >> 8,
726 green >> 8, blue >> 8);
732 for (i = 0; i < 8; i++) {
733 nvidia_write_clut(par, regno * 8 + i,
734 red >> 8, green >> 8,
739 nvidia_read_clut(par, regno * 4, &r, &g, &b);
741 for (i = 0; i < 4; i++)
742 nvidia_write_clut(par, regno * 4 + i, r,
747 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
758 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
759 struct fb_info *info)
761 struct nvidia_par *par = info->par;
762 int memlen, vramlen, mode_valid = 0;
767 var->transp.offset = 0;
768 var->transp.length = 0;
772 if (var->bits_per_pixel <= 8)
773 var->bits_per_pixel = 8;
774 else if (var->bits_per_pixel <= 16)
775 var->bits_per_pixel = 16;
777 var->bits_per_pixel = 32;
779 switch (var->bits_per_pixel) {
783 var->green.offset = 0;
784 var->green.length = 8;
785 var->blue.offset = 0;
786 var->blue.length = 8;
787 var->transp.offset = 0;
788 var->transp.length = 0;
791 var->green.length = (var->green.length < 6) ? 5 : 6;
793 var->blue.length = 5;
794 var->transp.length = 6 - var->green.length;
795 var->blue.offset = 0;
796 var->green.offset = 5;
797 var->red.offset = 5 + var->green.length;
798 var->transp.offset = (5 + var->red.offset) & 15;
800 case 32: /* RGBA 8888 */
801 var->red.offset = 16;
803 var->green.offset = 8;
804 var->green.length = 8;
805 var->blue.offset = 0;
806 var->blue.length = 8;
807 var->transp.length = 8;
808 var->transp.offset = 24;
812 var->red.msb_right = 0;
813 var->green.msb_right = 0;
814 var->blue.msb_right = 0;
815 var->transp.msb_right = 0;
817 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
818 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
821 /* calculate modeline if supported by monitor */
822 if (!mode_valid && info->monspecs.gtf) {
823 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
828 struct fb_videomode *mode;
830 mode = fb_find_best_mode(var, &info->modelist);
832 fb_videomode_to_var(var, mode);
837 if (!mode_valid && info->monspecs.modedb_len)
840 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
841 par->fpHeight < var->yres))
844 if (var->yres_virtual < var->yres)
845 var->yres_virtual = var->yres;
847 if (var->xres_virtual < var->xres)
848 var->xres_virtual = var->xres;
850 var->xres_virtual = (var->xres_virtual + 63) & ~63;
852 vramlen = info->screen_size;
853 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
854 memlen = pitch * var->yres_virtual;
856 if (memlen > vramlen) {
857 var->yres_virtual = vramlen / pitch;
859 if (var->yres_virtual < var->yres) {
860 var->yres_virtual = var->yres;
861 var->xres_virtual = vramlen / var->yres_virtual;
862 var->xres_virtual /= var->bits_per_pixel / 8;
863 var->xres_virtual &= ~63;
864 pitch = (var->xres_virtual *
865 var->bits_per_pixel + 7) / 8;
866 memlen = pitch * var->yres;
868 if (var->xres_virtual < var->xres) {
869 printk("nvidiafb: required video memory, "
870 "%d bytes, for %dx%d-%d (virtual) "
872 memlen, var->xres_virtual,
873 var->yres_virtual, var->bits_per_pixel);
879 if (var->accel_flags) {
880 if (var->yres_virtual > 0x7fff)
881 var->yres_virtual = 0x7fff;
882 if (var->xres_virtual > 0x7fff)
883 var->xres_virtual = 0x7fff;
886 var->xres_virtual &= ~63;
893 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
894 struct fb_info *info)
896 struct nvidia_par *par = info->par;
899 total = var->yoffset * info->fix.line_length + var->xoffset;
901 NVSetStartAddress(par, total);
906 static int nvidiafb_blank(int blank, struct fb_info *info)
908 struct nvidia_par *par = info->par;
909 unsigned char tmp, vesa;
911 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
912 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
920 case FB_BLANK_UNBLANK:
921 case FB_BLANK_NORMAL:
923 case FB_BLANK_VSYNC_SUSPEND:
926 case FB_BLANK_HSYNC_SUSPEND:
929 case FB_BLANK_POWERDOWN:
934 NVWriteSeq(par, 0x01, tmp);
935 NVWriteCrtc(par, 0x1a, vesa);
937 #ifdef CONFIG_FB_NVIDIA_BACKLIGHT
938 mutex_lock(&info->bl_mutex);
940 down(&info->bl_dev->sem);
941 info->bl_dev->props->power = blank;
942 info->bl_dev->props->update_status(info->bl_dev);
943 up(&info->bl_dev->sem);
945 mutex_unlock(&info->bl_mutex);
953 static struct fb_ops nvidia_fb_ops = {
954 .owner = THIS_MODULE,
955 .fb_check_var = nvidiafb_check_var,
956 .fb_set_par = nvidiafb_set_par,
957 .fb_setcolreg = nvidiafb_setcolreg,
958 .fb_pan_display = nvidiafb_pan_display,
959 .fb_blank = nvidiafb_blank,
960 .fb_fillrect = nvidiafb_fillrect,
961 .fb_copyarea = nvidiafb_copyarea,
962 .fb_imageblit = nvidiafb_imageblit,
963 .fb_cursor = nvidiafb_cursor,
964 .fb_sync = nvidiafb_sync,
968 static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t state)
970 struct fb_info *info = pci_get_drvdata(dev);
971 struct nvidia_par *par = info->par;
973 acquire_console_sem();
974 par->pm_state = state.event;
976 if (state.event == PM_EVENT_FREEZE) {
977 dev->dev.power.power_state = state;
979 fb_set_suspend(info, 1);
980 nvidiafb_blank(FB_BLANK_POWERDOWN, info);
981 nvidia_write_regs(par, &par->SavedReg);
983 pci_disable_device(dev);
984 pci_set_power_state(dev, pci_choose_state(dev, state));
987 release_console_sem();
991 static int nvidiafb_resume(struct pci_dev *dev)
993 struct fb_info *info = pci_get_drvdata(dev);
994 struct nvidia_par *par = info->par;
996 acquire_console_sem();
997 pci_set_power_state(dev, PCI_D0);
999 if (par->pm_state != PM_EVENT_FREEZE) {
1000 pci_restore_state(dev);
1001 pci_enable_device(dev);
1002 pci_set_master(dev);
1005 par->pm_state = PM_EVENT_ON;
1006 nvidiafb_set_par(info);
1007 fb_set_suspend (info, 0);
1008 nvidiafb_blank(FB_BLANK_UNBLANK, info);
1010 release_console_sem();
1014 #define nvidiafb_suspend NULL
1015 #define nvidiafb_resume NULL
1018 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1020 struct fb_monspecs *specs = &info->monspecs;
1021 struct fb_videomode modedb;
1022 struct nvidia_par *par = info->par;
1026 info->flags = FBINFO_DEFAULT
1027 | FBINFO_HWACCEL_IMAGEBLIT
1028 | FBINFO_HWACCEL_FILLRECT
1029 | FBINFO_HWACCEL_COPYAREA
1030 | FBINFO_HWACCEL_YPAN;
1032 fb_videomode_to_modelist(info->monspecs.modedb,
1033 info->monspecs.modedb_len, &info->modelist);
1034 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1048 if (specs->modedb != NULL) {
1049 struct fb_videomode *modedb;
1051 modedb = fb_find_best_display(specs, &info->modelist);
1052 fb_videomode_to_var(&nvidiafb_default_var, modedb);
1053 nvidiafb_default_var.bits_per_pixel = bpp;
1054 } else if (par->fpWidth && par->fpHeight) {
1058 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1059 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1060 specs->modedb_len, &modedb, bpp);
1064 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1065 specs->modedb, specs->modedb_len, &modedb, bpp);
1067 info->var = nvidiafb_default_var;
1068 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1069 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1070 info->pseudo_palette = par->pseudo_palette;
1071 fb_alloc_cmap(&info->cmap, 256, 0);
1072 fb_destroy_modedb(info->monspecs.modedb);
1073 info->monspecs.modedb = NULL;
1075 /* maximize virtual vertical length */
1076 lpitch = info->var.xres_virtual *
1077 ((info->var.bits_per_pixel + 7) >> 3);
1078 info->var.yres_virtual = info->screen_size / lpitch;
1080 info->pixmap.scan_align = 4;
1081 info->pixmap.buf_align = 4;
1082 info->pixmap.access_align = 32;
1083 info->pixmap.size = 8 * 1024;
1084 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1087 info->fbops->fb_cursor = NULL;
1089 info->var.accel_flags = (!noaccel);
1091 switch (par->Architecture) {
1093 info->fix.accel = FB_ACCEL_NV4;
1096 info->fix.accel = FB_ACCEL_NV_10;
1099 info->fix.accel = FB_ACCEL_NV_20;
1102 info->fix.accel = FB_ACCEL_NV_30;
1105 info->fix.accel = FB_ACCEL_NV_40;
1111 return nvidiafb_check_var(&info->var, info);
1114 static u32 __devinit nvidia_get_chipset(struct fb_info *info)
1116 struct nvidia_par *par = info->par;
1117 u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1119 printk(KERN_INFO PFX "Device ID: %x \n", id);
1121 if ((id & 0xfff0) == 0x00f0) {
1123 id = NV_RD32(par->REGS, 0x1800);
1125 if ((id & 0x0000ffff) == 0x000010DE)
1126 id = 0x10DE0000 | (id >> 16);
1127 else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1128 id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1129 ((id >> 8) & 0x000000ff);
1130 printk(KERN_INFO PFX "Subsystem ID: %x \n", id);
1136 static u32 __devinit nvidia_get_arch(struct fb_info *info)
1138 struct nvidia_par *par = info->par;
1141 switch (par->Chipset & 0x0ff0) {
1142 case 0x0100: /* GeForce 256 */
1143 case 0x0110: /* GeForce2 MX */
1144 case 0x0150: /* GeForce2 */
1145 case 0x0170: /* GeForce4 MX */
1146 case 0x0180: /* GeForce4 MX (8x AGP) */
1147 case 0x01A0: /* nForce */
1148 case 0x01F0: /* nForce2 */
1151 case 0x0200: /* GeForce3 */
1152 case 0x0250: /* GeForce4 Ti */
1153 case 0x0280: /* GeForce4 Ti (8x AGP) */
1156 case 0x0300: /* GeForceFX 5800 */
1157 case 0x0310: /* GeForceFX 5600 */
1158 case 0x0320: /* GeForceFX 5200 */
1159 case 0x0330: /* GeForceFX 5900 */
1160 case 0x0340: /* GeForceFX 5700 */
1179 case 0x0020: /* TNT, TNT2 */
1182 default: /* unknown architecture */
1189 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1190 const struct pci_device_id *ent)
1192 struct nvidia_par *par;
1193 struct fb_info *info;
1200 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1208 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1210 if (info->pixmap.addr == NULL)
1213 memset(info->pixmap.addr, 0, 8 * 1024);
1215 if (pci_enable_device(pd)) {
1216 printk(KERN_ERR PFX "cannot enable PCI device\n");
1217 goto err_out_enable;
1220 if (pci_request_regions(pd, "nvidiafb")) {
1221 printk(KERN_ERR PFX "cannot request PCI regions\n");
1222 goto err_out_enable;
1225 par->FlatPanel = flatpanel;
1227 printk(KERN_INFO PFX "flatpanel support enabled\n");
1228 par->FPDither = fpdither;
1230 par->CRTCnumber = forceCRTC;
1231 par->FpScale = (!noscale);
1232 par->paneltweak = paneltweak;
1234 /* enable IO and mem if not already done */
1235 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1236 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1237 pci_write_config_word(pd, PCI_COMMAND, cmd);
1239 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1240 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1241 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1243 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1246 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1247 goto err_out_free_base0;
1250 par->Chipset = nvidia_get_chipset(info);
1251 par->Architecture = nvidia_get_arch(info);
1253 if (par->Architecture == 0) {
1254 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1258 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1260 if (NVCommonSetup(info))
1263 par->FbAddress = nvidiafb_fix.smem_start;
1264 par->FbMapSize = par->RamAmountKBytes * 1024;
1265 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1266 par->FbMapSize = vram * 1024 * 1024;
1268 /* Limit amount of vram to 64 MB */
1269 if (par->FbMapSize > 64 * 1024 * 1024)
1270 par->FbMapSize = 64 * 1024 * 1024;
1272 if(par->Architecture >= NV_ARCH_40)
1273 par->FbUsableSize = par->FbMapSize - (560 * 1024);
1275 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1276 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1278 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1279 par->CursorStart = par->FbUsableSize + (32 * 1024);
1281 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1282 info->screen_size = par->FbUsableSize;
1283 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1285 if (!info->screen_base) {
1286 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1287 goto err_out_free_base1;
1290 par->FbStart = info->screen_base;
1294 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1295 par->RamAmountKBytes * 1024,
1296 MTRR_TYPE_WRCOMB, 1);
1297 if (par->mtrr.vram < 0) {
1298 printk(KERN_ERR PFX "unable to setup MTRR\n");
1300 par->mtrr.vram_valid = 1;
1301 /* let there be speed */
1302 printk(KERN_INFO PFX "MTRR set to ON\n");
1305 #endif /* CONFIG_MTRR */
1307 info->fbops = &nvidia_fb_ops;
1308 info->fix = nvidiafb_fix;
1310 if (nvidia_set_fbinfo(info) < 0) {
1311 printk(KERN_ERR PFX "error setting initial video mode\n");
1312 goto err_out_iounmap_fb;
1315 nvidia_save_vga(par, &par->SavedReg);
1317 if (register_framebuffer(info) < 0) {
1318 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1319 goto err_out_iounmap_fb;
1322 pci_set_drvdata(pd, info);
1324 printk(KERN_INFO PFX
1325 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1327 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1329 nvidia_bl_init(par);
1335 iounmap(info->screen_base);
1337 fb_destroy_modedb(info->monspecs.modedb);
1338 nvidia_delete_i2c_busses(par);
1342 pci_release_regions(pd);
1344 kfree(info->pixmap.addr);
1346 framebuffer_release(info);
1351 static void __exit nvidiafb_remove(struct pci_dev *pd)
1353 struct fb_info *info = pci_get_drvdata(pd);
1354 struct nvidia_par *par = info->par;
1358 nvidia_bl_exit(par);
1360 unregister_framebuffer(info);
1362 if (par->mtrr.vram_valid)
1363 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1364 info->fix.smem_len);
1365 #endif /* CONFIG_MTRR */
1367 iounmap(info->screen_base);
1368 fb_destroy_modedb(info->monspecs.modedb);
1369 nvidia_delete_i2c_busses(par);
1371 pci_release_regions(pd);
1372 kfree(info->pixmap.addr);
1373 framebuffer_release(info);
1374 pci_set_drvdata(pd, NULL);
1378 /* ------------------------------------------------------------------------- *
1382 * ------------------------------------------------------------------------- */
1385 static int __devinit nvidiafb_setup(char *options)
1390 if (!options || !*options)
1393 while ((this_opt = strsep(&options, ",")) != NULL) {
1394 if (!strncmp(this_opt, "forceCRTC", 9)) {
1400 forceCRTC = *p - '0';
1401 if (forceCRTC < 0 || forceCRTC > 1)
1403 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1405 } else if (!strncmp(this_opt, "hwcur", 5)) {
1407 } else if (!strncmp(this_opt, "noaccel", 6)) {
1409 } else if (!strncmp(this_opt, "noscale", 7)) {
1411 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1412 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1413 } else if (!strncmp(this_opt, "vram:", 5)) {
1414 vram = simple_strtoul(this_opt+5, NULL, 0);
1416 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1419 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1420 fpdither = simple_strtol(this_opt+9, NULL, 0);
1421 } else if (!strncmp(this_opt, "bpp:", 4)) {
1422 bpp = simple_strtoul(this_opt+4, NULL, 0);
1424 mode_option = this_opt;
1429 #endif /* !MODULE */
1431 static struct pci_driver nvidiafb_driver = {
1433 .id_table = nvidiafb_pci_tbl,
1434 .probe = nvidiafb_probe,
1435 .suspend = nvidiafb_suspend,
1436 .resume = nvidiafb_resume,
1437 .remove = __exit_p(nvidiafb_remove),
1440 /* ------------------------------------------------------------------------- *
1444 * ------------------------------------------------------------------------- */
1446 static int __devinit nvidiafb_init(void)
1449 char *option = NULL;
1451 if (fb_get_options("nvidiafb", &option))
1453 nvidiafb_setup(option);
1455 return pci_register_driver(&nvidiafb_driver);
1458 module_init(nvidiafb_init);
1461 static void __exit nvidiafb_exit(void)
1463 pci_unregister_driver(&nvidiafb_driver);
1466 module_exit(nvidiafb_exit);
1468 module_param(flatpanel, int, 0);
1469 MODULE_PARM_DESC(flatpanel,
1470 "Enables experimental flat panel support for some chipsets. "
1471 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1472 module_param(fpdither, int, 0);
1473 MODULE_PARM_DESC(fpdither,
1474 "Enables dithering of flat panel for 6 bits panels. "
1475 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1476 module_param(hwcur, int, 0);
1477 MODULE_PARM_DESC(hwcur,
1478 "Enables hardware cursor implementation. (0 or 1=enabled) "
1480 module_param(noaccel, int, 0);
1481 MODULE_PARM_DESC(noaccel,
1482 "Disables hardware acceleration. (0 or 1=disable) "
1484 module_param(noscale, int, 0);
1485 MODULE_PARM_DESC(noscale,
1486 "Disables screen scaleing. (0 or 1=disable) "
1487 "(default=0, do scaling)");
1488 module_param(paneltweak, int, 0);
1489 MODULE_PARM_DESC(paneltweak,
1490 "Tweak display settings for flatpanels. "
1491 "(default=0, no tweaks)");
1492 module_param(forceCRTC, int, 0);
1493 MODULE_PARM_DESC(forceCRTC,
1494 "Forces usage of a particular CRTC in case autodetection "
1495 "fails. (0 or 1) (default=autodetect)");
1496 module_param(vram, int, 0);
1497 MODULE_PARM_DESC(vram,
1498 "amount of framebuffer memory to remap in MiB"
1499 "(default=0 - remap entire memory)");
1500 module_param(mode_option, charp, 0);
1501 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1502 module_param(bpp, int, 0);
1503 MODULE_PARM_DESC(bpp, "pixel width in bits"
1506 module_param(nomtrr, bool, 0);
1507 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1511 MODULE_AUTHOR("Antonino Daplas");
1512 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1513 MODULE_LICENSE("GPL");