From: "Luis R. Rodriguez" <mcg...@suse.com>

We are burrying direct access to MTRR code support on
x86 in order to take advantage of PAT. In the future we
also want to make the default behaviour of ioremap_nocache()
to use strong UC, use of mtrr_add() on those systems
would make write-combining void.

In order to help both enable us to later make strong
UC default and in order to phase out direct MTRR access
code port the driver over to arch_phys_wc_add() and
annotate that the device driver requires systems to
boot with PAT disabled, with the nopat kernel parameter.

This is a worthy compromise given that the hardware is
really rare these days, and perhaps only some lost souls
in some third world country are expected to be using this
feature of the device driver.

Acked-by: Andy Walls <awa...@md.metrocast.net>
Acked-by: Mauro Carvalho Chehab <mche...@osg.samsung.com>
Cc: Andy Walls <awa...@md.metrocast.net>
Cc: Doug Ledford <dledf...@redhat.com>
Cc: Mauro Carvalho Chehab <mche...@osg.samsung.com>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: Suresh Siddha <sbsid...@gmail.com>
Cc: Ingo Molnar <mi...@elte.hu>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Juergen Gross <jgr...@suse.com>
Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
Cc: Dave Airlie <airl...@redhat.com>
Cc: Bjorn Helgaas <bhelg...@google.com>
Cc: Antonino Daplas <adap...@gmail.com>
Cc: Jean-Christophe Plagniol-Villard <plagn...@jcrosoft.com>
Cc: Tomi Valkeinen <tomi.valkei...@ti.com>
Cc: Dave Hansen <dave.han...@linux.intel.com>
Cc: Arnd Bergmann <a...@arndb.de>
Cc: Michael S. Tsirkin <m...@redhat.com>
Cc: Stefan Bader <stefan.ba...@canonical.com>
Cc: Ville Syrjälä <syrj...@sci.fi>
Cc: Borislav Petkov <b...@suse.de>
Cc: konrad.w...@oracle.com
Cc: toshi.k...@hp.com
Cc: Roger Pau Monné <roger....@citrix.com>
Cc: linux-media@vger.kernel.org
Cc: xen-de...@lists.xensource.com
Cc: linux-ker...@vger.kernel.org
Signed-off-by: Luis R. Rodriguez <mcg...@suse.com>
---
 drivers/media/pci/ivtv/Kconfig  |  3 +++
 drivers/media/pci/ivtv/ivtvfb.c | 58 ++++++++++++++++-------------------------
 2 files changed, 26 insertions(+), 35 deletions(-)

diff --git a/drivers/media/pci/ivtv/Kconfig b/drivers/media/pci/ivtv/Kconfig
index dd6ee57e..6e5867c 100644
--- a/drivers/media/pci/ivtv/Kconfig
+++ b/drivers/media/pci/ivtv/Kconfig
@@ -57,5 +57,8 @@ config VIDEO_FB_IVTV
          This is used in the Hauppauge PVR-350 card. There is a driver
          homepage at <http://www.ivtvdriver.org>.
 
+         In order to use this module, you will need to boot with PAT disabled
+         on x86 systems, using the nopat kernel parameter.
+
          To compile this driver as a module, choose M here: the
          module will be called ivtvfb.
diff --git a/drivers/media/pci/ivtv/ivtvfb.c b/drivers/media/pci/ivtv/ivtvfb.c
index 9ff1230..4cb365d 100644
--- a/drivers/media/pci/ivtv/ivtvfb.c
+++ b/drivers/media/pci/ivtv/ivtvfb.c
@@ -44,8 +44,8 @@
 #include <linux/ivtvfb.h>
 #include <linux/slab.h>
 
-#ifdef CONFIG_MTRR
-#include <asm/mtrr.h>
+#ifdef CONFIG_X86_64
+#include <asm/pat.h>
 #endif
 
 #include "ivtv-driver.h"
