xf86-video-intel: configure.ac src/i830_driver.c

Keith Packard keithp at kemper.freedesktop.org
Thu Apr 17 10:05:03 PDT 2008


 configure.ac      |    3 +++
 src/i830_driver.c |   10 ++++++++++
 2 files changed, 13 insertions(+)

New commits:
commit c3fb62df4e60b63295f94c99b3c5de70dbf94e1c
Author: Keith Packard <keithp at keithp.com>
Date:   Thu Apr 17 10:04:55 2008 -0700

    Add a kludge-around to fix cd/wt bits in fb ptes on linux.
    
    Mmap from /sys/devices/pci* on linux forces the cache-disable and
    write-through bits, which turns our write-combining map into an
    uncached-map, seriously impacting performance. It turns out that a bug in
    mprotect allows us to fix this by disabling access to those pages and then
    immediately re-enabling them.

diff --git a/configure.ac b/configure.ac
index f203d65..c0a1e0b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,6 +44,9 @@ AM_PROG_CC_C_O
 AC_CHECK_PROG(gen4asm, [intel-gen4asm], yes, no)
 AM_CONDITIONAL(HAVE_GEN4ASM, test x$gen4asm = xyes)
 
+AC_CHECK_HEADERS(sys/mman.h)
+AC_CHECK_FUNCS(mprotect)
+
 AH_TOP([#include "xorg-server.h"])
 
 AC_ARG_WITH(xorg-module-dir,
diff --git a/src/i830_driver.c b/src/i830_driver.c
index dd3e235..6bf3566 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -197,6 +197,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "i830_debug.h"
 #include "i830_bios.h"
 #include "i830_video.h"
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+#include <sys/mman.h>
+#endif
 
 #ifdef INTEL_XVMC
 #define _INTEL_XVMC_SERVER_
@@ -685,6 +688,13 @@ I830MapMem(ScrnInfoPtr pScrn)
    err = pci_device_map_range (device, pI830->LinearAddr, pI830->FbMapSize,
 			       PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE,
 			       (void **) &pI830->FbBase);
+    if (err)
+	return FALSE;
+    /* KLUDGE ALERT -- rewrite the PTEs to turn off the CD and WT bits */
+#if HAVE_MPROTECT
+    mprotect (pI830->FbBase, pI830->FbMapSize, PROT_NONE);
+    mprotect (pI830->FbBase, pI830->FbMapSize, PROT_READ|PROT_WRITE);
+#endif
 #else
    pI830->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
 				 pI830->PciTag,


More information about the xorg-commit mailing list