linux/drivers/video/fbdev/nvidia/nvidia.c
<<
>>
Prefs
   1/*
   2 * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver
   3 *
   4 * Copyright 2004 Antonino Daplas <adaplas@pol.net>
   5 *
   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.
   9 *
  10 */
  11
  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_BOOTX_TEXT
  25#include <asm/btext.h>
  26#endif
  27
  28#include "nv_local.h"
  29#include "nv_type.h"
  30#include "nv_proto.h"
  31#include "nv_dma.h"
  32
  33#ifdef CONFIG_FB_NVIDIA_DEBUG
  34#define NVTRACE          printk
  35#else
  36#define NVTRACE          if (0) printk
  37#endif
  38
  39#define NVTRACE_ENTER(...)  NVTRACE("%s START\n", __func__)
  40#define NVTRACE_LEAVE(...)  NVTRACE("%s END\n", __func__)
  41
  42#ifdef CONFIG_FB_NVIDIA_DEBUG
  43#define assert(expr) \
  44        if (!(expr)) { \
  45        printk( "Assertion failed! %s,%s,%s,line=%d\n",\
  46        #expr,__FILE__,__func__,__LINE__); \
  47        BUG(); \
  48        }
  49#else
  50#define assert(expr)
  51#endif
  52
  53#define PFX "nvidiafb: "
  54
  55/* HW cursor parameters */
  56#define MAX_CURS                32
  57
  58static const struct pci_device_id nvidiafb_pci_tbl[] = {
  59        {PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
  60         PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0},
  61        { 0, }
  62};
  63MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
  64
  65/* command line data, set in nvidiafb_setup() */
  66static int flatpanel = -1;      /* Autodetect later */
  67static int fpdither = -1;
  68static int forceCRTC = -1;
  69static int hwcur = 0;
  70static int noaccel = 0;
  71static int noscale = 0;
  72static int paneltweak = 0;
  73static int vram = 0;
  74static int bpp = 8;
  75static int reverse_i2c;
  76static bool nomtrr = false;
  77#ifdef CONFIG_PMAC_BACKLIGHT
  78static int backlight = 1;
  79#else
  80static int backlight = 0;
  81#endif
  82
  83static char *mode_option = NULL;
  84
  85static struct fb_fix_screeninfo nvidiafb_fix = {
  86        .type = FB_TYPE_PACKED_PIXELS,
  87        .xpanstep = 8,
  88        .ypanstep = 1,
  89};
  90
  91static struct fb_var_screeninfo nvidiafb_default_var = {
  92        .xres = 640,
  93        .yres = 480,
  94        .xres_virtual = 640,
  95        .yres_virtual = 480,
  96        .bits_per_pixel = 8,
  97        .red = {0, 8, 0},
  98        .green = {0, 8, 0},
  99        .blue = {0, 8, 0},
 100        .transp = {0, 0, 0},
 101        .activate = FB_ACTIVATE_NOW,
 102        .height = -1,
 103        .width = -1,
 104        .pixclock = 39721,
 105        .left_margin = 40,
 106        .right_margin = 24,
 107        .upper_margin = 32,
 108        .lower_margin = 11,
 109        .hsync_len = 96,
 110        .vsync_len = 2,
 111        .vmode = FB_VMODE_NONINTERLACED
 112};
 113
 114static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
 115                                       u16 bg, u16 fg, u32 w, u32 h)
 116{
 117        u32 *data = (u32 *) data8;
 118        int i, j, k = 0;
 119        u32 b, tmp;
 120
 121        w = (w + 1) & ~1;
 122
 123        for (i = 0; i < h; i++) {
 124                b = *data++;
 125                reverse_order(&b);
 126
 127                for (j = 0; j < w / 2; j++) {
 128                        tmp = 0;
 129#if defined (__BIG_ENDIAN)
 130                        tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
 131                        b <<= 1;
 132                        tmp |= (b & (1 << 31)) ? fg : bg;
 133                        b <<= 1;
 134#else
 135                        tmp = (b & 1) ? fg : bg;
 136                        b >>= 1;
 137                        tmp |= (b & 1) ? fg << 16 : bg << 16;
 138                        b >>= 1;
 139#endif
 140                        NV_WR32(&par->CURSOR[k++], 0, tmp);
 141                }
 142                k += (MAX_CURS - w) / 2;
 143        }
 144}
 145
 146static void nvidia_write_clut(struct nvidia_par *par,
 147                              u8 regnum, u8 red, u8 green, u8 blue)
 148{
 149        NVWriteDacMask(par, 0xff);
 150        NVWriteDacWriteAddr(par, regnum);
 151        NVWriteDacData(par, red);
 152        NVWriteDacData(par, green);
 153        NVWriteDacData(par, blue);
 154}
 155
 156static void nvidia_read_clut(struct nvidia_par *par,
 157                             u8 regnum, u8 * red, u8 * green, u8 * blue)
 158{
 159        NVWriteDacMask(par, 0xff);
 160        NVWriteDacReadAddr(par, regnum);
 161        *red = NVReadDacData(par);
 162        *green = NVReadDacData(par);
 163        *blue = NVReadDacData(par);
 164}
 165
 166static int nvidia_panel_tweak(struct nvidia_par *par,
 167                              struct _riva_hw_state *state)
 168{
 169        int tweak = 0;
 170
 171   if (par->paneltweak) {
 172           tweak = par->paneltweak;
 173   } else {
 174           /* begin flat panel hacks */
 175           /* This is unfortunate, but some chips need this register
 176              tweaked or else you get artifacts where adjacent pixels are
 177              swapped.  There are no hard rules for what to set here so all
 178              we can do is experiment and apply hacks. */
 179
 180           if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
 181                   /* At least one NV34 laptop needs this workaround. */
 182                   tweak = -1;
 183           }
 184
 185           if((par->Chipset & 0xfff0) == 0x0310) {
 186                   tweak = 1;
 187           }
 188           /* end flat panel hacks */
 189   }
 190
 191   return tweak;
 192}
 193
 194static void nvidia_screen_off(struct nvidia_par *par, int on)
 195{
 196        unsigned char tmp;
 197
 198        if (on) {
 199                /*
 200                 * Turn off screen and disable sequencer.
 201                 */
 202                tmp = NVReadSeq(par, 0x01);
 203
 204                NVWriteSeq(par, 0x00, 0x01);            /* Synchronous Reset */
 205                NVWriteSeq(par, 0x01, tmp | 0x20);      /* disable the display */
 206        } else {
 207                /*
 208                 * Reenable sequencer, then turn on screen.
 209                 */
 210
 211                tmp = NVReadSeq(par, 0x01);
 212
 213                NVWriteSeq(par, 0x01, tmp & ~0x20);     /* reenable display */
 214                NVWriteSeq(par, 0x00, 0x03);            /* End Reset */
 215        }
 216}
 217
 218static void nvidia_save_vga(struct nvidia_par *par,
 219                            struct _riva_hw_state *state)
 220{
 221        int i;
 222
 223        NVTRACE_ENTER();
 224        NVLockUnlock(par, 0);
 225
 226        NVUnloadStateExt(par, state);
 227
 228        state->misc_output = NVReadMiscOut(par);
 229
 230        for (i = 0; i < NUM_CRT_REGS; i++)
 231                state->crtc[i] = NVReadCrtc(par, i);
 232
 233        for (i = 0; i < NUM_ATC_REGS; i++)
 234                state->attr[i] = NVReadAttr(par, i);
 235
 236        for (i = 0; i < NUM_GRC_REGS; i++)
 237                state->gra[i] = NVReadGr(par, i);
 238
 239        for (i = 0; i < NUM_SEQ_REGS; i++)
 240                state->seq[i] = NVReadSeq(par, i);
 241        NVTRACE_LEAVE();
 242}
 243
 244#undef DUMP_REG
 245
 246static void nvidia_write_regs(struct nvidia_par *par,
 247                              struct _riva_hw_state *state)
 248{
 249        int i;
 250
 251        NVTRACE_ENTER();
 252
 253        NVLoadStateExt(par, state);
 254
 255        NVWriteMiscOut(par, state->misc_output);
 256
 257        for (i = 1; i < NUM_SEQ_REGS; i++) {
 258#ifdef DUMP_REG
 259                printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
 260#endif
 261                NVWriteSeq(par, i, state->seq[i]);
 262        }
 263
 264        /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
 265        NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
 266
 267        for (i = 0; i < NUM_CRT_REGS; i++) {
 268                switch (i) {
 269                case 0x19:
 270                case 0x20 ... 0x40:
 271                        break;
 272                default:
 273#ifdef DUMP_REG
 274                        printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
 275#endif
 276                        NVWriteCrtc(par, i, state->crtc[i]);
 277                }
 278        }
 279
 280        for (i = 0; i < NUM_GRC_REGS; i++) {
 281#ifdef DUMP_REG
 282                printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
 283#endif
 284                NVWriteGr(par, i, state->gra[i]);
 285        }
 286
 287        for (i = 0; i < NUM_ATC_REGS; i++) {
 288#ifdef DUMP_REG
 289                printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
 290#endif
 291                NVWriteAttr(par, i, state->attr[i]);
 292        }
 293
 294        NVTRACE_LEAVE();
 295}
 296
 297static int nvidia_calc_regs(struct fb_info *info)
 298{
 299        struct nvidia_par *par = info->par;
 300        struct _riva_hw_state *state = &par->ModeReg;
 301        int i, depth = fb_get_color_depth(&info->var, &info->fix);
 302        int h_display = info->var.xres / 8 - 1;
 303        int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
 304        int h_end = (info->var.xres + info->var.right_margin +
 305                     info->var.hsync_len) / 8 - 1;
 306        int h_total = (info->var.xres + info->var.right_margin +
 307                       info->var.hsync_len + info->var.left_margin) / 8 - 5;
 308        int h_blank_s = h_display;
 309        int h_blank_e = h_total + 4;
 310        int v_display = info->var.yres - 1;
 311        int v_start = info->var.yres + info->var.lower_margin - 1;
 312        int v_end = (info->var.yres + info->var.lower_margin +
 313                     info->var.vsync_len) - 1;
 314        int v_total = (info->var.yres + info->var.lower_margin +
 315                       info->var.vsync_len + info->var.upper_margin) - 2;
 316        int v_blank_s = v_display;
 317        int v_blank_e = v_total + 1;
 318
 319        /*
 320         * Set all CRTC values.
 321         */
 322
 323        if (info->var.vmode & FB_VMODE_INTERLACED)
 324                v_total |= 1;
 325
 326        if (par->FlatPanel == 1) {
 327                v_start = v_total - 3;
 328                v_end = v_total - 2;
 329                v_blank_s = v_start;
 330                h_start = h_total - 5;
 331                h_end = h_total - 2;
 332                h_blank_e = h_total + 4;
 333        }
 334
 335        state->crtc[0x0] = Set8Bits(h_total);
 336        state->crtc[0x1] = Set8Bits(h_display);
 337        state->crtc[0x2] = Set8Bits(h_blank_s);
 338        state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
 339                | SetBit(7);
 340        state->crtc[0x4] = Set8Bits(h_start);
 341        state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
 342                | SetBitField(h_end, 4: 0, 4:0);
 343        state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
 344        state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
 345                | SetBitField(v_display, 8: 8, 1:1)
 346                | SetBitField(v_start, 8: 8, 2:2)
 347                | SetBitField(v_blank_s, 8: 8, 3:3)
 348                | SetBit(4)
 349                | SetBitField(v_total, 9: 9, 5:5)
 350                | SetBitField(v_display, 9: 9, 6:6)
 351                | SetBitField(v_start, 9: 9, 7:7);
 352        state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
 353                | SetBit(6)
 354                | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
 355        state->crtc[0x10] = Set8Bits(v_start);
 356        state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
 357        state->crtc[0x12] = Set8Bits(v_display);
 358        state->crtc[0x13] = ((info->var.xres_virtual / 8) *
 359                             (info->var.bits_per_pixel / 8));
 360        state->crtc[0x15] = Set8Bits(v_blank_s);
 361        state->crtc[0x16] = Set8Bits(v_blank_e);
 362
 363        state->attr[0x10] = 0x01;
 364
 365        if (par->Television)
 366                state->attr[0x11] = 0x00;
 367
 368        state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
 369                | SetBitField(v_blank_s, 10: 10, 3:3)
 370                | SetBitField(v_start, 10: 10, 2:2)
 371                | SetBitField(v_display, 10: 10, 1:1)
 372                | SetBitField(v_total, 10: 10, 0:0);
 373
 374        state->horiz = SetBitField(h_total, 8: 8, 0:0)
 375                | SetBitField(h_display, 8: 8, 1:1)
 376                | SetBitField(h_blank_s, 8: 8, 2:2)
 377                | SetBitField(h_start, 8: 8, 3:3);
 378
 379        state->extra = SetBitField(v_total, 11: 11, 0:0)
 380                | SetBitField(v_display, 11: 11, 2:2)
 381                | SetBitField(v_start, 11: 11, 4:4)
 382                | SetBitField(v_blank_s, 11: 11, 6:6);
 383
 384        if (info->var.vmode & FB_VMODE_INTERLACED) {
 385                h_total = (h_total >> 1) & ~1;
 386                state->interlace = Set8Bits(h_total);
 387                state->horiz |= SetBitField(h_total, 8: 8, 4:4);
 388        } else {
 389                state->interlace = 0xff;        /* interlace off */
 390        }
 391
 392        /*
 393         * Calculate the extended registers.
 394         */
 395
 396        if (depth < 24)
 397                i = depth;
 398        else
 399                i = 32;
 400
 401        if (par->Architecture >= NV_ARCH_10)
 402                par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
 403                                                       par->CursorStart);
 404
 405        if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
 406                state->misc_output &= ~0x40;
 407        else
 408                state->misc_output |= 0x40;
 409        if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
 410                state->misc_output &= ~0x80;
 411        else
 412                state->misc_output |= 0x80;
 413
 414        NVCalcStateExt(par, state, i, info->var.xres_virtual,
 415                       info->var.xres, info->var.yres_virtual,
 416                       1000000000 / info->var.pixclock, info->var.vmode);
 417
 418        state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
 419        if (par->FlatPanel == 1) {
 420                state->pixel |= (1 << 7);
 421
 422                if (!par->fpScaler || (par->fpWidth <= info->var.xres)
 423                    || (par->fpHeight <= info->var.yres)) {
 424                        state->scale |= (1 << 8);
 425                }
 426
 427                if (!par->crtcSync_read) {
 428                        state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
 429                        par->crtcSync_read = 1;
 430                }
 431
 432                par->PanelTweak = nvidia_panel_tweak(par, state);
 433        }
 434
 435        state->vpll = state->pll;
 436        state->vpll2 = state->pll;
 437        state->vpllB = state->pllB;
 438        state->vpll2B = state->pllB;
 439
 440        VGA_WR08(par->PCIO, 0x03D4, 0x1C);
 441        state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
 442
 443        if (par->CRTCnumber) {
 444                state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
 445                state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
 446                state->crtcOwner = 3;
 447                state->pllsel |= 0x20000800;
 448                state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
 449                if (par->twoStagePLL)
 450                        state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
 451        } else if (par->twoHeads) {
 452                state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
 453                state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
 454                state->crtcOwner = 0;
 455                state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
 456                if (par->twoStagePLL)
 457                        state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
 458        }
 459
 460        state->cursorConfig = 0x00000100;
 461
 462        if (info->var.vmode & FB_VMODE_DOUBLE)
 463                state->cursorConfig |= (1 << 4);
 464
 465        if (par->alphaCursor) {
 466                if ((par->Chipset & 0x0ff0) != 0x0110)
 467                        state->cursorConfig |= 0x04011000;
 468                else
 469                        state->cursorConfig |= 0x14011000;
 470                state->general |= (1 << 29);
 471        } else
 472                state->cursorConfig |= 0x02000000;
 473
 474        if (par->twoHeads) {
 475                if ((par->Chipset & 0x0ff0) == 0x0110) {
 476                        state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
 477                            ~0x00010000;
 478                        if (par->FPDither)
 479                                state->dither |= 0x00010000;
 480                } else {
 481                        state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
 482                        if (par->FPDither)
 483                                state->dither |= 1;
 484                }
 485        }
 486
 487        state->timingH = 0;
 488        state->timingV = 0;
 489        state->displayV = info->var.xres;
 490
 491        return 0;
 492}
 493
 494static void nvidia_init_vga(struct fb_info *info)
 495{
 496        struct nvidia_par *par = info->par;
 497        struct _riva_hw_state *state = &par->ModeReg;
 498        int i;
 499
 500        for (i = 0; i < 0x10; i++)
 501                state->attr[i] = i;
 502        state->attr[0x10] = 0x41;
 503        state->attr[0x11] = 0xff;
 504        state->attr[0x12] = 0x0f;
 505        state->attr[0x13] = 0x00;
 506        state->attr[0x14] = 0x00;
 507
 508        memset(state->crtc, 0x00, NUM_CRT_REGS);
 509        state->crtc[0x0a] = 0x20;
 510        state->crtc[0x17] = 0xe3;
 511        state->crtc[0x18] = 0xff;
 512        state->crtc[0x28] = 0x40;
 513
 514        memset(state->gra, 0x00, NUM_GRC_REGS);
 515        state->gra[0x05] = 0x40;
 516        state->gra[0x06] = 0x05;
 517        state->gra[0x07] = 0x0f;
 518        state->gra[0x08] = 0xff;
 519
 520        state->seq[0x00] = 0x03;
 521        state->seq[0x01] = 0x01;
 522        state->seq[0x02] = 0x0f;
 523        state->seq[0x03] = 0x00;
 524        state->seq[0x04] = 0x0e;
 525
 526        state->misc_output = 0xeb;
 527}
 528
 529static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 530{
 531        struct nvidia_par *par = info->par;
 532        u8 data[MAX_CURS * MAX_CURS / 8];
 533        int i, set = cursor->set;
 534        u16 fg, bg;
 535
 536        if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
 537                return -ENXIO;
 538
 539        NVShowHideCursor(par, 0);
 540
 541        if (par->cursor_reset) {
 542                set = FB_CUR_SETALL;
 543                par->cursor_reset = 0;
 544        }
 545
 546        if (set & FB_CUR_SETSIZE)
 547                memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
 548
 549        if (set & FB_CUR_SETPOS) {
 550                u32 xx, yy, temp;
 551
 552                yy = cursor->image.dy - info->var.yoffset;
 553                xx = cursor->image.dx - info->var.xoffset;
 554                temp = xx & 0xFFFF;
 555                temp |= yy << 16;
 556
 557                NV_WR32(par->PRAMDAC, 0x0000300, temp);
 558        }
 559
 560        if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
 561                u32 bg_idx = cursor->image.bg_color;
 562                u32 fg_idx = cursor->image.fg_color;
 563                u32 s_pitch = (cursor->image.width + 7) >> 3;
 564                u32 d_pitch = MAX_CURS / 8;
 565                u8 *dat = (u8 *) cursor->image.data;
 566                u8 *msk = (u8 *) cursor->mask;
 567                u8 *src;
 568
 569                src = kmalloc_array(s_pitch, cursor->image.height, GFP_ATOMIC);
 570
 571                if (src) {
 572                        switch (cursor->rop) {
 573                        case ROP_XOR:
 574                                for (i = 0; i < s_pitch * cursor->image.height; i++)
 575                                        src[i] = dat[i] ^ msk[i];
 576                                break;
 577                        case ROP_COPY:
 578                        default:
 579                                for (i = 0; i < s_pitch * cursor->image.height; i++)
 580                                        src[i] = dat[i] & msk[i];
 581                                break;
 582                        }
 583
 584                        fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
 585                                                cursor->image.height);
 586
 587                        bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
 588                            ((info->cmap.green[bg_idx] & 0xf8) << 2) |
 589                            ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
 590
 591                        fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
 592                            ((info->cmap.green[fg_idx] & 0xf8) << 2) |
 593                            ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
 594
 595                        NVLockUnlock(par, 0);
 596
 597                        nvidiafb_load_cursor_image(par, data, bg, fg,
 598                                                   cursor->image.width,
 599                                                   cursor->image.height);
 600                        kfree(src);
 601                }
 602        }
 603
 604        if (cursor->enable)
 605                NVShowHideCursor(par, 1);
 606
 607        return 0;
 608}
 609
 610static int nvidiafb_set_par(struct fb_info *info)
 611{
 612        struct nvidia_par *par = info->par;
 613
 614        NVTRACE_ENTER();
 615
 616        NVLockUnlock(par, 1);
 617        if (!par->FlatPanel || !par->twoHeads)
 618                par->FPDither = 0;
 619
 620        if (par->FPDither < 0) {
 621                if ((par->Chipset & 0x0ff0) == 0x0110)
 622                        par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
 623                                           & 0x00010000);
 624                else
 625                        par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
 626                printk(KERN_INFO PFX "Flat panel dithering %s\n",
 627                       par->FPDither ? "enabled" : "disabled");
 628        }
 629
 630        info->fix.visual = (info->var.bits_per_pixel == 8) ?
 631            FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
 632
 633        nvidia_init_vga(info);
 634        nvidia_calc_regs(info);
 635
 636        NVLockUnlock(par, 0);
 637        if (par->twoHeads) {
 638                VGA_WR08(par->PCIO, 0x03D4, 0x44);
 639                VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
 640                NVLockUnlock(par, 0);
 641        }
 642
 643        nvidia_screen_off(par, 1);
 644
 645        nvidia_write_regs(par, &par->ModeReg);
 646        NVSetStartAddress(par, 0);
 647
 648#if defined (__BIG_ENDIAN)
 649        /* turn on LFB swapping */
 650        {
 651                unsigned char tmp;
 652
 653                VGA_WR08(par->PCIO, 0x3d4, 0x46);
 654                tmp = VGA_RD08(par->PCIO, 0x3d5);
 655                tmp |= (1 << 7);
 656                VGA_WR08(par->PCIO, 0x3d5, tmp);
 657    }
 658#endif
 659
 660        info->fix.line_length = (info->var.xres_virtual *
 661                                 info->var.bits_per_pixel) >> 3;
 662        if (info->var.accel_flags) {
 663                info->fbops->fb_imageblit = nvidiafb_imageblit;
 664                info->fbops->fb_fillrect = nvidiafb_fillrect;
 665                info->fbops->fb_copyarea = nvidiafb_copyarea;
 666                info->fbops->fb_sync = nvidiafb_sync;
 667                info->pixmap.scan_align = 4;
 668                info->flags &= ~FBINFO_HWACCEL_DISABLED;
 669                info->flags |= FBINFO_READS_FAST;
 670                NVResetGraphics(info);
 671        } else {
 672                info->fbops->fb_imageblit = cfb_imageblit;
 673                info->fbops->fb_fillrect = cfb_fillrect;
 674                info->fbops->fb_copyarea = cfb_copyarea;
 675                info->fbops->fb_sync = NULL;
 676                info->pixmap.scan_align = 1;
 677                info->flags |= FBINFO_HWACCEL_DISABLED;
 678                info->flags &= ~FBINFO_READS_FAST;
 679        }
 680
 681        par->cursor_reset = 1;
 682
 683        nvidia_screen_off(par, 0);
 684
 685#ifdef CONFIG_BOOTX_TEXT
 686        /* Update debug text engine */
 687        btext_update_display(info->fix.smem_start,
 688                             info->var.xres, info->var.yres,
 689                             info->var.bits_per_pixel, info->fix.line_length);
 690#endif
 691
 692        NVLockUnlock(par, 0);
 693        NVTRACE_LEAVE();
 694        return 0;
 695}
 696
 697static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
 698                              unsigned blue, unsigned transp,
 699                              struct fb_info *info)
 700{
 701        struct nvidia_par *par = info->par;
 702        int i;
 703
 704        NVTRACE_ENTER();
 705        if (regno >= (1 << info->var.green.length))
 706                return -EINVAL;
 707
 708        if (info->var.grayscale) {
 709                /* gray = 0.30*R + 0.59*G + 0.11*B */
 710                red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
 711        }
 712
 713        if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
 714                ((u32 *) info->pseudo_palette)[regno] =
 715                    (regno << info->var.red.offset) |
 716                    (regno << info->var.green.offset) |
 717                    (regno << info->var.blue.offset);
 718        }
 719
 720        switch (info->var.bits_per_pixel) {
 721        case 8:
 722                /* "transparent" stuff is completely ignored. */
 723                nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
 724                break;
 725        case 16:
 726                if (info->var.green.length == 5) {
 727                        for (i = 0; i < 8; i++) {
 728                                nvidia_write_clut(par, regno * 8 + i, red >> 8,
 729                                                  green >> 8, blue >> 8);
 730                        }
 731                } else {
 732                        u8 r, g, b;
 733
 734                        if (regno < 32) {
 735                                for (i = 0; i < 8; i++) {
 736                                        nvidia_write_clut(par, regno * 8 + i,
 737                                                          red >> 8, green >> 8,
 738                                                          blue >> 8);
 739                                }
 740                        }
 741
 742                        nvidia_read_clut(par, regno * 4, &r, &g, &b);
 743
 744                        for (i = 0; i < 4; i++)
 745                                nvidia_write_clut(par, regno * 4 + i, r,
 746                                                  green >> 8, b);
 747                }
 748                break;
 749        case 32:
 750                nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
 751                break;
 752        default:
 753                /* do nothing */
 754                break;
 755        }
 756
 757        NVTRACE_LEAVE();
 758        return 0;
 759}
 760
 761static int nvidiafb_check_var(struct fb_var_screeninfo *var,
 762                              struct fb_info *info)
 763{
 764        struct nvidia_par *par = info->par;
 765        int memlen, vramlen, mode_valid = 0;
 766        int pitch, err = 0;
 767
 768        NVTRACE_ENTER();
 769
 770        var->transp.offset = 0;
 771        var->transp.length = 0;
 772
 773        var->xres &= ~7;
 774
 775        if (var->bits_per_pixel <= 8)
 776                var->bits_per_pixel = 8;
 777        else if (var->bits_per_pixel <= 16)
 778                var->bits_per_pixel = 16;
 779        else
 780                var->bits_per_pixel = 32;
 781
 782        switch (var->bits_per_pixel) {
 783        case 8:
 784                var->red.offset = 0;
 785                var->red.length = 8;
 786                var->green.offset = 0;
 787                var->green.length = 8;
 788                var->blue.offset = 0;
 789                var->blue.length = 8;
 790                var->transp.offset = 0;
 791                var->transp.length = 0;
 792                break;
 793        case 16:
 794                var->green.length = (var->green.length < 6) ? 5 : 6;
 795                var->red.length = 5;
 796                var->blue.length = 5;
 797                var->transp.length = 6 - var->green.length;
 798                var->blue.offset = 0;
 799                var->green.offset = 5;
 800                var->red.offset = 5 + var->green.length;
 801                var->transp.offset = (5 + var->red.offset) & 15;
 802                break;
 803        case 32:                /* RGBA 8888 */
 804                var->red.offset = 16;
 805                var->red.length = 8;
 806                var->green.offset = 8;
 807                var->green.length = 8;
 808                var->blue.offset = 0;
 809                var->blue.length = 8;
 810                var->transp.length = 8;
 811                var->transp.offset = 24;
 812                break;
 813        }
 814
 815        var->red.msb_right = 0;
 816        var->green.msb_right = 0;
 817        var->blue.msb_right = 0;
 818        var->transp.msb_right = 0;
 819
 820        if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
 821            !info->monspecs.dclkmax || !fb_validate_mode(var, info))
 822                mode_valid = 1;
 823
 824        /* calculate modeline if supported by monitor */
 825        if (!mode_valid && info->monspecs.gtf) {
 826                if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
 827                        mode_valid = 1;
 828        }
 829
 830        if (!mode_valid) {
 831                const struct fb_videomode *mode;
 832
 833                mode = fb_find_best_mode(var, &info->modelist);
 834                if (mode) {
 835                        fb_videomode_to_var(var, mode);
 836                        mode_valid = 1;
 837                }
 838        }
 839
 840        if (!mode_valid && info->monspecs.modedb_len)
 841                return -EINVAL;
 842
 843        /*
 844         * If we're on a flat panel, check if the mode is outside of the
 845         * panel dimensions. If so, cap it and try for the next best mode
 846         * before bailing out.
 847         */
 848        if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
 849                                              par->fpHeight < var->yres)) {
 850                const struct fb_videomode *mode;
 851
 852                var->xres = par->fpWidth;
 853                var->yres = par->fpHeight;
 854
 855                mode = fb_find_best_mode(var, &info->modelist);
 856                if (!mode) {
 857                        printk(KERN_ERR PFX "mode out of range of flat "
 858                               "panel dimensions\n");
 859                        return -EINVAL;
 860                }
 861
 862                fb_videomode_to_var(var, mode);
 863        }
 864
 865        if (var->yres_virtual < var->yres)
 866                var->yres_virtual = var->yres;
 867
 868        if (var->xres_virtual < var->xres)
 869                var->xres_virtual = var->xres;
 870
 871        var->xres_virtual = (var->xres_virtual + 63) & ~63;
 872
 873        vramlen = info->screen_size;
 874        pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
 875        memlen = pitch * var->yres_virtual;
 876
 877        if (memlen > vramlen) {
 878                var->yres_virtual = vramlen / pitch;
 879
 880                if (var->yres_virtual < var->yres) {
 881                        var->yres_virtual = var->yres;
 882                        var->xres_virtual = vramlen / var->yres_virtual;
 883                        var->xres_virtual /= var->bits_per_pixel / 8;
 884                        var->xres_virtual &= ~63;
 885                        pitch = (var->xres_virtual *
 886                                 var->bits_per_pixel + 7) / 8;
 887                        memlen = pitch * var->yres;
 888
 889                        if (var->xres_virtual < var->xres) {
 890                                printk("nvidiafb: required video memory, "
 891                                       "%d bytes, for %dx%d-%d (virtual) "
 892                                       "is out of range\n",
 893                                       memlen, var->xres_virtual,
 894                                       var->yres_virtual, var->bits_per_pixel);
 895                                err = -ENOMEM;
 896                        }
 897                }
 898        }
 899
 900        if (var->accel_flags) {
 901                if (var->yres_virtual > 0x7fff)
 902                        var->yres_virtual = 0x7fff;
 903                if (var->xres_virtual > 0x7fff)
 904                        var->xres_virtual = 0x7fff;
 905        }
 906
 907        var->xres_virtual &= ~63;
 908
 909        NVTRACE_LEAVE();
 910
 911        return err;
 912}
 913
 914static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
 915                                struct fb_info *info)
 916{
 917        struct nvidia_par *par = info->par;
 918        u32 total;
 919
 920        total = var->yoffset * info->fix.line_length + var->xoffset;
 921
 922        NVSetStartAddress(par, total);
 923
 924        return 0;
 925}
 926
 927static int nvidiafb_blank(int blank, struct fb_info *info)
 928{
 929        struct nvidia_par *par = info->par;
 930        unsigned char tmp, vesa;
 931
 932        tmp = NVReadSeq(par, 0x01) & ~0x20;     /* screen on/off */
 933        vesa = NVReadCrtc(par, 0x1a) & ~0xc0;   /* sync on/off */
 934
 935        NVTRACE_ENTER();
 936
 937        if (blank)
 938                tmp |= 0x20;
 939
 940        switch (blank) {
 941        case FB_BLANK_UNBLANK:
 942        case FB_BLANK_NORMAL:
 943                break;
 944        case FB_BLANK_VSYNC_SUSPEND:
 945                vesa |= 0x80;
 946                break;
 947        case FB_BLANK_HSYNC_SUSPEND:
 948                vesa |= 0x40;
 949                break;
 950        case FB_BLANK_POWERDOWN:
 951                vesa |= 0xc0;
 952                break;
 953        }
 954
 955        NVWriteSeq(par, 0x01, tmp);
 956        NVWriteCrtc(par, 0x1a, vesa);
 957
 958        NVTRACE_LEAVE();
 959
 960        return 0;
 961}
 962
 963/*
 964 * Because the VGA registers are not mapped linearly in its MMIO space,
 965 * restrict VGA register saving and restore to x86 only, where legacy VGA IO
 966 * access is legal. Consequently, we must also check if the device is the
 967 * primary display.
 968 */
 969#ifdef CONFIG_X86
 970static void save_vga_x86(struct nvidia_par *par)
 971{
 972        struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE];
 973
 974        if (res && res->flags & IORESOURCE_ROM_SHADOW) {
 975                memset(&par->vgastate, 0, sizeof(par->vgastate));
 976                par->vgastate.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS |
 977                        VGA_SAVE_CMAP;
 978                save_vga(&par->vgastate);
 979        }
 980}
 981
 982static void restore_vga_x86(struct nvidia_par *par)
 983{
 984        struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE];
 985
 986        if (res && res->flags & IORESOURCE_ROM_SHADOW)
 987                restore_vga(&par->vgastate);
 988}
 989#else
 990#define save_vga_x86(x) do {} while (0)
 991#define restore_vga_x86(x) do {} while (0)
 992#endif /* X86 */
 993
 994static int nvidiafb_open(struct fb_info *info, int user)
 995{
 996        struct nvidia_par *par = info->par;
 997
 998        if (!par->open_count) {
 999                save_vga_x86(par);
1000                nvidia_save_vga(par, &par->initial_state);
1001        }
1002
1003        par->open_count++;
1004        return 0;
1005}
1006
1007static int nvidiafb_release(struct fb_info *info, int user)
1008{
1009        struct nvidia_par *par = info->par;
1010        int err = 0;
1011
1012        if (!par->open_count) {
1013                err = -EINVAL;
1014                goto done;
1015        }
1016
1017        if (par->open_count == 1) {
1018                nvidia_write_regs(par, &par->initial_state);
1019                restore_vga_x86(par);
1020        }
1021
1022        par->open_count--;
1023done:
1024        return err;
1025}
1026
1027static struct fb_ops nvidia_fb_ops = {
1028        .owner          = THIS_MODULE,
1029        .fb_open        = nvidiafb_open,
1030        .fb_release     = nvidiafb_release,
1031        .fb_check_var   = nvidiafb_check_var,
1032        .fb_set_par     = nvidiafb_set_par,
1033        .fb_setcolreg   = nvidiafb_setcolreg,
1034        .fb_pan_display = nvidiafb_pan_display,
1035        .fb_blank       = nvidiafb_blank,
1036        .fb_fillrect    = nvidiafb_fillrect,
1037        .fb_copyarea    = nvidiafb_copyarea,
1038        .fb_imageblit   = nvidiafb_imageblit,
1039        .fb_cursor      = nvidiafb_cursor,
1040        .fb_sync        = nvidiafb_sync,
1041};
1042
1043#ifdef CONFIG_PM
1044static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t mesg)
1045{
1046        struct fb_info *info = pci_get_drvdata(dev);
1047        struct nvidia_par *par = info->par;
1048
1049        if (mesg.event == PM_EVENT_PRETHAW)
1050                mesg.event = PM_EVENT_FREEZE;
1051        console_lock();
1052        par->pm_state = mesg.event;
1053
1054        if (mesg.event & PM_EVENT_SLEEP) {
1055                fb_set_suspend(info, 1);
1056                nvidiafb_blank(FB_BLANK_POWERDOWN, info);
1057                nvidia_write_regs(par, &par->SavedReg);
1058                pci_save_state(dev);
1059                pci_disable_device(dev);
1060                pci_set_power_state(dev, pci_choose_state(dev, mesg));
1061        }
1062        dev->dev.power.power_state = mesg;
1063
1064        console_unlock();
1065        return 0;
1066}
1067
1068static int nvidiafb_resume(struct pci_dev *dev)
1069{
1070        struct fb_info *info = pci_get_drvdata(dev);
1071        struct nvidia_par *par = info->par;
1072
1073        console_lock();
1074        pci_set_power_state(dev, PCI_D0);
1075
1076        if (par->pm_state != PM_EVENT_FREEZE) {
1077                pci_restore_state(dev);
1078
1079                if (pci_enable_device(dev))
1080                        goto fail;
1081
1082                pci_set_master(dev);
1083        }
1084
1085        par->pm_state = PM_EVENT_ON;
1086        nvidiafb_set_par(info);
1087        fb_set_suspend (info, 0);
1088        nvidiafb_blank(FB_BLANK_UNBLANK, info);
1089
1090fail:
1091        console_unlock();
1092        return 0;
1093}
1094#else
1095#define nvidiafb_suspend NULL
1096#define nvidiafb_resume NULL
1097#endif
1098
1099static int nvidia_set_fbinfo(struct fb_info *info)
1100{
1101        struct fb_monspecs *specs = &info->monspecs;
1102        struct fb_videomode modedb;
1103        struct nvidia_par *par = info->par;
1104        int lpitch;
1105
1106        NVTRACE_ENTER();
1107        info->flags = FBINFO_DEFAULT
1108            | FBINFO_HWACCEL_IMAGEBLIT
1109            | FBINFO_HWACCEL_FILLRECT
1110            | FBINFO_HWACCEL_COPYAREA
1111            | FBINFO_HWACCEL_YPAN;
1112
1113        fb_videomode_to_modelist(info->monspecs.modedb,
1114                                 info->monspecs.modedb_len, &info->modelist);
1115        fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1116
1117        switch (bpp) {
1118        case 0 ... 8:
1119                bpp = 8;
1120                break;
1121        case 9 ... 16:
1122                bpp = 16;
1123                break;
1124        default:
1125                bpp = 32;
1126                break;
1127        }
1128
1129        if (specs->modedb != NULL) {
1130                const struct fb_videomode *mode;
1131
1132                mode = fb_find_best_display(specs, &info->modelist);
1133                fb_videomode_to_var(&nvidiafb_default_var, mode);
1134                nvidiafb_default_var.bits_per_pixel = bpp;
1135        } else if (par->fpWidth && par->fpHeight) {
1136                char buf[16];
1137
1138                memset(buf, 0, 16);
1139                snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1140                fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1141                             specs->modedb_len, &modedb, bpp);
1142        }
1143
1144        if (mode_option)
1145                fb_find_mode(&nvidiafb_default_var, info, mode_option,
1146                             specs->modedb, specs->modedb_len, &modedb, bpp);
1147
1148        info->var = nvidiafb_default_var;
1149        info->fix.visual = (info->var.bits_per_pixel == 8) ?
1150                FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1151        info->pseudo_palette = par->pseudo_palette;
1152        fb_alloc_cmap(&info->cmap, 256, 0);
1153        fb_destroy_modedb(info->monspecs.modedb);
1154        info->monspecs.modedb = NULL;
1155
1156        /* maximize virtual vertical length */
1157        lpitch = info->var.xres_virtual *
1158                ((info->var.bits_per_pixel + 7) >> 3);
1159        info->var.yres_virtual = info->screen_size / lpitch;
1160
1161        info->pixmap.scan_align = 4;
1162        info->pixmap.buf_align = 4;
1163        info->pixmap.access_align = 32;
1164        info->pixmap.size = 8 * 1024;
1165        info->pixmap.flags = FB_PIXMAP_SYSTEM;
1166
1167        if (!hwcur)
1168            info->fbops->fb_cursor = NULL;
1169
1170        info->var.accel_flags = (!noaccel);
1171
1172        switch (par->Architecture) {
1173        case NV_ARCH_04:
1174                info->fix.accel = FB_ACCEL_NV4;
1175                break;
1176        case NV_ARCH_10:
1177                info->fix.accel = FB_ACCEL_NV_10;
1178                break;
1179        case NV_ARCH_20:
1180                info->fix.accel = FB_ACCEL_NV_20;
1181                break;
1182        case NV_ARCH_30:
1183                info->fix.accel = FB_ACCEL_NV_30;
1184                break;
1185        case NV_ARCH_40:
1186                info->fix.accel = FB_ACCEL_NV_40;
1187                break;
1188        }
1189
1190        NVTRACE_LEAVE();
1191
1192        return nvidiafb_check_var(&info->var, info);
1193}
1194
1195static u32 nvidia_get_chipset(struct fb_info *info)
1196{
1197        struct nvidia_par *par = info->par;
1198        u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1199
1200        printk(KERN_INFO PFX "Device ID: %x \n", id);
1201
1202        if ((id & 0xfff0) == 0x00f0 ||
1203            (id & 0xfff0) == 0x02e0) {
1204                /* pci-e */
1205                id = NV_RD32(par->REGS, 0x1800);
1206
1207                if ((id & 0x0000ffff) == 0x000010DE)
1208                        id = 0x10DE0000 | (id >> 16);
1209                else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1210                        id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1211                            ((id >> 8) & 0x000000ff);
1212                printk(KERN_INFO PFX "Subsystem ID: %x \n", id);
1213        }
1214
1215        return id;
1216}
1217
1218static u32 nvidia_get_arch(struct fb_info *info)
1219{
1220        struct nvidia_par *par = info->par;
1221        u32 arch = 0;
1222
1223        switch (par->Chipset & 0x0ff0) {
1224        case 0x0100:            /* GeForce 256 */
1225        case 0x0110:            /* GeForce2 MX */
1226        case 0x0150:            /* GeForce2 */
1227        case 0x0170:            /* GeForce4 MX */
1228        case 0x0180:            /* GeForce4 MX (8x AGP) */
1229        case 0x01A0:            /* nForce */
1230        case 0x01F0:            /* nForce2 */
1231                arch = NV_ARCH_10;
1232                break;
1233        case 0x0200:            /* GeForce3 */
1234        case 0x0250:            /* GeForce4 Ti */
1235        case 0x0280:            /* GeForce4 Ti (8x AGP) */
1236                arch = NV_ARCH_20;
1237                break;
1238        case 0x0300:            /* GeForceFX 5800 */
1239        case 0x0310:            /* GeForceFX 5600 */
1240        case 0x0320:            /* GeForceFX 5200 */
1241        case 0x0330:            /* GeForceFX 5900 */
1242        case 0x0340:            /* GeForceFX 5700 */
1243                arch = NV_ARCH_30;
1244                break;
1245        case 0x0040:            /* GeForce 6800 */
1246        case 0x00C0:            /* GeForce 6800 */
1247        case 0x0120:            /* GeForce 6800 */
1248        case 0x0140:            /* GeForce 6600 */
1249        case 0x0160:            /* GeForce 6200 */
1250        case 0x01D0:            /* GeForce 7200, 7300, 7400 */
1251        case 0x0090:            /* GeForce 7800 */
1252        case 0x0210:            /* GeForce 6800 */
1253        case 0x0220:            /* GeForce 6200 */
1254        case 0x0240:            /* GeForce 6100 */
1255        case 0x0290:            /* GeForce 7900 */
1256        case 0x0390:            /* GeForce 7600 */
1257        case 0x03D0:
1258                arch = NV_ARCH_40;
1259                break;
1260        case 0x0020:            /* TNT, TNT2 */
1261                arch = NV_ARCH_04;
1262                break;
1263        default:                /* unknown architecture */
1264                break;
1265        }
1266
1267        return arch;
1268}
1269
1270static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1271{
1272        struct nvidia_par *par;
1273        struct fb_info *info;
1274        unsigned short cmd;
1275
1276
1277        NVTRACE_ENTER();
1278        assert(pd != NULL);
1279
1280        info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1281
1282        if (!info)
1283                goto err_out;
1284
1285        par = info->par;
1286        par->pci_dev = pd;
1287        info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL);
1288
1289        if (info->pixmap.addr == NULL)
1290                goto err_out_kfree;
1291
1292        if (pci_enable_device(pd)) {
1293                printk(KERN_ERR PFX "cannot enable PCI device\n");
1294                goto err_out_enable;
1295        }
1296
1297        if (pci_request_regions(pd, "nvidiafb")) {
1298                printk(KERN_ERR PFX "cannot request PCI regions\n");
1299                goto err_out_enable;
1300        }
1301
1302        par->FlatPanel = flatpanel;
1303        if (flatpanel == 1)
1304                printk(KERN_INFO PFX "flatpanel support enabled\n");
1305        par->FPDither = fpdither;
1306
1307        par->CRTCnumber = forceCRTC;
1308        par->FpScale = (!noscale);
1309        par->paneltweak = paneltweak;
1310        par->reverse_i2c = reverse_i2c;
1311
1312        /* enable IO and mem if not already done */
1313        pci_read_config_word(pd, PCI_COMMAND, &cmd);
1314        cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1315        pci_write_config_word(pd, PCI_COMMAND, cmd);
1316
1317        nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1318        nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1319        nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1320
1321        par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1322
1323        if (!par->REGS) {
1324                printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1325                goto err_out_free_base0;
1326        }
1327
1328        par->Chipset = nvidia_get_chipset(info);
1329        par->Architecture = nvidia_get_arch(info);
1330
1331        if (par->Architecture == 0) {
1332                printk(KERN_ERR PFX "unknown NV_ARCH\n");
1333                goto err_out_arch;
1334        }
1335
1336        sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1337
1338        if (NVCommonSetup(info))
1339                goto err_out_arch;
1340
1341        par->FbAddress = nvidiafb_fix.smem_start;
1342        par->FbMapSize = par->RamAmountKBytes * 1024;
1343        if (vram && vram * 1024 * 1024 < par->FbMapSize)
1344                par->FbMapSize = vram * 1024 * 1024;
1345
1346        /* Limit amount of vram to 64 MB */
1347        if (par->FbMapSize > 64 * 1024 * 1024)
1348                par->FbMapSize = 64 * 1024 * 1024;
1349
1350        if(par->Architecture >= NV_ARCH_40)
1351                par->FbUsableSize = par->FbMapSize - (560 * 1024);
1352        else
1353                par->FbUsableSize = par->FbMapSize - (128 * 1024);
1354        par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1355            16 * 1024;
1356        par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1357        par->CursorStart = par->FbUsableSize + (32 * 1024);
1358
1359        info->screen_base = ioremap_wc(nvidiafb_fix.smem_start,
1360                                       par->FbMapSize);
1361        info->screen_size = par->FbUsableSize;
1362        nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1363
1364        if (!info->screen_base) {
1365                printk(KERN_ERR PFX "cannot ioremap FB base\n");
1366                goto err_out_free_base1;
1367        }
1368
1369        par->FbStart = info->screen_base;
1370
1371        if (!nomtrr)
1372                par->wc_cookie = arch_phys_wc_add(nvidiafb_fix.smem_start,
1373                                                  par->RamAmountKBytes * 1024);
1374
1375        info->fbops = &nvidia_fb_ops;
1376        info->fix = nvidiafb_fix;
1377
1378        if (nvidia_set_fbinfo(info) < 0) {
1379                printk(KERN_ERR PFX "error setting initial video mode\n");
1380                goto err_out_iounmap_fb;
1381        }
1382
1383        nvidia_save_vga(par, &par->SavedReg);
1384
1385        pci_set_drvdata(pd, info);
1386
1387        if (backlight)
1388                nvidia_bl_init(par);
1389
1390        if (register_framebuffer(info) < 0) {
1391                printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1392                goto err_out_iounmap_fb;
1393        }
1394
1395
1396        printk(KERN_INFO PFX
1397               "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1398               info->fix.id,
1399               par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1400
1401        NVTRACE_LEAVE();
1402        return 0;
1403
1404err_out_iounmap_fb:
1405        iounmap(info->screen_base);
1406err_out_free_base1:
1407        fb_destroy_modedb(info->monspecs.modedb);
1408        nvidia_delete_i2c_busses(par);
1409err_out_arch:
1410        iounmap(par->REGS);
1411 err_out_free_base0:
1412        pci_release_regions(pd);
1413err_out_enable:
1414        kfree(info->pixmap.addr);
1415err_out_kfree:
1416        framebuffer_release(info);
1417err_out:
1418        return -ENODEV;
1419}
1420
1421static void nvidiafb_remove(struct pci_dev *pd)
1422{
1423        struct fb_info *info = pci_get_drvdata(pd);
1424        struct nvidia_par *par = info->par;
1425
1426        NVTRACE_ENTER();
1427
1428        unregister_framebuffer(info);
1429
1430        nvidia_bl_exit(par);
1431        arch_phys_wc_del(par->wc_cookie);
1432        iounmap(info->screen_base);
1433        fb_destroy_modedb(info->monspecs.modedb);
1434        nvidia_delete_i2c_busses(par);
1435        iounmap(par->REGS);
1436        pci_release_regions(pd);
1437        kfree(info->pixmap.addr);
1438        framebuffer_release(info);
1439        NVTRACE_LEAVE();
1440}
1441
1442/* ------------------------------------------------------------------------- *
1443 *
1444 * initialization
1445 *
1446 * ------------------------------------------------------------------------- */
1447
1448#ifndef MODULE
1449static int nvidiafb_setup(char *options)
1450{
1451        char *this_opt;
1452
1453        NVTRACE_ENTER();
1454        if (!options || !*options)
1455                return 0;
1456
1457        while ((this_opt = strsep(&options, ",")) != NULL) {
1458                if (!strncmp(this_opt, "forceCRTC", 9)) {
1459                        char *p;
1460
1461                        p = this_opt + 9;
1462                        if (!*p || !*(++p))
1463                                continue;
1464                        forceCRTC = *p - '0';
1465                        if (forceCRTC < 0 || forceCRTC > 1)
1466                                forceCRTC = -1;
1467                } else if (!strncmp(this_opt, "flatpanel", 9)) {
1468                        flatpanel = 1;
1469                } else if (!strncmp(this_opt, "hwcur", 5)) {
1470                        hwcur = 1;
1471                } else if (!strncmp(this_opt, "noaccel", 6)) {
1472                        noaccel = 1;
1473                } else if (!strncmp(this_opt, "noscale", 7)) {
1474                        noscale = 1;
1475                } else if (!strncmp(this_opt, "reverse_i2c", 11)) {
1476                        reverse_i2c = 1;
1477                } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1478                        paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1479                } else if (!strncmp(this_opt, "vram:", 5)) {
1480                        vram = simple_strtoul(this_opt+5, NULL, 0);
1481                } else if (!strncmp(this_opt, "backlight:", 10)) {
1482                        backlight = simple_strtoul(this_opt+10, NULL, 0);
1483                } else if (!strncmp(this_opt, "nomtrr", 6)) {
1484                        nomtrr = true;
1485                } else if (!strncmp(this_opt, "fpdither:", 9)) {
1486                        fpdither = simple_strtol(this_opt+9, NULL, 0);
1487                } else if (!strncmp(this_opt, "bpp:", 4)) {
1488                        bpp = simple_strtoul(this_opt+4, NULL, 0);
1489                } else
1490                        mode_option = this_opt;
1491        }
1492        NVTRACE_LEAVE();
1493        return 0;
1494}
1495#endif                          /* !MODULE */
1496
1497static struct pci_driver nvidiafb_driver = {
1498        .name = "nvidiafb",
1499        .id_table = nvidiafb_pci_tbl,
1500        .probe    = nvidiafb_probe,
1501        .suspend  = nvidiafb_suspend,
1502        .resume   = nvidiafb_resume,
1503        .remove   = nvidiafb_remove,
1504};
1505
1506/* ------------------------------------------------------------------------- *
1507 *
1508 * modularization
1509 *
1510 * ------------------------------------------------------------------------- */
1511
1512static int nvidiafb_init(void)
1513{
1514#ifndef MODULE
1515        char *option = NULL;
1516
1517        if (fb_get_options("nvidiafb", &option))
1518                return -ENODEV;
1519        nvidiafb_setup(option);
1520#endif
1521        return pci_register_driver(&nvidiafb_driver);
1522}
1523
1524module_init(nvidiafb_init);
1525
1526static void __exit nvidiafb_exit(void)
1527{
1528        pci_unregister_driver(&nvidiafb_driver);
1529}
1530
1531module_exit(nvidiafb_exit);
1532
1533module_param(flatpanel, int, 0);
1534MODULE_PARM_DESC(flatpanel,
1535                 "Enables experimental flat panel support for some chipsets. "
1536                 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1537module_param(fpdither, int, 0);
1538MODULE_PARM_DESC(fpdither,
1539                 "Enables dithering of flat panel for 6 bits panels. "
1540                 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1541module_param(hwcur, int, 0);
1542MODULE_PARM_DESC(hwcur,
1543                 "Enables hardware cursor implementation. (0 or 1=enabled) "
1544                 "(default=0)");
1545module_param(noaccel, int, 0);
1546MODULE_PARM_DESC(noaccel,
1547                 "Disables hardware acceleration. (0 or 1=disable) "
1548                 "(default=0)");
1549module_param(noscale, int, 0);
1550MODULE_PARM_DESC(noscale,
1551                 "Disables screen scaling. (0 or 1=disable) "
1552                 "(default=0, do scaling)");
1553module_param(paneltweak, int, 0);
1554MODULE_PARM_DESC(paneltweak,
1555                 "Tweak display settings for flatpanels. "
1556                 "(default=0, no tweaks)");
1557module_param(forceCRTC, int, 0);
1558MODULE_PARM_DESC(forceCRTC,
1559                 "Forces usage of a particular CRTC in case autodetection "
1560                 "fails. (0 or 1) (default=autodetect)");
1561module_param(vram, int, 0);
1562MODULE_PARM_DESC(vram,
1563                 "amount of framebuffer memory to remap in MiB"
1564                 "(default=0 - remap entire memory)");
1565module_param(mode_option, charp, 0);
1566MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1567module_param(bpp, int, 0);
1568MODULE_PARM_DESC(bpp, "pixel width in bits"
1569                 "(default=8)");
1570module_param(reverse_i2c, int, 0);
1571MODULE_PARM_DESC(reverse_i2c, "reverse port assignment of the i2c bus");
1572module_param(nomtrr, bool, false);
1573MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1574                 "(default=0)");
1575
1576MODULE_AUTHOR("Antonino Daplas");
1577MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1578MODULE_LICENSE("GPL");
1579