From c3fb62df4e60b63295f94c99b3c5de70dbf94e1c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 17 Apr 2008 10:04:55 -0700 Subject: [PATCH] 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. --- configure.ac | 3 +++ src/i830_driver.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/configure.ac b/configure.ac index f203d658..c0a1e0bc 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 dd3e2356..6bf35662 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 +#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,