Skip to content

Commit

Permalink
drm/i915: Disable all planes before modesetting any pipes
Browse files Browse the repository at this point in the history
Let's disable planes on all pipes affected by the modeset before
we start doing the actual modeset. This means we have less
random planes enabled during the modeset, and it also mirrors
what we already do when enabling pipes on skl+ since we enable
planes on all pipes as the very last step. As a bonus we also
nuke a bunch og bigjoiner special casing.

I've occasionally pondered about going even furher here and
doing the pre_plane_update() stuff for all pipes first, then
actually disabling the planes, and finally running the rest
of the modeset sequence. This would potentially allow
parallelizing all the extra vblank waits across multiple pipes,
and would make the plane disable even more atomic. But let's
go one step a time here.

Cc: José Roberto de Souza <jose.souza@intel.com>
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211022103304.24164-4-ville.syrjala@linux.intel.com
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
  • Loading branch information
vsyrjala committed Oct 27, 2021
1 parent f28c595 commit 3991999
Showing 1 changed file with 13 additions and 15 deletions.
28 changes: 13 additions & 15 deletions drivers/gpu/drm/i915/display/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -8251,18 +8251,13 @@ static void intel_old_crtc_state_disables(struct intel_atomic_state *state,

drm_WARN_ON(&dev_priv->drm, old_crtc_state->bigjoiner_slave);

intel_crtc_disable_planes(state, crtc);

/*
* We still need special handling for disabling bigjoiner master
* and slaves since for slave we do not have encoder or plls
* so we dont need to disable those.
*/
if (old_crtc_state->bigjoiner) {
intel_crtc_disable_planes(state,
old_crtc_state->bigjoiner_linked_crtc);
if (old_crtc_state->bigjoiner)
old_crtc_state->bigjoiner_linked_crtc->active = false;
}

/*
* We need to disable pipe CRC before disabling the pipe,
Expand All @@ -8288,6 +8283,18 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
u32 handled = 0;
int i;

for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
new_crtc_state, i) {
if (!intel_crtc_needs_modeset(new_crtc_state))
continue;

if (!old_crtc_state->hw.active)
continue;

intel_pre_plane_update(state, crtc);
intel_crtc_disable_planes(state, crtc);
}

/* Only disable port sync and MST slaves */
for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
new_crtc_state, i) {
Expand All @@ -8306,7 +8313,6 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
!intel_dp_mst_is_slave_trans(old_crtc_state))
continue;

intel_pre_plane_update(state, crtc);
intel_old_crtc_state_disables(state, old_crtc_state,
new_crtc_state, crtc);
handled |= BIT(crtc->pipe);
Expand All @@ -8320,14 +8326,6 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
old_crtc_state->bigjoiner_slave)
continue;

intel_pre_plane_update(state, crtc);
if (old_crtc_state->bigjoiner) {
struct intel_crtc *slave =
old_crtc_state->bigjoiner_linked_crtc;

intel_pre_plane_update(state, slave);
}

if (old_crtc_state->hw.active)
intel_old_crtc_state_disables(state, old_crtc_state,
new_crtc_state, crtc);
Expand Down

0 comments on commit 3991999

Please sign in to comment.