Patch "drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-amdgpu-dc-require-primary-plane-to-be-enabled-wh.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit fcfab48c19a02ba520fcd154377505948229ad9a
Author: Michel Dänzer <mdaenzer@xxxxxxxxxx>
Date:   Fri Sep 4 12:43:04 2020 +0200

    drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is
    
    [ Upstream commit 2f228aab21bbc74e90e267a721215ec8be51daf7 ]
    
    Don't check drm_crtc_state::active for this either, per its
    documentation in include/drm/drm_crtc.h:
    
     * Hence drivers must not consult @active in their various
     * &drm_mode_config_funcs.atomic_check callback to reject an atomic
     * commit.
    
    atomic_remove_fb disables the CRTC as needed for disabling the primary
    plane.
    
    This prevents at least the following problems if the primary plane gets
    disabled (e.g. due to destroying the FB assigned to the primary plane,
    as happens e.g. with mutter in Wayland mode):
    
    * The legacy cursor ioctl returned EINVAL for a non-0 cursor FB ID
      (which enables the cursor plane).
    * If the cursor plane was enabled, changing the legacy DPMS property
      value from off to on returned EINVAL.
    
    v2:
    * Minor changes to code comment and commit log, per review feedback.
    
    GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1108
    GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1165
    GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1344
    Suggested-by: Daniel Vetter <daniel.vetter@xxxxxxxx>
    Acked-by: Daniel Vetter <daniel.vetter@xxxxxxxx>
    Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@xxxxxxx>
    Signed-off-by: Michel Dänzer <mdaenzer@xxxxxxxxxx>
    Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

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 60e50181f6d39..2384aa018993d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4299,19 +4299,6 @@ static void dm_crtc_helper_disable(struct drm_crtc *crtc)
 {
 }
 
-static bool does_crtc_have_active_cursor(struct drm_crtc_state *new_crtc_state)
-{
-	struct drm_device *dev = new_crtc_state->crtc->dev;
-	struct drm_plane *plane;
-
-	drm_for_each_plane_mask(plane, dev, new_crtc_state->plane_mask) {
-		if (plane->type == DRM_PLANE_TYPE_CURSOR)
-			return true;
-	}
-
-	return false;
-}
-
 static int count_crtc_active_planes(struct drm_crtc_state *new_crtc_state)
 {
 	struct drm_atomic_state *state = new_crtc_state->state;
@@ -4391,19 +4378,20 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,
 		return ret;
 	}
 
-	/* In some use cases, like reset, no stream is attached */
-	if (!dm_crtc_state->stream)
-		return 0;
-
 	/*
-	 * We want at least one hardware plane enabled to use
-	 * the stream with a cursor enabled.
+	 * We require the primary plane to be enabled whenever the CRTC is, otherwise
+	 * drm_mode_cursor_universal may end up trying to enable the cursor plane while all other
+	 * planes are disabled, which is not supported by the hardware. And there is legacy
+	 * userspace which stops using the HW cursor altogether in response to the resulting EINVAL.
 	 */
-	if (state->enable && state->active &&
-	    does_crtc_have_active_cursor(state) &&
-	    dm_crtc_state->active_planes == 0)
+	if (state->enable &&
+	    !(state->plane_mask & drm_plane_mask(crtc->primary)))
 		return -EINVAL;
 
+	/* In some use cases, like reset, no stream is attached */
+	if (!dm_crtc_state->stream)
+		return 0;
+
 	if (dc_validate_stream(dc, dm_crtc_state->stream) == DC_OK)
 		return 0;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux