Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[wrt350n-kernel.git] / drivers / video / nvidia / nvidia.c
blobf024cbc1408694a038933b70d1d5d48694f9bde7
1 /*
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
8 * for more details.
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/string.h>
16 #include <linux/mm.h>
17 #include <linux/slab.h>
18 #include <linux/delay.h>
19 #include <linux/fb.h>
20 #include <linux/init.h>
21 #include <linux/pci.h>
22 #include <linux/console.h>
23 #include <linux/backlight.h>
24 #ifdef CONFIG_MTRR
25 #include <asm/mtrr.h>
26 #endif
27 #ifdef CONFIG_PPC_OF
28 #include <asm/prom.h>
29 #include <asm/pci-bridge.h>
30 #endif
31 #ifdef CONFIG_BOOTX_TEXT
32 #include <asm/btext.h>
33 #endif
35 #include "nv_local.h"
36 #include "nv_type.h"
37 #include "nv_proto.h"
38 #include "nv_dma.h"
40 #ifdef CONFIG_FB_NVIDIA_DEBUG
41 #define NVTRACE printk
42 #else
43 #define NVTRACE if (0) printk
44 #endif
46 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
47 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
49 #ifdef CONFIG_FB_NVIDIA_DEBUG
50 #define assert(expr) \
51 if (!(expr)) { \
52 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
53 #expr,__FILE__,__FUNCTION__,__LINE__); \
54 BUG(); \
56 #else
57 #define assert(expr)
58 #endif
60 #define PFX "nvidiafb: "
62 /* HW cursor parameters */
63 #define MAX_CURS 32
65 static struct pci_device_id nvidiafb_pci_tbl[] = {
66 {PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
67 PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0},
68 { 0, }
70 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
72 /* command line data, set in nvidiafb_setup() */
73 static int flatpanel __devinitdata = -1; /* Autodetect later */
74 static int fpdither __devinitdata = -1;
75 static int forceCRTC __devinitdata = -1;
76 static int hwcur __devinitdata = 0;
77 static int noaccel __devinitdata = 0;
78 static int noscale __devinitdata = 0;
79 static int paneltweak __devinitdata = 0;
80 static int vram __devinitdata = 0;
81 static int bpp __devinitdata = 8;
82 static int reverse_i2c __devinitdata;
83 #ifdef CONFIG_MTRR
84 static int nomtrr __devinitdata = 0;
85 #endif
86 #ifdef CONFIG_PMAC_BACKLIGHT
87 static int backlight __devinitdata = 1;
88 #else
89 static int backlight __devinitdata = 0;
90 #endif
92 static char *mode_option __devinitdata = NULL;
94 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
95 .type = FB_TYPE_PACKED_PIXELS,
96 .xpanstep = 8,
97 .ypanstep = 1,
100 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
101 .xres = 640,
102 .yres = 480,
103 .xres_virtual = 640,
104 .yres_virtual = 480,
105 .bits_per_pixel = 8,
106 .red = {0, 8, 0},
107 .green = {0, 8, 0},
108 .blue = {0, 8, 0},
109 .transp = {0, 0, 0},
110 .activate = FB_ACTIVATE_NOW,
111 .height = -1,
112 .width = -1,
113 .pixclock = 39721,
114 .left_margin = 40,
115 .right_margin = 24,
116 .upper_margin = 32,
117 .lower_margin = 11,
118 .hsync_len = 96,
119 .vsync_len = 2,
120 .vmode = FB_VMODE_NONINTERLACED
123 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
124 u16 bg, u16 fg, u32 w, u32 h)
126 u32 *data = (u32 *) data8;
127 int i, j, k = 0;
128 u32 b, tmp;
130 w = (w + 1) & ~1;
132 for (i = 0; i < h; i++) {
133 b = *data++;
134 reverse_order(&b);
136 for (j = 0; j < w / 2; j++) {
137 tmp = 0;
138 #if defined (__BIG_ENDIAN)
139 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
140 b <<= 1;
141 tmp |= (b & (1 << 31)) ? fg : bg;
142 b <<= 1;
143 #else
144 tmp = (b & 1) ? fg : bg;
145 b >>= 1;
146 tmp |= (b & 1) ? fg << 16 : bg << 16;
147 b >>= 1;
148 #endif
149 NV_WR32(&par->CURSOR[k++], 0, tmp);
151 k += (MAX_CURS - w) / 2;
155 static void nvidia_write_clut(struct nvidia_par *par,
156 u8 regnum, u8 red, u8 green, u8 blue)
158 NVWriteDacMask(par, 0xff);
159 NVWriteDacWriteAddr(par, regnum);
160 NVWriteDacData(par, red);
161 NVWriteDacData(par, green);
162 NVWriteDacData(par, blue);
165 static void nvidia_read_clut(struct nvidia_par *par,
166 u8 regnum, u8 * red, u8 * green, u8 * blue)
168 NVWriteDacMask(par, 0xff);
169 NVWriteDacReadAddr(par, regnum);
170 *red = NVReadDacData(par);
171 *green = NVReadDacData(par);
172 *blue = NVReadDacData(par);
175 static int nvidia_panel_tweak(struct nvidia_par *par,
176 struct _riva_hw_state *state)
178 int tweak = 0;
180 if (par->paneltweak) {
181 tweak = par->paneltweak;
182 } else {
183 /* begin flat panel hacks */
184 /* This is unfortunate, but some chips need this register
185 tweaked or else you get artifacts where adjacent pixels are
186 swapped. There are no hard rules for what to set here so all
187 we can do is experiment and apply hacks. */
189 if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
190 /* At least one NV34 laptop needs this workaround. */
191 tweak = -1;
194 if((par->Chipset & 0xfff0) == 0x0310) {
195 tweak = 1;
197 /* end flat panel hacks */
200 return tweak;
203 static void nvidia_screen_off(struct nvidia_par *par, int on)
205 unsigned char tmp;
207 if (on) {
209 * Turn off screen and disable sequencer.
211 tmp = NVReadSeq(par, 0x01);
213 NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */
214 NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */
215 } else {
217 * Reenable sequencer, then turn on screen.
220 tmp = NVReadSeq(par, 0x01);
222 NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */
223 NVWriteSeq(par, 0x00, 0x03); /* End Reset */
227 static void nvidia_save_vga(struct nvidia_par *par,
228 struct _riva_hw_state *state)
230 int i;
232 NVTRACE_ENTER();
233 NVLockUnlock(par, 0);
235 NVUnloadStateExt(par, state);
237 state->misc_output = NVReadMiscOut(par);
239 for (i = 0; i < NUM_CRT_REGS; i++)
240 state->crtc[i] = NVReadCrtc(par, i);
242 for (i = 0; i < NUM_ATC_REGS; i++)
243 state->attr[i] = NVReadAttr(par, i);
245 for (i = 0; i < NUM_GRC_REGS; i++)
246 state->gra[i] = NVReadGr(par, i);
248 for (i = 0; i < NUM_SEQ_REGS; i++)
249 state->seq[i] = NVReadSeq(par, i);
250 NVTRACE_LEAVE();
253 #undef DUMP_REG
255 static void nvidia_write_regs(struct nvidia_par *par,
256 struct _riva_hw_state *state)
258 int i;
260 NVTRACE_ENTER();
262 NVLoadStateExt(par, state);
264 NVWriteMiscOut(par, state->misc_output);
266 for (i = 1; i < NUM_SEQ_REGS; i++) {
267 #ifdef DUMP_REG
268 printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
269 #endif
270 NVWriteSeq(par, i, state->seq[i]);
273 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
274 NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
276 for (i = 0; i < NUM_CRT_REGS; i++) {
277 switch (i) {
278 case 0x19:
279 case 0x20 ... 0x40:
280 break;
281 default:
282 #ifdef DUMP_REG
283 printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
284 #endif
285 NVWriteCrtc(par, i, state->crtc[i]);
289 for (i = 0; i < NUM_GRC_REGS; i++) {
290 #ifdef DUMP_REG
291 printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
292 #endif
293 NVWriteGr(par, i, state->gra[i]);
296 for (i = 0; i < NUM_ATC_REGS; i++) {
297 #ifdef DUMP_REG
298 printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
299 #endif
300 NVWriteAttr(par, i, state->attr[i]);
303 NVTRACE_LEAVE();
306 static int nvidia_calc_regs(struct fb_info *info)
308 struct nvidia_par *par = info->par;
309 struct _riva_hw_state *state = &par->ModeReg;
310 int i, depth = fb_get_color_depth(&info->var, &info->fix);
311 int h_display = info->var.xres / 8 - 1;
312 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
313 int h_end = (info->var.xres + info->var.right_margin +
314 info->var.hsync_len) / 8 - 1;
315 int h_total = (info->var.xres + info->var.right_margin +
316 info->var.hsync_len + info->var.left_margin) / 8 - 5;
317 int h_blank_s = h_display;
318 int h_blank_e = h_total + 4;
319 int v_display = info->var.yres - 1;
320 int v_start = info->var.yres + info->var.lower_margin - 1;
321 int v_end = (info->var.yres + info->var.lower_margin +
322 info->var.vsync_len) - 1;
323 int v_total = (info->var.yres + info->var.lower_margin +
324 info->var.vsync_len + info->var.upper_margin) - 2;
325 int v_blank_s = v_display;
326 int v_blank_e = v_total + 1;
329 * Set all CRTC values.
332 if (info->var.vmode & FB_VMODE_INTERLACED)
333 v_total |= 1;
335 if (par->FlatPanel == 1) {
336 v_start = v_total - 3;
337 v_end = v_total - 2;
338 v_blank_s = v_start;
339 h_start = h_total - 5;
340 h_end = h_total - 2;
341 h_blank_e = h_total + 4;
344 state->crtc[0x0] = Set8Bits(h_total);
345 state->crtc[0x1] = Set8Bits(h_display);
346 state->crtc[0x2] = Set8Bits(h_blank_s);
347 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
348 | SetBit(7);
349 state->crtc[0x4] = Set8Bits(h_start);
350 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
351 | SetBitField(h_end, 4: 0, 4:0);
352 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
353 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
354 | SetBitField(v_display, 8: 8, 1:1)
355 | SetBitField(v_start, 8: 8, 2:2)
356 | SetBitField(v_blank_s, 8: 8, 3:3)
357 | SetBit(4)
358 | SetBitField(v_total, 9: 9, 5:5)
359 | SetBitField(v_display, 9: 9, 6:6)
360 | SetBitField(v_start, 9: 9, 7:7);
361 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
362 | SetBit(6)
363 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
364 state->crtc[0x10] = Set8Bits(v_start);
365 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
366 state->crtc[0x12] = Set8Bits(v_display);
367 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
368 (info->var.bits_per_pixel / 8));
369 state->crtc[0x15] = Set8Bits(v_blank_s);
370 state->crtc[0x16] = Set8Bits(v_blank_e);
372 state->attr[0x10] = 0x01;
374 if (par->Television)
375 state->attr[0x11] = 0x00;
377 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
378 | SetBitField(v_blank_s, 10: 10, 3:3)
379 | SetBitField(v_start, 10: 10, 2:2)
380 | SetBitField(v_display, 10: 10, 1:1)
381 | SetBitField(v_total, 10: 10, 0:0);
383 state->horiz = SetBitField(h_total, 8: 8, 0:0)
384 | SetBitField(h_display, 8: 8, 1:1)
385 | SetBitField(h_blank_s, 8: 8, 2:2)
386 | SetBitField(h_start, 8: 8, 3:3);
388 state->extra = SetBitField(v_total, 11: 11, 0:0)
389 | SetBitField(v_display, 11: 11, 2:2)
390 | SetBitField(v_start, 11: 11, 4:4)
391 | SetBitField(v_blank_s, 11: 11, 6:6);
393 if (info->var.vmode & FB_VMODE_INTERLACED) {
394 h_total = (h_total >> 1) & ~1;
395 state->interlace = Set8Bits(h_total);
396 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
397 } else {
398 state->interlace = 0xff; /* interlace off */
402 * Calculate the extended registers.
405 if (depth < 24)
406 i = depth;
407 else
408 i = 32;
410 if (par->Architecture >= NV_ARCH_10)
411 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
412 par->CursorStart);
414 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
415 state->misc_output &= ~0x40;
416 else
417 state->misc_output |= 0x40;
418 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
419 state->misc_output &= ~0x80;
420 else
421 state->misc_output |= 0x80;
423 NVCalcStateExt(par, state, i, info->var.xres_virtual,
424 info->var.xres, info->var.yres_virtual,
425 1000000000 / info->var.pixclock, info->var.vmode);
427 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
428 if (par->FlatPanel == 1) {
429 state->pixel |= (1 << 7);
431 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
432 || (par->fpHeight <= info->var.yres)) {
433 state->scale |= (1 << 8);
436 if (!par->crtcSync_read) {
437 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
438 par->crtcSync_read = 1;
441 par->PanelTweak = nvidia_panel_tweak(par, state);
444 state->vpll = state->pll;
445 state->vpll2 = state->pll;
446 state->vpllB = state->pllB;
447 state->vpll2B = state->pllB;
449 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
450 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
452 if (par->CRTCnumber) {
453 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
454 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
455 state->crtcOwner = 3;
456 state->pllsel |= 0x20000800;
457 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
458 if (par->twoStagePLL)
459 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
460 } else if (par->twoHeads) {
461 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
462 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
463 state->crtcOwner = 0;
464 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
465 if (par->twoStagePLL)
466 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
469 state->cursorConfig = 0x00000100;
471 if (info->var.vmode & FB_VMODE_DOUBLE)
472 state->cursorConfig |= (1 << 4);
474 if (par->alphaCursor) {
475 if ((par->Chipset & 0x0ff0) != 0x0110)
476 state->cursorConfig |= 0x04011000;
477 else
478 state->cursorConfig |= 0x14011000;
479 state->general |= (1 << 29);
480 } else
481 state->cursorConfig |= 0x02000000;
483 if (par->twoHeads) {
484 if ((par->Chipset & 0x0ff0) == 0x0110) {
485 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
486 ~0x00010000;
487 if (par->FPDither)
488 state->dither |= 0x00010000;
489 } else {
490 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
491 if (par->FPDither)
492 state->dither |= 1;
496 state->timingH = 0;
497 state->timingV = 0;
498 state->displayV = info->var.xres;
500 return 0;
503 static void nvidia_init_vga(struct fb_info *info)
505 struct nvidia_par *par = info->par;
506 struct _riva_hw_state *state = &par->ModeReg;
507 int i;
509 for (i = 0; i < 0x10; i++)
510 state->attr[i] = i;
511 state->attr[0x10] = 0x41;
512 state->attr[0x11] = 0xff;
513 state->attr[0x12] = 0x0f;
514 state->attr[0x13] = 0x00;
515 state->attr[0x14] = 0x00;
517 memset(state->crtc, 0x00, NUM_CRT_REGS);
518 state->crtc[0x0a] = 0x20;
519 state->crtc[0x17] = 0xe3;
520 state->crtc[0x18] = 0xff;
521 state->crtc[0x28] = 0x40;
523 memset(state->gra, 0x00, NUM_GRC_REGS);
524 state->gra[0x05] = 0x40;
525 state->gra[0x06] = 0x05;
526 state->gra[0x07] = 0x0f;
527 state->gra[0x08] = 0xff;
529 state->seq[0x00] = 0x03;
530 state->seq[0x01] = 0x01;
531 state->seq[0x02] = 0x0f;
532 state->seq[0x03] = 0x00;
533 state->seq[0x04] = 0x0e;
535 state->misc_output = 0xeb;
538 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
540 struct nvidia_par *par = info->par;
541 u8 data[MAX_CURS * MAX_CURS / 8];
542 int i, set = cursor->set;
543 u16 fg, bg;
545 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
546 return -ENXIO;
548 NVShowHideCursor(par, 0);
550 if (par->cursor_reset) {
551 set = FB_CUR_SETALL;
552 par->cursor_reset = 0;
555 if (set & FB_CUR_SETSIZE)
556 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
558 if (set & FB_CUR_SETPOS) {
559 u32 xx, yy, temp;
561 yy = cursor->image.dy - info->var.yoffset;
562 xx = cursor->image.dx - info->var.xoffset;
563 temp = xx & 0xFFFF;
564 temp |= yy << 16;
566 NV_WR32(par->PRAMDAC, 0x0000300, temp);
569 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
570 u32 bg_idx = cursor->image.bg_color;
571 u32 fg_idx = cursor->image.fg_color;
572 u32 s_pitch = (cursor->image.width + 7) >> 3;
573 u32 d_pitch = MAX_CURS / 8;
574 u8 *dat = (u8 *) cursor->image.data;
575 u8 *msk = (u8 *) cursor->mask;
576 u8 *src;
578 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
580 if (src) {
581 switch (cursor->rop) {
582 case ROP_XOR:
583 for (i = 0; i < s_pitch * cursor->image.height; i++)
584 src[i] = dat[i] ^ msk[i];
585 break;
586 case ROP_COPY:
587 default:
588 for (i = 0; i < s_pitch * cursor->image.height; i++)
589 src[i] = dat[i] & msk[i];
590 break;
593 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
594 cursor->image.height);
596 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
597 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
598 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
600 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
601 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
602 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
604 NVLockUnlock(par, 0);
606 nvidiafb_load_cursor_image(par, data, bg, fg,
607 cursor->image.width,
608 cursor->image.height);
609 kfree(src);
613 if (cursor->enable)
614 NVShowHideCursor(par, 1);
616 return 0;
619 static int nvidiafb_set_par(struct fb_info *info)
621 struct nvidia_par *par = info->par;
623 NVTRACE_ENTER();
625 NVLockUnlock(par, 1);
626 if (!par->FlatPanel || !par->twoHeads)
627 par->FPDither = 0;
629 if (par->FPDither < 0) {
630 if ((par->Chipset & 0x0ff0) == 0x0110)
631 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
632 & 0x00010000);
633 else
634 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
635 printk(KERN_INFO PFX "Flat panel dithering %s\n",
636 par->FPDither ? "enabled" : "disabled");
639 info->fix.visual = (info->var.bits_per_pixel == 8) ?
640 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
642 nvidia_init_vga(info);
643 nvidia_calc_regs(info);
645 NVLockUnlock(par, 0);
646 if (par->twoHeads) {
647 VGA_WR08(par->PCIO, 0x03D4, 0x44);
648 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
649 NVLockUnlock(par, 0);
652 nvidia_screen_off(par, 1);
654 nvidia_write_regs(par, &par->ModeReg);
655 NVSetStartAddress(par, 0);
657 #if defined (__BIG_ENDIAN)
658 /* turn on LFB swapping */
660 unsigned char tmp;
662 VGA_WR08(par->PCIO, 0x3d4, 0x46);
663 tmp = VGA_RD08(par->PCIO, 0x3d5);
664 tmp |= (1 << 7);
665 VGA_WR08(par->PCIO, 0x3d5, tmp);
667 #endif
669 info->fix.line_length = (info->var.xres_virtual *
670 info->var.bits_per_pixel) >> 3;
671 if (info->var.accel_flags) {
672 info->fbops->fb_imageblit = nvidiafb_imageblit;
673 info->fbops->fb_fillrect = nvidiafb_fillrect;
674 info->fbops->fb_copyarea = nvidiafb_copyarea;
675 info->fbops->fb_sync = nvidiafb_sync;
676 info->pixmap.scan_align = 4;
677 info->flags &= ~FBINFO_HWACCEL_DISABLED;
678 info->flags |= FBINFO_READS_FAST;
679 NVResetGraphics(info);
680 } else {
681 info->fbops->fb_imageblit = cfb_imageblit;
682 info->fbops->fb_fillrect = cfb_fillrect;
683 info->fbops->fb_copyarea = cfb_copyarea;
684 info->fbops->fb_sync = NULL;
685 info->pixmap.scan_align = 1;
686 info->flags |= FBINFO_HWACCEL_DISABLED;
687 info->flags &= ~FBINFO_READS_FAST;
690 par->cursor_reset = 1;
692 nvidia_screen_off(par, 0);
694 #ifdef CONFIG_BOOTX_TEXT
695 /* Update debug text engine */
696 btext_update_display(info->fix.smem_start,
697 info->var.xres, info->var.yres,
698 info->var.bits_per_pixel, info->fix.line_length);
699 #endif
701 NVLockUnlock(par, 0);
702 NVTRACE_LEAVE();
703 return 0;
706 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
707 unsigned blue, unsigned transp,
708 struct fb_info *info)
710 struct nvidia_par *par = info->par;
711 int i;
713 NVTRACE_ENTER();
714 if (regno >= (1 << info->var.green.length))
715 return -EINVAL;
717 if (info->var.grayscale) {
718 /* gray = 0.30*R + 0.59*G + 0.11*B */
719 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
722 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
723 ((u32 *) info->pseudo_palette)[regno] =
724 (regno << info->var.red.offset) |
725 (regno << info->var.green.offset) |
726 (regno << info->var.blue.offset);
729 switch (info->var.bits_per_pixel) {
730 case 8:
731 /* "transparent" stuff is completely ignored. */
732 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
733 break;
734 case 16:
735 if (info->var.green.length == 5) {
736 for (i = 0; i < 8; i++) {
737 nvidia_write_clut(par, regno * 8 + i, red >> 8,
738 green >> 8, blue >> 8);
740 } else {
741 u8 r, g, b;
743 if (regno < 32) {
744 for (i = 0; i < 8; i++) {
745 nvidia_write_clut(par, regno * 8 + i,
746 red >> 8, green >> 8,
747 blue >> 8);
751 nvidia_read_clut(par, regno * 4, &r, &g, &b);
753 for (i = 0; i < 4; i++)
754 nvidia_write_clut(par, regno * 4 + i, r,
755 green >> 8, b);
757 break;
758 case 32:
759 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
760 break;
761 default:
762 /* do nothing */
763 break;
766 NVTRACE_LEAVE();
767 return 0;
770 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
771 struct fb_info *info)
773 struct nvidia_par *par = info->par;
774 int memlen, vramlen, mode_valid = 0;
775 int pitch, err = 0;
777 NVTRACE_ENTER();
779 var->transp.offset = 0;
780 var->transp.length = 0;
782 var->xres &= ~7;
784 if (var->bits_per_pixel <= 8)
785 var->bits_per_pixel = 8;
786 else if (var->bits_per_pixel <= 16)
787 var->bits_per_pixel = 16;
788 else
789 var->bits_per_pixel = 32;
791 switch (var->bits_per_pixel) {
792 case 8:
793 var->red.offset = 0;
794 var->red.length = 8;
795 var->green.offset = 0;
796 var->green.length = 8;
797 var->blue.offset = 0;
798 var->blue.length = 8;
799 var->transp.offset = 0;
800 var->transp.length = 0;
801 break;
802 case 16:
803 var->green.length = (var->green.length < 6) ? 5 : 6;
804 var->red.length = 5;
805 var->blue.length = 5;
806 var->transp.length = 6 - var->green.length;
807 var->blue.offset = 0;
808 var->green.offset = 5;
809 var->red.offset = 5 + var->green.length;
810 var->transp.offset = (5 + var->red.offset) & 15;
811 break;
812 case 32: /* RGBA 8888 */
813 var->red.offset = 16;
814 var->red.length = 8;
815 var->green.offset = 8;
816 var->green.length = 8;
817 var->blue.offset = 0;
818 var->blue.length = 8;
819 var->transp.length = 8;
820 var->transp.offset = 24;
821 break;
824 var->red.msb_right = 0;
825 var->green.msb_right = 0;
826 var->blue.msb_right = 0;
827 var->transp.msb_right = 0;
829 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
830 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
831 mode_valid = 1;
833 /* calculate modeline if supported by monitor */
834 if (!mode_valid && info->monspecs.gtf) {
835 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
836 mode_valid = 1;
839 if (!mode_valid) {
840 const struct fb_videomode *mode;
842 mode = fb_find_best_mode(var, &info->modelist);
843 if (mode) {
844 fb_videomode_to_var(var, mode);
845 mode_valid = 1;
849 if (!mode_valid && info->monspecs.modedb_len)
850 return -EINVAL;
853 * If we're on a flat panel, check if the mode is outside of the
854 * panel dimensions. If so, cap it and try for the next best mode
855 * before bailing out.
857 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
858 par->fpHeight < var->yres)) {
859 const struct fb_videomode *mode;
861 var->xres = par->fpWidth;
862 var->yres = par->fpHeight;
864 mode = fb_find_best_mode(var, &info->modelist);
865 if (!mode) {
866 printk(KERN_ERR PFX "mode out of range of flat "
867 "panel dimensions\n");
868 return -EINVAL;
871 fb_videomode_to_var(var, mode);
874 if (var->yres_virtual < var->yres)
875 var->yres_virtual = var->yres;
877 if (var->xres_virtual < var->xres)
878 var->xres_virtual = var->xres;
880 var->xres_virtual = (var->xres_virtual + 63) & ~63;
882 vramlen = info->screen_size;
883 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
884 memlen = pitch * var->yres_virtual;
886 if (memlen > vramlen) {
887 var->yres_virtual = vramlen / pitch;
889 if (var->yres_virtual < var->yres) {
890 var->yres_virtual = var->yres;
891 var->xres_virtual = vramlen / var->yres_virtual;
892 var->xres_virtual /= var->bits_per_pixel / 8;
893 var->xres_virtual &= ~63;
894 pitch = (var->xres_virtual *
895 var->bits_per_pixel + 7) / 8;
896 memlen = pitch * var->yres;
898 if (var->xres_virtual < var->xres) {
899 printk("nvidiafb: required video memory, "
900 "%d bytes, for %dx%d-%d (virtual) "
901 "is out of range\n",
902 memlen, var->xres_virtual,
903 var->yres_virtual, var->bits_per_pixel);
904 err = -ENOMEM;
909 if (var->accel_flags) {
910 if (var->yres_virtual > 0x7fff)
911 var->yres_virtual = 0x7fff;
912 if (var->xres_virtual > 0x7fff)
913 var->xres_virtual = 0x7fff;
916 var->xres_virtual &= ~63;
918 NVTRACE_LEAVE();
920 return err;
923 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
924 struct fb_info *info)
926 struct nvidia_par *par = info->par;
927 u32 total;
929 total = var->yoffset * info->fix.line_length + var->xoffset;
931 NVSetStartAddress(par, total);
933 return 0;
936 static int nvidiafb_blank(int blank, struct fb_info *info)
938 struct nvidia_par *par = info->par;
939 unsigned char tmp, vesa;
941 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
942 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
944 NVTRACE_ENTER();
946 if (blank)
947 tmp |= 0x20;
949 switch (blank) {
950 case FB_BLANK_UNBLANK:
951 case FB_BLANK_NORMAL:
952 break;
953 case FB_BLANK_VSYNC_SUSPEND:
954 vesa |= 0x80;
955 break;
956 case FB_BLANK_HSYNC_SUSPEND:
957 vesa |= 0x40;
958 break;
959 case FB_BLANK_POWERDOWN:
960 vesa |= 0xc0;
961 break;
964 NVWriteSeq(par, 0x01, tmp);
965 NVWriteCrtc(par, 0x1a, vesa);
967 NVTRACE_LEAVE();
969 return 0;
973 * Because the VGA registers are not mapped linearly in its MMIO space,
974 * restrict VGA register saving and restore to x86 only, where legacy VGA IO
975 * access is legal. Consequently, we must also check if the device is the
976 * primary display.
978 #ifdef CONFIG_X86
979 static void save_vga_x86(struct nvidia_par *par)
981 struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE];
983 if (res && res->flags & IORESOURCE_ROM_SHADOW) {
984 memset(&par->vgastate, 0, sizeof(par->vgastate));
985 par->vgastate.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS |
986 VGA_SAVE_CMAP;
987 save_vga(&par->vgastate);
991 static void restore_vga_x86(struct nvidia_par *par)
993 struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE];
995 if (res && res->flags & IORESOURCE_ROM_SHADOW)
996 restore_vga(&par->vgastate);
998 #else
999 #define save_vga_x86(x) do {} while (0)
1000 #define restore_vga_x86(x) do {} while (0)
1001 #endif /* X86 */
1003 static int nvidiafb_open(struct fb_info *info, int user)
1005 struct nvidia_par *par = info->par;
1007 mutex_lock(&par->open_lock);
1009 if (!par->open_count) {
1010 save_vga_x86(par);
1011 nvidia_save_vga(par, &par->initial_state);
1014 par->open_count++;
1015 mutex_unlock(&par->open_lock);
1016 return 0;
1019 static int nvidiafb_release(struct fb_info *info, int user)
1021 struct nvidia_par *par = info->par;
1022 int err = 0;
1024 mutex_lock(&par->open_lock);
1026 if (!par->open_count) {
1027 err = -EINVAL;
1028 goto done;
1031 if (par->open_count == 1) {
1032 nvidia_write_regs(par, &par->initial_state);
1033 restore_vga_x86(par);
1036 par->open_count--;
1037 done:
1038 mutex_unlock(&par->open_lock);
1039 return err;
1042 static struct fb_ops nvidia_fb_ops = {
1043 .owner = THIS_MODULE,
1044 .fb_open = nvidiafb_open,
1045 .fb_release = nvidiafb_release,
1046 .fb_check_var = nvidiafb_check_var,
1047 .fb_set_par = nvidiafb_set_par,
1048 .fb_setcolreg = nvidiafb_setcolreg,
1049 .fb_pan_display = nvidiafb_pan_display,
1050 .fb_blank = nvidiafb_blank,
1051 .fb_fillrect = nvidiafb_fillrect,
1052 .fb_copyarea = nvidiafb_copyarea,
1053 .fb_imageblit = nvidiafb_imageblit,
1054 .fb_cursor = nvidiafb_cursor,
1055 .fb_sync = nvidiafb_sync,
1058 #ifdef CONFIG_PM
1059 static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t mesg)
1061 struct fb_info *info = pci_get_drvdata(dev);
1062 struct nvidia_par *par = info->par;
1064 if (mesg.event == PM_EVENT_PRETHAW)
1065 mesg.event = PM_EVENT_FREEZE;
1066 acquire_console_sem();
1067 par->pm_state = mesg.event;
1069 <<<<<<< HEAD:drivers/video/nvidia/nvidia.c
1070 if (mesg.event == PM_EVENT_SUSPEND) {
1071 =======
1072 if (mesg.event & PM_EVENT_SLEEP) {
1073 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a:drivers/video/nvidia/nvidia.c
1074 fb_set_suspend(info, 1);
1075 nvidiafb_blank(FB_BLANK_POWERDOWN, info);
1076 nvidia_write_regs(par, &par->SavedReg);
1077 pci_save_state(dev);
1078 pci_disable_device(dev);
1079 pci_set_power_state(dev, pci_choose_state(dev, mesg));
1081 dev->dev.power.power_state = mesg;
1083 release_console_sem();
1084 return 0;
1087 static int nvidiafb_resume(struct pci_dev *dev)
1089 struct fb_info *info = pci_get_drvdata(dev);
1090 struct nvidia_par *par = info->par;
1092 acquire_console_sem();
1093 pci_set_power_state(dev, PCI_D0);
1095 if (par->pm_state != PM_EVENT_FREEZE) {
1096 pci_restore_state(dev);
1098 if (pci_enable_device(dev))
1099 goto fail;
1101 pci_set_master(dev);
1104 par->pm_state = PM_EVENT_ON;
1105 nvidiafb_set_par(info);
1106 fb_set_suspend (info, 0);
1107 nvidiafb_blank(FB_BLANK_UNBLANK, info);
1109 fail:
1110 release_console_sem();
1111 return 0;
1113 #else
1114 #define nvidiafb_suspend NULL
1115 #define nvidiafb_resume NULL
1116 #endif
1118 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1120 struct fb_monspecs *specs = &info->monspecs;
1121 struct fb_videomode modedb;
1122 struct nvidia_par *par = info->par;
1123 int lpitch;
1125 NVTRACE_ENTER();
1126 info->flags = FBINFO_DEFAULT
1127 | FBINFO_HWACCEL_IMAGEBLIT
1128 | FBINFO_HWACCEL_FILLRECT
1129 | FBINFO_HWACCEL_COPYAREA
1130 | FBINFO_HWACCEL_YPAN;
1132 fb_videomode_to_modelist(info->monspecs.modedb,
1133 info->monspecs.modedb_len, &info->modelist);
1134 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1136 switch (bpp) {
1137 case 0 ... 8:
1138 bpp = 8;
1139 break;
1140 case 9 ... 16:
1141 bpp = 16;
1142 break;
1143 default:
1144 bpp = 32;
1145 break;
1148 if (specs->modedb != NULL) {
1149 const struct fb_videomode *mode;
1151 mode = fb_find_best_display(specs, &info->modelist);
1152 fb_videomode_to_var(&nvidiafb_default_var, mode);
1153 nvidiafb_default_var.bits_per_pixel = bpp;
1154 } else if (par->fpWidth && par->fpHeight) {
1155 char buf[16];
1157 memset(buf, 0, 16);
1158 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1159 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1160 specs->modedb_len, &modedb, bpp);
1163 if (mode_option)
1164 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1165 specs->modedb, specs->modedb_len, &modedb, bpp);
1167 info->var = nvidiafb_default_var;
1168 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1169 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1170 info->pseudo_palette = par->pseudo_palette;
1171 fb_alloc_cmap(&info->cmap, 256, 0);
1172 fb_destroy_modedb(info->monspecs.modedb);
1173 info->monspecs.modedb = NULL;
1175 /* maximize virtual vertical length */
1176 lpitch = info->var.xres_virtual *
1177 ((info->var.bits_per_pixel + 7) >> 3);
1178 info->var.yres_virtual = info->screen_size / lpitch;
1180 info->pixmap.scan_align = 4;
1181 info->pixmap.buf_align = 4;
1182 info->pixmap.access_align = 32;
1183 info->pixmap.size = 8 * 1024;
1184 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1186 if (!hwcur)
1187 info->fbops->fb_cursor = NULL;
1189 info->var.accel_flags = (!noaccel);
1191 switch (par->Architecture) {
1192 case NV_ARCH_04:
1193 info->fix.accel = FB_ACCEL_NV4;
1194 break;
1195 case NV_ARCH_10:
1196 info->fix.accel = FB_ACCEL_NV_10;
1197 break;
1198 case NV_ARCH_20:
1199 info->fix.accel = FB_ACCEL_NV_20;
1200 break;
1201 case NV_ARCH_30:
1202 info->fix.accel = FB_ACCEL_NV_30;
1203 break;
1204 case NV_ARCH_40:
1205 info->fix.accel = FB_ACCEL_NV_40;
1206 break;
1209 NVTRACE_LEAVE();
1211 return nvidiafb_check_var(&info->var, info);
1214 static u32 __devinit nvidia_get_chipset(struct fb_info *info)
1216 struct nvidia_par *par = info->par;
1217 u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1219 printk(KERN_INFO PFX "Device ID: %x \n", id);
1221 if ((id & 0xfff0) == 0x00f0 ||
1222 (id & 0xfff0) == 0x02e0) {
1223 /* pci-e */
1224 id = NV_RD32(par->REGS, 0x1800);
1226 if ((id & 0x0000ffff) == 0x000010DE)
1227 id = 0x10DE0000 | (id >> 16);
1228 else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1229 id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1230 ((id >> 8) & 0x000000ff);
1231 printk(KERN_INFO PFX "Subsystem ID: %x \n", id);
1234 return id;
1237 static u32 __devinit nvidia_get_arch(struct fb_info *info)
1239 struct nvidia_par *par = info->par;
1240 u32 arch = 0;
1242 switch (par->Chipset & 0x0ff0) {
1243 case 0x0100: /* GeForce 256 */
1244 case 0x0110: /* GeForce2 MX */
1245 case 0x0150: /* GeForce2 */
1246 case 0x0170: /* GeForce4 MX */
1247 case 0x0180: /* GeForce4 MX (8x AGP) */
1248 case 0x01A0: /* nForce */
1249 case 0x01F0: /* nForce2 */
1250 arch = NV_ARCH_10;
1251 break;
1252 case 0x0200: /* GeForce3 */
1253 case 0x0250: /* GeForce4 Ti */
1254 case 0x0280: /* GeForce4 Ti (8x AGP) */
1255 arch = NV_ARCH_20;
1256 break;
1257 case 0x0300: /* GeForceFX 5800 */
1258 case 0x0310: /* GeForceFX 5600 */
1259 case 0x0320: /* GeForceFX 5200 */
1260 case 0x0330: /* GeForceFX 5900 */
1261 case 0x0340: /* GeForceFX 5700 */
1262 arch = NV_ARCH_30;
1263 break;
1264 case 0x0040: /* GeForce 6800 */
1265 case 0x00C0: /* GeForce 6800 */
1266 case 0x0120: /* GeForce 6800 */
1267 case 0x0140: /* GeForce 6600 */
1268 case 0x0160: /* GeForce 6200 */
1269 case 0x01D0: /* GeForce 7200, 7300, 7400 */
1270 case 0x0090: /* GeForce 7800 */
1271 case 0x0210: /* GeForce 6800 */
1272 case 0x0220: /* GeForce 6200 */
1273 case 0x0240: /* GeForce 6100 */
1274 case 0x0290: /* GeForce 7900 */
1275 case 0x0390: /* GeForce 7600 */
1276 case 0x03D0:
1277 arch = NV_ARCH_40;
1278 break;
1279 case 0x0020: /* TNT, TNT2 */
1280 arch = NV_ARCH_04;
1281 break;
1282 default: /* unknown architecture */
1283 break;
1286 return arch;
1289 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1290 const struct pci_device_id *ent)
1292 struct nvidia_par *par;
1293 struct fb_info *info;
1294 unsigned short cmd;
1297 NVTRACE_ENTER();
1298 assert(pd != NULL);
1300 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1302 if (!info)
1303 goto err_out;
1305 par = info->par;
1306 par->pci_dev = pd;
1307 mutex_init(&par->open_lock);
1308 info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL);
1310 if (info->pixmap.addr == NULL)
1311 goto err_out_kfree;
1313 if (pci_enable_device(pd)) {
1314 printk(KERN_ERR PFX "cannot enable PCI device\n");
1315 goto err_out_enable;
1318 if (pci_request_regions(pd, "nvidiafb")) {
1319 printk(KERN_ERR PFX "cannot request PCI regions\n");
1320 goto err_out_enable;
1323 par->FlatPanel = flatpanel;
1324 if (flatpanel == 1)
1325 printk(KERN_INFO PFX "flatpanel support enabled\n");
1326 par->FPDither = fpdither;
1328 par->CRTCnumber = forceCRTC;
1329 par->FpScale = (!noscale);
1330 par->paneltweak = paneltweak;
1331 par->reverse_i2c = reverse_i2c;
1333 /* enable IO and mem if not already done */
1334 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1335 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1336 pci_write_config_word(pd, PCI_COMMAND, cmd);
1338 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1339 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1340 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1342 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1344 if (!par->REGS) {
1345 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1346 goto err_out_free_base0;
1349 par->Chipset = nvidia_get_chipset(info);
1350 par->Architecture = nvidia_get_arch(info);
1352 if (par->Architecture == 0) {
1353 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1354 goto err_out_arch;
1357 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1359 if (NVCommonSetup(info))
1360 goto err_out_arch;
1362 par->FbAddress = nvidiafb_fix.smem_start;
1363 par->FbMapSize = par->RamAmountKBytes * 1024;
1364 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1365 par->FbMapSize = vram * 1024 * 1024;
1367 /* Limit amount of vram to 64 MB */
1368 if (par->FbMapSize > 64 * 1024 * 1024)
1369 par->FbMapSize = 64 * 1024 * 1024;
1371 if(par->Architecture >= NV_ARCH_40)
1372 par->FbUsableSize = par->FbMapSize - (560 * 1024);
1373 else
1374 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1375 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1376 16 * 1024;
1377 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1378 par->CursorStart = par->FbUsableSize + (32 * 1024);
1380 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1381 info->screen_size = par->FbUsableSize;
1382 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1384 if (!info->screen_base) {
1385 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1386 goto err_out_free_base1;
1389 par->FbStart = info->screen_base;
1391 #ifdef CONFIG_MTRR
1392 if (!nomtrr) {
1393 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1394 par->RamAmountKBytes * 1024,
1395 MTRR_TYPE_WRCOMB, 1);
1396 if (par->mtrr.vram < 0) {
1397 printk(KERN_ERR PFX "unable to setup MTRR\n");
1398 } else {
1399 par->mtrr.vram_valid = 1;
1400 /* let there be speed */
1401 printk(KERN_INFO PFX "MTRR set to ON\n");
1404 #endif /* CONFIG_MTRR */
1406 info->fbops = &nvidia_fb_ops;
1407 info->fix = nvidiafb_fix;
1409 if (nvidia_set_fbinfo(info) < 0) {
1410 printk(KERN_ERR PFX "error setting initial video mode\n");
1411 goto err_out_iounmap_fb;
1414 nvidia_save_vga(par, &par->SavedReg);
1416 pci_set_drvdata(pd, info);
1418 if (backlight)
1419 nvidia_bl_init(par);
1421 if (register_framebuffer(info) < 0) {
1422 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1423 goto err_out_iounmap_fb;
1427 printk(KERN_INFO PFX
1428 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1429 info->fix.id,
1430 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1432 NVTRACE_LEAVE();
1433 return 0;
1435 err_out_iounmap_fb:
1436 iounmap(info->screen_base);
1437 err_out_free_base1:
1438 fb_destroy_modedb(info->monspecs.modedb);
1439 nvidia_delete_i2c_busses(par);
1440 err_out_arch:
1441 iounmap(par->REGS);
1442 err_out_free_base0:
1443 pci_release_regions(pd);
1444 err_out_enable:
1445 kfree(info->pixmap.addr);
1446 err_out_kfree:
1447 framebuffer_release(info);
1448 err_out:
1449 return -ENODEV;
1452 static void __devexit nvidiafb_remove(struct pci_dev *pd)
1454 struct fb_info *info = pci_get_drvdata(pd);
1455 struct nvidia_par *par = info->par;
1457 NVTRACE_ENTER();
1459 unregister_framebuffer(info);
1461 nvidia_bl_exit(par);
1463 #ifdef CONFIG_MTRR
1464 if (par->mtrr.vram_valid)
1465 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1466 info->fix.smem_len);
1467 #endif /* CONFIG_MTRR */
1469 iounmap(info->screen_base);
1470 fb_destroy_modedb(info->monspecs.modedb);
1471 nvidia_delete_i2c_busses(par);
1472 iounmap(par->REGS);
1473 pci_release_regions(pd);
1474 kfree(info->pixmap.addr);
1475 framebuffer_release(info);
1476 pci_set_drvdata(pd, NULL);
1477 NVTRACE_LEAVE();
1480 /* ------------------------------------------------------------------------- *
1482 * initialization
1484 * ------------------------------------------------------------------------- */
1486 #ifndef MODULE
1487 static int __devinit nvidiafb_setup(char *options)
1489 char *this_opt;
1491 NVTRACE_ENTER();
1492 if (!options || !*options)
1493 return 0;
1495 while ((this_opt = strsep(&options, ",")) != NULL) {
1496 if (!strncmp(this_opt, "forceCRTC", 9)) {
1497 char *p;
1499 p = this_opt + 9;
1500 if (!*p || !*(++p))
1501 continue;
1502 forceCRTC = *p - '0';
1503 if (forceCRTC < 0 || forceCRTC > 1)
1504 forceCRTC = -1;
1505 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1506 flatpanel = 1;
1507 } else if (!strncmp(this_opt, "hwcur", 5)) {
1508 hwcur = 1;
1509 } else if (!strncmp(this_opt, "noaccel", 6)) {
1510 noaccel = 1;
1511 } else if (!strncmp(this_opt, "noscale", 7)) {
1512 noscale = 1;
1513 } else if (!strncmp(this_opt, "reverse_i2c", 11)) {
1514 reverse_i2c = 1;
1515 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1516 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1517 } else if (!strncmp(this_opt, "vram:", 5)) {
1518 vram = simple_strtoul(this_opt+5, NULL, 0);
1519 } else if (!strncmp(this_opt, "backlight:", 10)) {
1520 backlight = simple_strtoul(this_opt+10, NULL, 0);
1521 #ifdef CONFIG_MTRR
1522 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1523 nomtrr = 1;
1524 #endif
1525 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1526 fpdither = simple_strtol(this_opt+9, NULL, 0);
1527 } else if (!strncmp(this_opt, "bpp:", 4)) {
1528 bpp = simple_strtoul(this_opt+4, NULL, 0);
1529 } else
1530 mode_option = this_opt;
1532 NVTRACE_LEAVE();
1533 return 0;
1535 #endif /* !MODULE */
1537 static struct pci_driver nvidiafb_driver = {
1538 .name = "nvidiafb",
1539 .id_table = nvidiafb_pci_tbl,
1540 .probe = nvidiafb_probe,
1541 .suspend = nvidiafb_suspend,
1542 .resume = nvidiafb_resume,
1543 .remove = __devexit_p(nvidiafb_remove),
1546 /* ------------------------------------------------------------------------- *
1548 * modularization
1550 * ------------------------------------------------------------------------- */
1552 static int __devinit nvidiafb_init(void)
1554 #ifndef MODULE
1555 char *option = NULL;
1557 if (fb_get_options("nvidiafb", &option))
1558 return -ENODEV;
1559 nvidiafb_setup(option);
1560 #endif
1561 return pci_register_driver(&nvidiafb_driver);
1564 module_init(nvidiafb_init);
1566 #ifdef MODULE
1567 static void __exit nvidiafb_exit(void)
1569 pci_unregister_driver(&nvidiafb_driver);
1572 module_exit(nvidiafb_exit);
1574 module_param(flatpanel, int, 0);
1575 MODULE_PARM_DESC(flatpanel,
1576 "Enables experimental flat panel support for some chipsets. "
1577 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1578 module_param(fpdither, int, 0);
1579 MODULE_PARM_DESC(fpdither,
1580 "Enables dithering of flat panel for 6 bits panels. "
1581 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1582 module_param(hwcur, int, 0);
1583 MODULE_PARM_DESC(hwcur,
1584 "Enables hardware cursor implementation. (0 or 1=enabled) "
1585 "(default=0)");
1586 module_param(noaccel, int, 0);
1587 MODULE_PARM_DESC(noaccel,
1588 "Disables hardware acceleration. (0 or 1=disable) "
1589 "(default=0)");
1590 module_param(noscale, int, 0);
1591 MODULE_PARM_DESC(noscale,
1592 "Disables screen scaleing. (0 or 1=disable) "
1593 "(default=0, do scaling)");
1594 module_param(paneltweak, int, 0);
1595 MODULE_PARM_DESC(paneltweak,
1596 "Tweak display settings for flatpanels. "
1597 "(default=0, no tweaks)");
1598 module_param(forceCRTC, int, 0);
1599 MODULE_PARM_DESC(forceCRTC,
1600 "Forces usage of a particular CRTC in case autodetection "
1601 "fails. (0 or 1) (default=autodetect)");
1602 module_param(vram, int, 0);
1603 MODULE_PARM_DESC(vram,
1604 "amount of framebuffer memory to remap in MiB"
1605 "(default=0 - remap entire memory)");
1606 module_param(mode_option, charp, 0);
1607 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1608 module_param(bpp, int, 0);
1609 MODULE_PARM_DESC(bpp, "pixel width in bits"
1610 "(default=8)");
1611 module_param(reverse_i2c, int, 0);
1612 MODULE_PARM_DESC(reverse_i2c, "reverse port assignment of the i2c bus");
1613 #ifdef CONFIG_MTRR
1614 module_param(nomtrr, bool, 0);
1615 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1616 "(default=0)");
1617 #endif
1619 MODULE_AUTHOR("Antonino Daplas");
1620 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1621 MODULE_LICENSE("GPL");
1622 #endif /* MODULE */