|
@@ -408,6 +408,7 @@ static int hwcur __devinitdata = 0;
|
|
static int noaccel __devinitdata = 0;
|
|
static int noaccel __devinitdata = 0;
|
|
static int noscale __devinitdata = 0;
|
|
static int noscale __devinitdata = 0;
|
|
static int paneltweak __devinitdata = 0;
|
|
static int paneltweak __devinitdata = 0;
|
|
|
|
+static int vram __devinitdata = 0;
|
|
#ifdef CONFIG_MTRR
|
|
#ifdef CONFIG_MTRR
|
|
static int nomtrr __devinitdata = 0;
|
|
static int nomtrr __devinitdata = 0;
|
|
#endif
|
|
#endif
|
|
@@ -1180,7 +1181,7 @@ static int nvidiafb_check_var(struct fb_var_screeninfo *var,
|
|
|
|
|
|
var->xres_virtual = (var->xres_virtual + 63) & ~63;
|
|
var->xres_virtual = (var->xres_virtual + 63) & ~63;
|
|
|
|
|
|
- vramlen = info->fix.smem_len;
|
|
|
|
|
|
+ vramlen = info->screen_size;
|
|
pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
|
|
pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
|
|
memlen = pitch * var->yres_virtual;
|
|
memlen = pitch * var->yres_virtual;
|
|
|
|
|
|
@@ -1343,7 +1344,7 @@ static int __devinit nvidia_set_fbinfo(struct fb_info *info)
|
|
/* maximize virtual vertical length */
|
|
/* maximize virtual vertical length */
|
|
lpitch = info->var.xres_virtual *
|
|
lpitch = info->var.xres_virtual *
|
|
((info->var.bits_per_pixel + 7) >> 3);
|
|
((info->var.bits_per_pixel + 7) >> 3);
|
|
- info->var.yres_virtual = info->fix.smem_len / lpitch;
|
|
|
|
|
|
+ info->var.yres_virtual = info->screen_size / lpitch;
|
|
|
|
|
|
info->pixmap.scan_align = 4;
|
|
info->pixmap.scan_align = 4;
|
|
info->pixmap.buf_align = 4;
|
|
info->pixmap.buf_align = 4;
|
|
@@ -1507,12 +1508,20 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
|
|
|
|
|
|
par->FbAddress = nvidiafb_fix.smem_start;
|
|
par->FbAddress = nvidiafb_fix.smem_start;
|
|
par->FbMapSize = par->RamAmountKBytes * 1024;
|
|
par->FbMapSize = par->RamAmountKBytes * 1024;
|
|
|
|
+ if (vram && vram * 1024 * 1024 < par->FbMapSize)
|
|
|
|
+ par->FbMapSize = vram * 1024 * 1024;
|
|
|
|
+
|
|
|
|
+ /* Limit amount of vram to 64 MB */
|
|
|
|
+ if (par->FbMapSize > 64 * 1024 * 1024)
|
|
|
|
+ par->FbMapSize = 64 * 1024 * 1024;
|
|
|
|
+
|
|
par->FbUsableSize = par->FbMapSize - (128 * 1024);
|
|
par->FbUsableSize = par->FbMapSize - (128 * 1024);
|
|
par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
|
|
par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
|
|
16 * 1024;
|
|
16 * 1024;
|
|
par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
|
|
par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
|
|
info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
|
|
info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
|
|
- nvidiafb_fix.smem_len = par->FbUsableSize;
|
|
|
|
|
|
+ info->screen_size = par->FbUsableSize;
|
|
|
|
+ nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
|
|
|
|
|
|
if (!info->screen_base) {
|
|
if (!info->screen_base) {
|
|
printk(KERN_ERR PFX "cannot ioremap FB base\n");
|
|
printk(KERN_ERR PFX "cannot ioremap FB base\n");
|
|
@@ -1524,7 +1533,8 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
|
|
#ifdef CONFIG_MTRR
|
|
#ifdef CONFIG_MTRR
|
|
if (!nomtrr) {
|
|
if (!nomtrr) {
|
|
par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
|
|
par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
|
|
- par->FbMapSize, MTRR_TYPE_WRCOMB, 1);
|
|
|
|
|
|
+ par->RamAmountKBytes * 1024,
|
|
|
|
+ MTRR_TYPE_WRCOMB, 1);
|
|
if (par->mtrr.vram < 0) {
|
|
if (par->mtrr.vram < 0) {
|
|
printk(KERN_ERR PFX "unable to setup MTRR\n");
|
|
printk(KERN_ERR PFX "unable to setup MTRR\n");
|
|
} else {
|
|
} else {
|
|
@@ -1566,9 +1576,9 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
|
|
|
|
|
|
err_out_iounmap_fb:
|
|
err_out_iounmap_fb:
|
|
iounmap(info->screen_base);
|
|
iounmap(info->screen_base);
|
|
|
|
+ err_out_free_base1:
|
|
fb_destroy_modedb(info->monspecs.modedb);
|
|
fb_destroy_modedb(info->monspecs.modedb);
|
|
nvidia_delete_i2c_busses(par);
|
|
nvidia_delete_i2c_busses(par);
|
|
- err_out_free_base1:
|
|
|
|
iounmap(par->REGS);
|
|
iounmap(par->REGS);
|
|
err_out_free_base0:
|
|
err_out_free_base0:
|
|
pci_release_regions(pd);
|
|
pci_release_regions(pd);
|
|
@@ -1645,6 +1655,8 @@ static int __devinit nvidiafb_setup(char *options)
|
|
noscale = 1;
|
|
noscale = 1;
|
|
} else if (!strncmp(this_opt, "paneltweak:", 11)) {
|
|
} else if (!strncmp(this_opt, "paneltweak:", 11)) {
|
|
paneltweak = simple_strtoul(this_opt+11, NULL, 0);
|
|
paneltweak = simple_strtoul(this_opt+11, NULL, 0);
|
|
|
|
+ } else if (!strncmp(this_opt, "vram:", 5)) {
|
|
|
|
+ vram = simple_strtoul(this_opt+5, NULL, 0);
|
|
#ifdef CONFIG_MTRR
|
|
#ifdef CONFIG_MTRR
|
|
} else if (!strncmp(this_opt, "nomtrr", 6)) {
|
|
} else if (!strncmp(this_opt, "nomtrr", 6)) {
|
|
nomtrr = 1;
|
|
nomtrr = 1;
|
|
@@ -1716,6 +1728,10 @@ module_param(forceCRTC, int, 0);
|
|
MODULE_PARM_DESC(forceCRTC,
|
|
MODULE_PARM_DESC(forceCRTC,
|
|
"Forces usage of a particular CRTC in case autodetection "
|
|
"Forces usage of a particular CRTC in case autodetection "
|
|
"fails. (0 or 1) (default=autodetect)");
|
|
"fails. (0 or 1) (default=autodetect)");
|
|
|
|
+module_param(vram, int, 0);
|
|
|
|
+MODULE_PARM_DESC(vram,
|
|
|
|
+ "amount of framebuffer memory to remap in MiB"
|
|
|
|
+ "(default=0 - remap entire memory)");
|
|
#ifdef CONFIG_MTRR
|
|
#ifdef CONFIG_MTRR
|
|
module_param(nomtrr, bool, 0);
|
|
module_param(nomtrr, bool, 0);
|
|
MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
|
|
MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
|