From: Ville Syrjälä <[email protected]>

Don't issue a nuke from frontbuffer flush while a flip is pending.
This avoids the DSPADDR/DSPSURF rmw abuse from the pre-snb nuke
from racing with the DSPADDR/DSPSURF write being performed by
the flip/plane update. The flip itself will already cause the nuke
so a double nuke is redundant.

Signed-off-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_fbc.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c 
b/drivers/gpu/drm/i915/display/intel_fbc.c
index d657b5c6757b..86a0f024ef40 100644
--- a/drivers/gpu/drm/i915/display/intel_fbc.c
+++ b/drivers/gpu/drm/i915/display/intel_fbc.c
@@ -666,6 +666,10 @@ static bool intel_fbc_is_compressing(struct intel_fbc *fbc)
 
 static void intel_fbc_nuke(struct intel_fbc *fbc)
 {
+       struct drm_i915_private *i915 = fbc->i915;
+
+       drm_WARN_ON(&i915->drm, fbc->flip_pending);
+
        trace_intel_fbc_nuke(fbc->state.plane);
 
        fbc->funcs->nuke(fbc);
@@ -968,6 +972,7 @@ static void intel_fbc_update_state(struct 
intel_atomic_state *state,
        struct intel_fbc_state *fbc_state = &fbc->state;
 
        WARN_ON(plane_state->no_fbc_reason);
+       WARN_ON(fbc_state->plane && fbc_state->plane != plane);
 
        fbc_state->plane = plane;
 
@@ -1272,6 +1277,7 @@ static void __intel_fbc_disable(struct intel_fbc *fbc)
        __intel_fbc_cleanup_cfb(fbc);
 
        fbc->state.plane = NULL;
+       fbc->flip_pending = false;
        fbc->busy_bits = 0;
 }
 
@@ -1366,12 +1372,12 @@ static void __intel_fbc_flush(struct intel_fbc *fbc,
        if (origin == ORIGIN_FLIP || origin == ORIGIN_CURSOR_UPDATE)
                goto out;
 
-       if (fbc->busy_bits)
+       if (fbc->busy_bits || fbc->flip_pending)
                goto out;
 
        if (fbc->active)
                intel_fbc_nuke(fbc);
-       else if (!fbc->flip_pending)
+       else
                __intel_fbc_post_update(fbc);
 
 out:
-- 
2.34.1

Reply via email to