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