aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@suse.com>2015-04-21 16:16:35 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2015-06-03 05:41:52 -0400
commit04dc78b419b3aedb3a40fd0048e8cb4b7ba9d00c (patch)
treead65bdebdbd5c29fd4fb5bde53145296f6088240
parent26e2506075f0e0b9ed8909e772404e750a13d3f5 (diff)
video: fbdev: rivafb: use arch_phys_wc_add() and ioremap_wc()
This driver uses the same area for MTRR as for the 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: 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: Antonino Daplas <adaplas@gmail.com> Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> Cc: Tomi Valkeinen <tomi.valkeinen@ti.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/riva/fbdev.c39
-rw-r--r--drivers/video/fbdev/riva/rivafb.h4
2 files changed, 8 insertions, 35 deletions
diff --git a/drivers/video/fbdev/riva/fbdev.c b/drivers/video/fbdev/riva/fbdev.c
index 294a80908c8c..f1ad2747064b 100644
--- a/drivers/video/fbdev/riva/fbdev.c
+++ b/drivers/video/fbdev/riva/fbdev.c
@@ -41,9 +41,6 @@
41#include <linux/pci.h> 41#include <linux/pci.h>
42#include <linux/backlight.h> 42#include <linux/backlight.h>
43#include <linux/bitrev.h> 43#include <linux/bitrev.h>
44#ifdef CONFIG_MTRR
45#include <asm/mtrr.h>
46#endif
47#ifdef CONFIG_PMAC_BACKLIGHT 44#ifdef CONFIG_PMAC_BACKLIGHT
48#include <asm/machdep.h> 45#include <asm/machdep.h>
49#include <asm/backlight.h> 46#include <asm/backlight.h>
@@ -204,9 +201,7 @@ MODULE_DEVICE_TABLE(pci, rivafb_pci_tbl);
204static int flatpanel = -1; /* Autodetect later */ 201static int flatpanel = -1; /* Autodetect later */
205static int forceCRTC = -1; 202static int forceCRTC = -1;
206static bool noaccel = 0; 203static bool noaccel = 0;
207#ifdef CONFIG_MTRR
208static bool nomtrr = 0; 204static bool nomtrr = 0;
209#endif
210#ifdef CONFIG_PMAC_BACKLIGHT 205#ifdef CONFIG_PMAC_BACKLIGHT
211static int backlight = 1; 206static int backlight = 1;
212#else 207#else
@@ -2010,28 +2005,18 @@ static int rivafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
2010 2005
2011 rivafb_fix.smem_len = riva_get_memlen(default_par) * 1024; 2006 rivafb_fix.smem_len = riva_get_memlen(default_par) * 1024;
2012 default_par->dclk_max = riva_get_maxdclk(default_par) * 1000; 2007 default_par->dclk_max = riva_get_maxdclk(default_par) * 1000;
2013 info->screen_base = ioremap(rivafb_fix.smem_start, 2008 info->screen_base = ioremap_wc(rivafb_fix.smem_start,
2014 rivafb_fix.smem_len); 2009 rivafb_fix.smem_len);
2015 if (!info->screen_base) { 2010 if (!info->screen_base) {
2016 printk(KERN_ERR PFX "cannot ioremap FB base\n"); 2011 printk(KERN_ERR PFX "cannot ioremap FB base\n");
2017 ret = -EIO; 2012 ret = -EIO;
2018 goto err_iounmap_pramin; 2013 goto err_iounmap_pramin;
2019 } 2014 }
2020 2015
2021#ifdef CONFIG_MTRR 2016 if (!nomtrr)
2022 if (!nomtrr) { 2017 default_par->wc_cookie =
2023 default_par->mtrr.vram = mtrr_add(rivafb_fix.smem_start, 2018 arch_phys_wc_add(rivafb_fix.smem_start,
2024 rivafb_fix.smem_len, 2019 rivafb_fix.smem_len);
2025 MTRR_TYPE_WRCOMB, 1);
2026 if (default_par->mtrr.vram < 0) {
2027 printk(KERN_ERR PFX "unable to setup MTRR\n");
2028 } else {
2029 default_par->mtrr.vram_valid = 1;
2030 /* let there be speed */
2031 printk(KERN_INFO PFX "RIVA MTRR set to ON\n");
2032 }
2033 }
2034#endif /* CONFIG_MTRR */
2035 2020
2036 info->fbops = &riva_fb_ops; 2021 info->fbops = &riva_fb_ops;
2037 info->fix = rivafb_fix; 2022 info->fix = rivafb_fix;
@@ -2105,13 +2090,7 @@ static void rivafb_remove(struct pci_dev *pd)
2105 unregister_framebuffer(info); 2090 unregister_framebuffer(info);
2106 2091
2107 riva_bl_exit(info); 2092 riva_bl_exit(info);
2108 2093 arch_phys_wc_del(par->wc_cookie);
2109#ifdef CONFIG_MTRR
2110 if (par->mtrr.vram_valid)
2111 mtrr_del(par->mtrr.vram, info->fix.smem_start,
2112 info->fix.smem_len);
2113#endif /* CONFIG_MTRR */
2114
2115 iounmap(par->ctrl_base); 2094 iounmap(par->ctrl_base);
2116 iounmap(info->screen_base); 2095 iounmap(info->screen_base);
2117 if (par->riva.Architecture == NV_ARCH_03) 2096 if (par->riva.Architecture == NV_ARCH_03)
@@ -2150,10 +2129,8 @@ static int rivafb_setup(char *options)
2150 flatpanel = 1; 2129 flatpanel = 1;
2151 } else if (!strncmp(this_opt, "backlight:", 10)) { 2130 } else if (!strncmp(this_opt, "backlight:", 10)) {
2152 backlight = simple_strtoul(this_opt+10, NULL, 0); 2131 backlight = simple_strtoul(this_opt+10, NULL, 0);
2153#ifdef CONFIG_MTRR
2154 } else if (!strncmp(this_opt, "nomtrr", 6)) { 2132 } else if (!strncmp(this_opt, "nomtrr", 6)) {
2155 nomtrr = 1; 2133 nomtrr = 1;
2156#endif
2157 } else if (!strncmp(this_opt, "strictmode", 10)) { 2134 } else if (!strncmp(this_opt, "strictmode", 10)) {
2158 strictmode = 1; 2135 strictmode = 1;
2159 } else if (!strncmp(this_opt, "noaccel", 7)) { 2136 } else if (!strncmp(this_opt, "noaccel", 7)) {
@@ -2209,10 +2186,8 @@ module_param(flatpanel, int, 0);
2209MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. (0 or 1=enabled) (default=0)"); 2186MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. (0 or 1=enabled) (default=0)");
2210module_param(forceCRTC, int, 0); 2187module_param(forceCRTC, int, 0);
2211MODULE_PARM_DESC(forceCRTC, "Forces usage of a particular CRTC in case autodetection fails. (0 or 1) (default=autodetect)"); 2188MODULE_PARM_DESC(forceCRTC, "Forces usage of a particular CRTC in case autodetection fails. (0 or 1) (default=autodetect)");
2212#ifdef CONFIG_MTRR
2213module_param(nomtrr, bool, 0); 2189module_param(nomtrr, bool, 0);
2214MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) (default=0)"); 2190MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) (default=0)");
2215#endif
2216module_param(strictmode, bool, 0); 2191module_param(strictmode, bool, 0);
2217MODULE_PARM_DESC(strictmode, "Only use video modes from EDID"); 2192MODULE_PARM_DESC(strictmode, "Only use video modes from EDID");
2218 2193
diff --git a/drivers/video/fbdev/riva/rivafb.h b/drivers/video/fbdev/riva/rivafb.h
index d9f107b704c6..61fd37ca490a 100644
--- a/drivers/video/fbdev/riva/rivafb.h
+++ b/drivers/video/fbdev/riva/rivafb.h
@@ -61,9 +61,7 @@ struct riva_par {
61 int FlatPanel; 61 int FlatPanel;
62 struct pci_dev *pdev; 62 struct pci_dev *pdev;
63 int cursor_reset; 63 int cursor_reset;
64#ifdef CONFIG_MTRR 64 int wc_cookie;
65 struct { int vram; int vram_valid; } mtrr;
66#endif
67 struct riva_i2c_chan chan[3]; 65 struct riva_i2c_chan chan[3];
68}; 66};
69 67