lkml.org 
[lkml]   [2015]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 06/11] drivers/video/fbdev/arkfb.c: Use arch_phys_wc_add() and pci_iomap_wc()
    Date
    From: "Luis R. Rodriguez" <mcgrof@suse.com>

    Convert the driver from using the x86-specific MTRR code to the
    architecture-agnostic arch_phys_wc_add(). It will avoid MTRRs if
    write-combining is available. In order to take advantage of that also
    ensure the ioremapped 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 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>
    Acked-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Antonino Daplas <adaplas@gmail.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: benh@kernel.crashing.org
    Cc: bhelgaas@google.com
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Dave Airlie <airlied@redhat.com>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: linux-fbdev@vger.kernel.org
    Cc: linux-pci@vger.kernel.org
    Cc: mst@redhat.com
    Cc: Suresh Siddha <sbsiddha@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: toshi.kani@hp.com
    Link: http://lkml.kernel.org/r/1435195342-26879-8-git-send-email-mcgrof@do-not-panic.com
    Signed-off-by: Borislav Petkov <bp@suse.de>
    ---
    drivers/video/fbdev/arkfb.c | 36 +++++-------------------------------
    1 file changed, 5 insertions(+), 31 deletions(-)

    diff --git a/drivers/video/fbdev/arkfb.c b/drivers/video/fbdev/arkfb.c
    index b305a1e7cc76..6a317de7082c 100644
    --- a/drivers/video/fbdev/arkfb.c
    +++ b/drivers/video/fbdev/arkfb.c
    @@ -26,13 +26,9 @@
    #include <linux/console.h> /* Why should fb driver call console functions? because console_lock() */
    #include <video/vga.h>

    -#ifdef CONFIG_MTRR
    -#include <asm/mtrr.h>
    -#endif
    -
    struct arkfb_info {
    int mclk_freq;
    - int mtrr_reg;
    + int wc_cookie;

    struct dac_info *dac;
    struct vgastate state;
    @@ -102,10 +98,6 @@ static const struct svga_timing_regs ark_timing_regs = {

    static char *mode_option = "640x480-8@60";

    -#ifdef CONFIG_MTRR
    -static int mtrr = 1;
    -#endif
    -
    MODULE_AUTHOR("(c) 2007 Ondrej Zajicek <santiago@crfreenet.org>");
    MODULE_LICENSE("GPL");
    MODULE_DESCRIPTION("fbdev driver for ARK 2000PV");
    @@ -115,11 +107,6 @@ MODULE_PARM_DESC(mode_option, "Default video mode ('640x480-8@60', etc)");
    module_param_named(mode, mode_option, charp, 0444);
    MODULE_PARM_DESC(mode, "Default video mode ('640x480-8@60', etc) (deprecated)");

    -#ifdef CONFIG_MTRR
    -module_param(mtrr, int, 0444);
    -MODULE_PARM_DESC(mtrr, "Enable write-combining with MTRR (1=enable, 0=disable, default=1)");
    -#endif
    -
    static int threshold = 4;

    module_param(threshold, int, 0644);
    @@ -1002,7 +989,7 @@ static int ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
    info->fix.smem_len = pci_resource_len(dev, 0);

    /* Map physical IO memory address into kernel space */
    - info->screen_base = pci_iomap(dev, 0, 0);
    + info->screen_base = pci_iomap_wc(dev, 0, 0);
    if (! info->screen_base) {
    rc = -ENOMEM;
    dev_err(info->device, "iomap for framebuffer failed\n");
    @@ -1057,14 +1044,8 @@ static int ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)

    /* Record a reference to the driver data */
    pci_set_drvdata(dev, info);
    -
    -#ifdef CONFIG_MTRR
    - if (mtrr) {
    - par->mtrr_reg = -1;
    - par->mtrr_reg = mtrr_add(info->fix.smem_start, info->fix.smem_len, MTRR_TYPE_WRCOMB, 1);
    - }
    -#endif
    -
    + par->wc_cookie = arch_phys_wc_add(info->fix.smem_start,
    + info->fix.smem_len);
    return 0;

    /* Error handling */
    @@ -1092,14 +1073,7 @@ static void ark_pci_remove(struct pci_dev *dev)

    if (info) {
    struct arkfb_info *par = info->par;
    -
    -#ifdef CONFIG_MTRR
    - if (par->mtrr_reg >= 0) {
    - mtrr_del(par->mtrr_reg, 0, 0);
    - par->mtrr_reg = -1;
    - }
    -#endif
    -
    + arch_phys_wc_del(par->wc_cookie);
    dac_release(par->dac);
    unregister_framebuffer(info);
    fb_dealloc_cmap(&info->cmap);
    --
    2.4.3


    \
     
     \ /
      Last update: 2015-08-24 21:41    [W:2.651 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site