drm/i915: Enable GTT caching on gen8
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 19 May 2015 17:32:57 +0000 (20:32 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 22 May 2015 06:08:36 +0000 (08:08 +0200)
GTT caching was disabled by default on gen8 due to not working with
big pages. Some information suggests that it got fixed, but still
GTT caching has been left disabled by default. Or could be it just
meant that the default was changed to off, and hence the problem
got solved.

Enable GTT caching in the hopes of some performance increase.
Whether or not the big pages issue has been fixed is irrelevant
at this stage since we don't use big pages.

This gives me a 1-2% improvement in xonotic on my BSW. Haven't tried
BDW, but supposedly it has larger TLBs so might not benefit as much.
On HSW GTT caching is enabled by default.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_pm.c

index 85088a3cf2954c0c538b0a9c013f4e6ad162371a..607766d0a15d3b97d4dce95a5cd4839ea6ed1905 100644 (file)
@@ -1461,6 +1461,8 @@ enum skl_disp_power_wells {
 #define RING_HWS_PGA(base)     ((base)+0x80)
 #define RING_HWS_PGA_GEN6(base)        ((base)+0x2080)
 
+#define HSW_GTT_CACHE_EN       0x4024
+#define   GTT_CACHE_EN_ALL     0xF0007FFF
 #define GEN7_WR_WATERMARK      0x4028
 #define GEN7_GFX_PRIO_CTRL     0x402C
 #define ARB_MODE               0x4030
index 85ba52bacfea26bb99246bfd421165ee2dde17c2..84809a67fac8145f4787bf87ae625c41caf6745d 100644 (file)
@@ -6214,6 +6214,13 @@ static void broadwell_init_clock_gating(struct drm_device *dev)
        I915_WRITE(GEN8_L3SQCREG1, BDW_WA_L3SQCREG1_DEFAULT);
        I915_WRITE(GEN7_MISCCPCTL, misccpctl);
 
+       /*
+        * WaGttCachingOffByDefault:bdw
+        * GTT cache may not work with big pages, so if those
+        * are ever enabled GTT cache may need to be disabled.
+        */
+       I915_WRITE(HSW_GTT_CACHE_EN, GTT_CACHE_EN_ALL);
+
        lpt_init_clock_gating(dev);
 }
 
@@ -6489,6 +6496,12 @@ static void cherryview_init_clock_gating(struct drm_device *dev)
        /* WaDisableSDEUnitClockGating:chv */
        I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
                   GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
+
+       /*
+        * GTT cache may not work with big pages, so if those
+        * are ever enabled GTT cache may need to be disabled.
+        */
+       I915_WRITE(HSW_GTT_CACHE_EN, GTT_CACHE_EN_ALL);
 }
 
 static void g4x_init_clock_gating(struct drm_device *dev)