Commit 917bb077 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

[PATCH] nvidiafb: ioremap and i2c fixes

- Add 'vram' option to specify amount of video RAM to remap
- Limit remap size to 64 MIB
- Use info->screen_size for remapped RAM
- Fix misplaced label in failure path
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 71494376
...@@ -408,6 +408,7 @@ static int hwcur __devinitdata = 0; ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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); ...@@ -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) "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment