aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@suse.com>2015-04-21 16:16:28 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2015-06-03 05:41:50 -0400
commit3b213c2f6f563bf941448d2de48ef33a76675b57 (patch)
tree8661485284fbd11aeba9d9f950fe4c912c8c9569
parentf2081b81c51893c7f2fd8b6d569d1b8de620a2fc (diff)
video: fbdev: nvidia: use arch_phys_wc_add() and ioremap_wc()
This driver uses the same area for MTRR and ioremap(). Convert the driver from using the x86 specific MTRR code to the architecture agnostic arch_phys_wc_add(). arch_phys_wc_add() will avoid MTRR if write-combining is available, in order to take advantage of that also ensure the ioremap'd area is requested as write-combining. There are a few motivations for this: a) Take advantage of PAT when available b) Help bury MTRR code away, MTRR is architecture specific and on x86 its replaced by PAT c) Help with the goal of eventually using _PAGE_CACHE_UC over _PAGE_CACHE_UC_MINUS on x86 on ioremap_nocache() (see commit de33c442e titled "x86 PAT: fix performance drop for glx, use UC minus for ioremap(), ioremap_nocache() and pci_mmap_page_range()") The conversion done is expressed by the following Coccinelle SmPL patch, it additionally required manual intervention to address all the #ifdery and removal of redundant things which arch_phys_wc_add() already addresses such as verbose message about when MTRR fails and doing nothing when we didn't get an MTRR. @ mtrr_found @ expression index, base, size; @@ -index = mtrr_add(base, size, MTRR_TYPE_WRCOMB, 1); +index = arch_phys_wc_add(base, size); @ mtrr_rm depends on mtrr_found @ expression mtrr_found.index, mtrr_found.base, mtrr_found.size; @@ -mtrr_del(index, base, size); +arch_phys_wc_del(index); @ mtrr_rm_zero_arg depends on mtrr_found @ expression mtrr_found.index; @@ -mtrr_del(index, 0, 0); +arch_phys_wc_del(index); @ mtrr_rm_fb_info depends on mtrr_found @ struct fb_info *info; expression mtrr_found.index; @@ -mtrr_del(index, info->fix.smem_start, info->fix.smem_len); +arch_phys_wc_del(index); @ ioremap_replace_nocache depends on mtrr_found @ struct fb_info *info; expression base, size; @@ -info->screen_base = ioremap_nocache(base, size); +info->screen_base = ioremap_wc(base, size); @ ioremap_replace_default depends on mtrr_found @ struct fb_info *info; expression base, size; @@ -info->screen_base = ioremap(base, size); +info->screen_base = ioremap_wc(base, size); Generated-by: Coccinelle SmPL Cc: Antonino Daplas <adaplas@gmail.com> Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> Cc: Suresh Siddha <sbsiddha@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Juergen Gross <jgross@suse.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Dave Airlie <airlied@redhat.com> Cc: linux-fbdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/video/fbdev/nvidia/nv_type.h7
-rw-r--r--drivers/video/fbdev/nvidia/nvidia.c37
2 files changed, 7 insertions, 37 deletions
diff --git a/drivers/video/fbdev/nvidia/nv_type.h b/drivers/video/fbdev/nvidia/nv_type.h
index c03f7f55c76d..6ff321a36813 100644
--- a/drivers/video/fbdev/nvidia/nv_type.h
+++ b/drivers/video/fbdev/nvidia/nv_type.h
@@ -148,12 +148,7 @@ struct nvidia_par {
148 u32 forceCRTC; 148 u32 forceCRTC;
149 u32 open_count; 149 u32 open_count;
150 u8 DDCBase; 150 u8 DDCBase;
151#ifdef CONFIG_MTRR 151 int wc_cookie;
152 struct {
153 int vram;
154 int vram_valid;
155 } mtrr;
156#endif
157 struct nvidia_i2c_chan chan[3]; 152 struct nvidia_i2c_chan chan[3];
158 153
159 volatile u32 __iomem *REGS; 154 volatile u32 __iomem *REGS;
diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
index 4273c6ee8cf6..ce7dab7299fe 100644
--- a/drivers/video/fbdev/nvidia/nvidia.c
+++ b/drivers/video/fbdev/nvidia/nvidia.c
@@ -21,9 +21,6 @@
21#include <linux/pci.h> 21#include <linux/pci.h>
22#include <linux/console.h> 22#include <linux/console.h>
23#include <linux/backlight.h> 23#include <linux/backlight.h>
24#ifdef CONFIG_MTRR
25#include <asm/mtrr.h>
26#endif
27#ifdef CONFIG_BOOTX_TEXT 24#ifdef CONFIG_BOOTX_TEXT
28#include <asm/btext.h> 25#include <asm/btext.h>
29#endif 26#endif
@@ -76,9 +73,7 @@ static int paneltweak = 0;
76static int vram = 0; 73static int vram = 0;
77static int bpp = 8; 74static int bpp = 8;
78static int reverse_i2c; 75static int reverse_i2c;
79#ifdef CONFIG_MTRR
80static bool nomtrr = false; 76static bool nomtrr = false;
81#endif
82#ifdef CONFIG_PMAC_BACKLIGHT 77#ifdef CONFIG_PMAC_BACKLIGHT
83static int backlight = 1; 78static int backlight = 1;
84#else 79#else
@@ -1361,7 +1356,8 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1361 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize; 1356 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1362 par->CursorStart = par->FbUsableSize + (32 * 1024); 1357 par->CursorStart = par->FbUsableSize + (32 * 1024);
1363 1358
1364 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize); 1359 info->screen_base = ioremap_wc(nvidiafb_fix.smem_start,
1360 par->FbMapSize);
1365 info->screen_size = par->FbUsableSize; 1361 info->screen_size = par->FbUsableSize;
1366 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024; 1362 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1367 1363
@@ -1372,20 +1368,9 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1372 1368
1373 par->FbStart = info->screen_base; 1369 par->FbStart = info->screen_base;
1374 1370
1375#ifdef CONFIG_MTRR 1371 if (!nomtrr)
1376 if (!nomtrr) { 1372 par->wc_cookie = arch_phys_wc_add(nvidiafb_fix.smem_start,
1377 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start, 1373 par->RamAmountKBytes * 1024);
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 1374
1390 info->fbops = &nvidia_fb_ops; 1375 info->fbops = &nvidia_fb_ops;
1391 info->fix = nvidiafb_fix; 1376 info->fix = nvidiafb_fix;
@@ -1443,13 +1428,7 @@ static void nvidiafb_remove(struct pci_dev *pd)
1443 unregister_framebuffer(info); 1428 unregister_framebuffer(info);
1444 1429
1445 nvidia_bl_exit(par); 1430 nvidia_bl_exit(par);
1446 1431 arch_phys_wc_del(par->wc_cookie);
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); 1432 iounmap(info->screen_base);
1454 fb_destroy_modedb(info->monspecs.modedb); 1433 fb_destroy_modedb(info->monspecs.modedb);
1455 nvidia_delete_i2c_busses(par); 1434 nvidia_delete_i2c_busses(par);
@@ -1501,10 +1480,8 @@ static int nvidiafb_setup(char *options)
1501 vram = simple_strtoul(this_opt+5, NULL, 0); 1480 vram = simple_strtoul(this_opt+5, NULL, 0);
1502 } else if (!strncmp(this_opt, "backlight:", 10)) { 1481 } else if (!strncmp(this_opt, "backlight:", 10)) {
1503 backlight = simple_strtoul(this_opt+10, NULL, 0); 1482 backlight = simple_strtoul(this_opt+10, NULL, 0);
1504#ifdef CONFIG_MTRR
1505 } else if (!strncmp(this_opt, "nomtrr", 6)) { 1483 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1506 nomtrr = true; 1484 nomtrr = true;
1507#endif
1508 } else if (!strncmp(this_opt, "fpdither:", 9)) { 1485 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1509 fpdither = simple_strtol(this_opt+9, NULL, 0); 1486 fpdither = simple_strtol(this_opt+9, NULL, 0);
1510 } else if (!strncmp(this_opt, "bpp:", 4)) { 1487 } else if (!strncmp(this_opt, "bpp:", 4)) {
@@ -1592,11 +1569,9 @@ MODULE_PARM_DESC(bpp, "pixel width in bits"
1592 "(default=8)"); 1569 "(default=8)");
1593module_param(reverse_i2c, int, 0); 1570module_param(reverse_i2c, int, 0);
1594MODULE_PARM_DESC(reverse_i2c, "reverse port assignment of the i2c bus"); 1571MODULE_PARM_DESC(reverse_i2c, "reverse port assignment of the i2c bus");
1595#ifdef CONFIG_MTRR
1596module_param(nomtrr, bool, false); 1572module_param(nomtrr, bool, false);
1597MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) " 1573MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1598 "(default=0)"); 1574 "(default=0)");
1599#endif
1600 1575
1601MODULE_AUTHOR("Antonino Daplas"); 1576MODULE_AUTHOR("Antonino Daplas");
1602MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset"); 1577MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");