]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915/gen9+: Preserve old allocation from crtc_state.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 8 Nov 2016 12:55:34 +0000 (13:55 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 15 Nov 2016 10:23:11 +0000 (11:23 +0100)
This is the last bit required for making nonblocking modesets work
correctly. The state in intel_crtc->hw_ddb is updated in the
nonblocking part of a nonblocking commit.

This means that even attempting a commit before a nonblocking modeset
completes will fail, because intel_crtc->hw_ddb still has stale values.
The stale values are 0 if the crtc is being enabled resulting in a
failure during atomic check, but it may also result in double use of
ddb allocations.

Fix this by explicitly copying the ddb allocation from the old state.
This has to be done explicitly, because a modeset that doesn't change
active pipes, or a modeset converted to a fastset will will clear the
current state.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1478609742-13603-4-git-send-email-maarten.lankhorst@linux.intel.com
[mlankhorst: Reword commit message.]
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_pm.c

index a5f75e19af80eed41e438046f54e45c5db2b7f74..62fe8a5c93658f77701d25230d593a7995897254 100644 (file)
@@ -14337,7 +14337,7 @@ static void skl_update_crtcs(struct drm_atomic_state *state,
                         * new ddb allocation to take effect.
                         */
                        if (!skl_ddb_entry_equal(&cstate->wm.skl.ddb,
-                                                &intel_crtc->hw_ddb) &&
+                                                &to_intel_crtc_state(old_crtc_state)->wm.skl.ddb) &&
                            !crtc->state->active_changed &&
                            intel_state->wm_results.dirty_pipes != updated)
                                vbl_wait = true;
index 5d53a0892187ded7fd23673387c5e2515a53c722..621713a29c8217f9a6ee289db38da0b3c942a36b 100644 (file)
@@ -3120,7 +3120,11 @@ skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
         * we currently hold.
         */
        if (!intel_state->active_pipe_changes) {
-               *alloc = to_intel_crtc(for_crtc)->hw_ddb;
+               /*
+                * alloc may be cleared by clear_intel_crtc_state,
+                * copy from old state to be sure
+                */
+               *alloc = to_intel_crtc_state(for_crtc->state)->wm.skl.ddb;
                return;
        }