Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/video/fbdev/atyfb: Use arch_phys_wc_add() and ioremap_wc()

This driver uses strong UC for the MMIO region, and ioremap_wc()
for the framebuffer to whitelist for the WC MTRR that can be
changed to WC. On PAT systems we don't need the MTRR call so
just use arch_phys_wc_add() there, this lets us remove all those
ifdefs. Let's also be consistent and use ioremap_wc() for ATARI
as well.

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 it is being 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 ifdeffery 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);

Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andrzej Hajda <a.hajda@samsung.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Antonino Daplas <adaplas@gmail.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Davidlohr Bueso <dbueso@suse.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mathias Krause <minipli@googlemail.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Suresh Siddha <sbsiddha@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Toshi Kani <toshi.kani@hp.com>
Cc: Ville Syrjälä <syrjala@sci.fi>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: arnd@arndb.de
Cc: benh@kernel.crashing.org
Cc: dan.j.williams@intel.com
Cc: geert@linux-m68k.org
Cc: hch@lst.de
Cc: hmh@hmh.eng.br
Cc: linux-fbdev@vger.kernel.org
Cc: linux-mm@kvack.org
Cc: linux-pci@vger.kernel.org
Cc: mpe@ellerman.id.au
Cc: mst@redhat.com
Cc: ralf@linux-mips.org
Cc: ross.zwisler@linux.intel.com
Cc: stefan.bader@canonical.com
Cc: tj@kernel.org
Cc: ville.syrjala@linux.intel.com
Link: http://lkml.kernel.org/r/1436491499-3289-5-git-send-email-mcgrof@do-not-panic.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Luis R. Rodriguez and committed by
Ingo Molnar
7d89a3cb 3cc2dac5

+8 -32
+1 -3
drivers/video/fbdev/aty/atyfb.h
··· 182 182 unsigned long irq_flags; 183 183 unsigned int irq; 184 184 spinlock_t int_lock; 185 - #ifdef CONFIG_MTRR 186 - int mtrr_aper; 187 - #endif 185 + int wc_cookie; 188 186 u32 mem_cntl; 189 187 struct crtc saved_crtc; 190 188 union aty_pll saved_pll;
+7 -29
drivers/video/fbdev/aty/atyfb_base.c
··· 98 98 #ifdef CONFIG_PMAC_BACKLIGHT 99 99 #include <asm/backlight.h> 100 100 #endif 101 - #ifdef CONFIG_MTRR 102 - #include <asm/mtrr.h> 103 - #endif 104 101 105 102 /* 106 103 * Debug flags. ··· 300 303 }; 301 304 302 305 static bool noaccel; 303 - #ifdef CONFIG_MTRR 304 306 static bool nomtrr; 305 - #endif 306 307 static int vram; 307 308 static int pll; 308 309 static int mclk; ··· 2623 2628 aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) | 2624 2629 BUS_APER_REG_DIS, par); 2625 2630 2626 - #ifdef CONFIG_MTRR 2627 - par->mtrr_aper = -1; 2628 - if (!nomtrr) { 2631 + if (!nomtrr) 2629 2632 /* 2630 2633 * Only the ioremap_wc()'d area will get WC here 2631 2634 * since ioremap_uc() was used on the entire PCI BAR. 2632 2635 */ 2633 - par->mtrr_aper = mtrr_add(par->res_start, par->res_size, 2634 - MTRR_TYPE_WRCOMB, 1); 2635 - } 2636 - #endif 2636 + par->wc_cookie = arch_phys_wc_add(par->res_start, 2637 + par->res_size); 2637 2638 2638 2639 info->fbops = &atyfb_ops; 2639 2640 info->pseudo_palette = par->pseudo_palette; ··· 2757 2766 /* restore video mode */ 2758 2767 aty_set_crtc(par, &par->saved_crtc); 2759 2768 par->pll_ops->set_pll(info, &par->saved_pll); 2769 + arch_phys_wc_del(par->wc_cookie); 2760 2770 2761 - #ifdef CONFIG_MTRR 2762 - if (par->mtrr_aper >= 0) { 2763 - mtrr_del(par->mtrr_aper, 0, 0); 2764 - par->mtrr_aper = -1; 2765 - } 2766 - #endif 2767 2771 return ret; 2768 2772 } 2769 2773 ··· 3658 3672 * Map the video memory (physical address given) 3659 3673 * to somewhere in the kernel address space. 3660 3674 */ 3661 - info->screen_base = ioremap(phys_vmembase[m64_num], phys_size[m64_num]); 3675 + info->screen_base = ioremap_wc(phys_vmembase[m64_num], 3676 + phys_size[m64_num]); 3662 3677 info->fix.smem_start = (unsigned long)info->screen_base; /* Fake! */ 3663 3678 par->ati_regbase = ioremap(phys_guiregbase[m64_num], 0x10000) + 3664 3679 0xFC00ul; ··· 3725 3738 if (M64_HAS(MOBIL_BUS)) 3726 3739 aty_bl_exit(info->bl_dev); 3727 3740 #endif 3741 + arch_phys_wc_del(par->wc_cookie); 3728 3742 3729 - #ifdef CONFIG_MTRR 3730 - if (par->mtrr_aper >= 0) { 3731 - mtrr_del(par->mtrr_aper, 0, 0); 3732 - par->mtrr_aper = -1; 3733 - } 3734 - #endif 3735 3743 #ifndef __sparc__ 3736 3744 if (par->ati_regbase) 3737 3745 iounmap(par->ati_regbase); ··· 3842 3860 while ((this_opt = strsep(&options, ",")) != NULL) { 3843 3861 if (!strncmp(this_opt, "noaccel", 7)) { 3844 3862 noaccel = 1; 3845 - #ifdef CONFIG_MTRR 3846 3863 } else if (!strncmp(this_opt, "nomtrr", 6)) { 3847 3864 nomtrr = 1; 3848 - #endif 3849 3865 } else if (!strncmp(this_opt, "vram:", 5)) 3850 3866 vram = simple_strtoul(this_opt + 5, NULL, 0); 3851 3867 else if (!strncmp(this_opt, "pll:", 4)) ··· 4013 4033 MODULE_PARM_DESC(comp_sync, "Set composite sync signal to low (0) or high (1)"); 4014 4034 module_param(mode, charp, 0); 4015 4035 MODULE_PARM_DESC(mode, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); 4016 - #ifdef CONFIG_MTRR 4017 4036 module_param(nomtrr, bool, 0); 4018 4037 MODULE_PARM_DESC(nomtrr, "bool: disable use of MTRR registers"); 4019 - #endif