@@ -155,12 +155,11 @@ struct osd_info {
        /* Buffer size */
        u32 video_buffer_size;
 
-#ifdef CONFIG_MTRR
        /* video_base rounded down as required by hardware MTRRs */
        unsigned long fb_start_aligned_physaddr;
        /* video_base rounded up as required by hardware MTRRs */
        unsigned long fb_end_aligned_physaddr;
-#endif
+       int wc_cookie;
 
        /* Store the buffer offset */
        int set_osd_coords_x;
@@ -1099,6 +1098,8 @@ static int ivtvfb_init_vidmode(struct ivtv *itv)
 static int ivtvfb_init_io(struct ivtv *itv)
 {
        struct osd_info *oi = itv->osd_info;
+       /* Find the largest power of two that maps the whole buffer */
+       int size_shift = 31;
 
        mutex_lock(&itv->serialize_lock);
        if (ivtv_init_on_first_open(itv)) {
@@ -1132,29 +1133,16 @@ static int ivtvfb_init_io(struct ivtv *itv)
                        oi->video_pbase, oi->video_vbase,
                        oi->video_buffer_size / 1024);
 
-#ifdef CONFIG_MTRR
-       {
-               /* Find the largest power of two that maps the whole buffer */
-               int size_shift = 31;
-
-               while (!(oi->video_buffer_size & (1 << size_shift))) {
-                       size_shift--;
-               }
-               size_shift++;
-               oi->fb_start_aligned_physaddr = oi->video_pbase & ~((1 << 
size_shift) - 1);
-               oi->fb_end_aligned_physaddr = oi->video_pbase + 
oi->video_buffer_size;
-               oi->fb_end_aligned_physaddr += (1 << size_shift) - 1;
-               oi->fb_end_aligned_physaddr &= ~((1 << size_shift) - 1);
-               if (mtrr_add(oi->fb_start_aligned_physaddr,
-                       oi->fb_end_aligned_physaddr - 
oi->fb_start_aligned_physaddr,
-                            MTRR_TYPE_WRCOMB, 1) < 0) {
-                       IVTVFB_INFO("disabled mttr\n");
-                       oi->fb_start_aligned_physaddr = 0;
-                       oi->fb_end_aligned_physaddr = 0;
-               }
-       }
-#endif
-
+       while (!(oi->video_buffer_size & (1 << size_shift)))
+               size_shift--;
+       size_shift++;
+       oi->fb_start_aligned_physaddr = oi->video_pbase & ~((1 << size_shift) - 
1);
+       oi->fb_end_aligned_physaddr = oi->video_pbase + oi->video_buffer_size;
+       oi->fb_end_aligned_physaddr += (1 << size_shift) - 1;
+       oi->fb_end_aligned_physaddr &= ~((1 << size_shift) - 1);
+       oi->wc_cookie = arch_phys_wc_add(oi->fb_start_aligned_physaddr,
+                                        oi->fb_end_aligned_physaddr -
+                                        oi->fb_start_aligned_physaddr);
        /* Blank the entire osd. */
        memset_io(oi->video_vbase, 0, oi->video_buffer_size);
 
@@ -1172,14 +1160,7 @@ static void ivtvfb_release_buffers (struct ivtv *itv)
 
        /* Release pseudo palette */
        kfree(oi->ivtvfb_info.pseudo_palette);
-
-#ifdef CONFIG_MTRR
-       if (oi->fb_end_aligned_physaddr) {
-               mtrr_del(-1, oi->fb_start_aligned_physaddr,
-                       oi->fb_end_aligned_physaddr - 
oi->fb_start_aligned_physaddr);
-       }
-#endif
-
+       arch_phys_wc_del(oi->wc_cookie);
        kfree(oi);
        itv->osd_info = NULL;
 }
@@ -1284,6 +1265,13 @@ static int __init ivtvfb_init(void)
        int registered = 0;
        int err;
 
+#ifdef CONFIG_X86_64
+       if (WARN(pat_enabled(),
+                "ivtvfb needs PAT disabled, boot with nopat kernel 
parameter\n")) {
+               return -ENODEV;
+       }
+#endif
+
        if (ivtvfb_card_id < -1 || ivtvfb_card_id >= IVTV_MAX_CARDS) {
                printk(KERN_ERR "ivtvfb:  ivtvfb_card_id parameter is out of 
range (valid range: -1 - %d)\n",
                     IVTV_MAX_CARDS - 1);
-- 
2.3.2.209.gd67f9d5.dirty

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to