drm/i915/fbc: Skip nuke when flip is pending
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ä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220315140001.1172-4-ville.syrjala@linux.intel.com Reviewed-by: Mika Kahola <mika.kahola@intel.com>
This commit is contained in:
parent
529b43dfcd
commit
de5bd083d2
1 changed files with 8 additions and 2 deletions
|
@ -667,6 +667,10 @@ static bool intel_fbc_is_compressing(struct intel_fbc *fbc)
|
||||||
|
|
||||||
static void intel_fbc_nuke(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);
|
trace_intel_fbc_nuke(fbc->state.plane);
|
||||||
|
|
||||||
fbc->funcs->nuke(fbc);
|
fbc->funcs->nuke(fbc);
|
||||||
|
@ -969,6 +973,7 @@ static void intel_fbc_update_state(struct intel_atomic_state *state,
|
||||||
struct intel_fbc_state *fbc_state = &fbc->state;
|
struct intel_fbc_state *fbc_state = &fbc->state;
|
||||||
|
|
||||||
WARN_ON(plane_state->no_fbc_reason);
|
WARN_ON(plane_state->no_fbc_reason);
|
||||||
|
WARN_ON(fbc_state->plane && fbc_state->plane != plane);
|
||||||
|
|
||||||
fbc_state->plane = plane;
|
fbc_state->plane = plane;
|
||||||
|
|
||||||
|
@ -1273,6 +1278,7 @@ static void __intel_fbc_disable(struct intel_fbc *fbc)
|
||||||
__intel_fbc_cleanup_cfb(fbc);
|
__intel_fbc_cleanup_cfb(fbc);
|
||||||
|
|
||||||
fbc->state.plane = NULL;
|
fbc->state.plane = NULL;
|
||||||
|
fbc->flip_pending = false;
|
||||||
fbc->busy_bits = 0;
|
fbc->busy_bits = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1367,12 +1373,12 @@ static void __intel_fbc_flush(struct intel_fbc *fbc,
|
||||||
if (origin == ORIGIN_FLIP || origin == ORIGIN_CURSOR_UPDATE)
|
if (origin == ORIGIN_FLIP || origin == ORIGIN_CURSOR_UPDATE)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (fbc->busy_bits)
|
if (fbc->busy_bits || fbc->flip_pending)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (fbc->active)
|
if (fbc->active)
|
||||||
intel_fbc_nuke(fbc);
|
intel_fbc_nuke(fbc);
|
||||||
else if (!fbc->flip_pending)
|
else
|
||||||
__intel_fbc_post_update(fbc);
|
__intel_fbc_post_update(fbc);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Add table
Reference in a new issue