drm/i915: don't increment the FBC threshold at fbc_enable
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Tue, 30 Jun 2015 13:53:05 +0000 (10:53 -0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 3 Jul 2015 05:39:00 +0000 (07:39 +0200)
We first set the threshold value when we're allocating the CFB, and
then later at {ilk,gen7}_fbc_enable() we increment it in case we're
using 16bpp. While that is correct, it is dangerous: if we rework the
code a little bit in a way that allows us to call intel_fbc_enable()
without necessarily calling i915_gem_stolen_setup_compression() first,
we might end up incrementing threshold more than once. To prevent
that, increment a temporary variable instead.

v2: Rebase.

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_fbc.c

index 50ed3332def1e072a0abd076fc38248c03d871fe..9e55b9badb4bc1ed97d79ba0654d47f672d0e071 100644 (file)
@@ -188,14 +188,15 @@ static void ilk_fbc_enable(struct drm_crtc *crtc)
        struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 dpfc_ctl;
+       int threshold = dev_priv->fbc.threshold;
 
        dev_priv->fbc.enabled = true;
 
        dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane);
        if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
-               dev_priv->fbc.threshold++;
+               threshold++;
 
-       switch (dev_priv->fbc.threshold) {
+       switch (threshold) {
        case 4:
        case 3:
                dpfc_ctl |= DPFC_CTL_LIMIT_4X;
@@ -259,6 +260,7 @@ static void gen7_fbc_enable(struct drm_crtc *crtc)
        struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 dpfc_ctl;
+       int threshold = dev_priv->fbc.threshold;
 
        dev_priv->fbc.enabled = true;
 
@@ -267,9 +269,9 @@ static void gen7_fbc_enable(struct drm_crtc *crtc)
                dpfc_ctl |= IVB_DPFC_CTL_PLANE(intel_crtc->plane);
 
        if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
-               dev_priv->fbc.threshold++;
+               threshold++;
 
-       switch (dev_priv->fbc.threshold) {
+       switch (threshold) {
        case 4:
        case 3:
                dpfc_ctl |= DPFC_CTL_LIMIT_4X;