diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/2046-drm-amd-display-Don-t-set-mode_changed-false-if-the-.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/2046-drm-amd-display-Don-t-set-mode_changed-false-if-the-.patch | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/2046-drm-amd-display-Don-t-set-mode_changed-false-if-the-.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/2046-drm-amd-display-Don-t-set-mode_changed-false-if-the-.patch new file mode 100644 index 00000000..e12d8f01 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/2046-drm-amd-display-Don-t-set-mode_changed-false-if-the-.patch @@ -0,0 +1,64 @@ +From 50d40cd6913db43ae740da1d411b86439061a226 Mon Sep 17 00:00:00 2001 +From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Date: Thu, 30 May 2019 15:51:14 -0400 +Subject: [PATCH 2046/2940] drm/amd/display: Don't set mode_changed=false if + the stream was removed + +[Why] +When switching from vt to desktop with EDID emulation we can receive +an atomic commit such that we have a crtc where mode_changed = true. + +During the dm_update_crtc_state disable pass we remove the stream from +the context and free it on the dm_new_crtc_state. + +During the enable pass we compare the new provisional stream to the +dm_old_crtc_state->stream and determine that the stream is unchanged +and no scaling has been changed. + +Following this, new_crtc_state->mode_changed is then set to false. +The connectors haven't changed and the CRTC active state hasn't changed +so drm_atomic_crtc_needs_modeset returns false, so we jump to +skip_modeset and we hit: + +BUG_ON(dm_new_crtc_state->stream == NULL); + +...since the old stream is gone from the context and the new stream is +also still NULL. + +[How] +Ensure that we still a stream to reuse before checking if we can reuse +the old stream without a full modeset. + +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com> +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index e089e384b0ba..ad2eb220ff90 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -6295,7 +6295,17 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm, + } + + dm_new_crtc_state->abm_level = dm_new_conn_state->abm_level; +- if (dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) && ++ /* ++ * If we already removed the old stream from the context ++ * (and set the new stream to NULL) then we can't reuse ++ * the old stream even if the stream and scaling are unchanged. ++ * We'll hit the BUG_ON and black screen. ++ * ++ * TODO: Refactor this function to allow this check to work ++ * in all conditions. ++ */ ++ if (dm_new_crtc_state->stream && ++ dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) && + dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream)) { + new_crtc_state->mode_changed = false; + DRM_DEBUG_DRIVER("Mode change not required, setting mode_changed to %d", +-- +2.17.1 + |