All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is
@ 2020-08-21 16:57 ` Michel Dänzer
  0 siblings, 0 replies; 46+ messages in thread
From: Michel Dänzer @ 2020-08-21 16:57 UTC (permalink / raw)
  To: Leo Li, Nicholas Kazlauskas; +Cc: dri-devel, amd-gfx, Daniel Vetter

From: Michel Dänzer <mdaenzer@redhat.com>

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.

The atomic helpers disable 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):

* Toggling CRTC active to 1 failed if the cursor plane was enabled
  (e.g. via legacy DPMS property & cursor ioctl).
* Enabling the cursor plane failed, e.g. via the legacy cursor ioctl.

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@ffwll.ch>
Signed-off-by: Michel Dänzer <mdaenzer@redhat.com>
---

Note that this will cause some IGT tests to fail without
https://patchwork.freedesktop.org/series/80904/ .

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 +++++++------------
 1 file changed, 11 insertions(+), 22 deletions(-)

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 897d60ade1e4..33c5739e221b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5262,19 +5262,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;
@@ -5338,19 +5325,21 @@ 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 the legacy cursor ioctl helper may end up trying to enable
+	 * the cursor plane while the primary plane is 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;
 
-- 
2.28.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 46+ messages in thread

end of thread, other threads:[~2020-09-15 21:00 UTC | newest]

Thread overview: 46+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-21 16:57 [PATCH] drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is Michel Dänzer
2020-08-21 16:57 ` Michel Dänzer
2020-08-21 18:07 ` Kazlauskas, Nicholas
2020-08-21 18:07   ` Kazlauskas, Nicholas
2020-08-22  9:59   ` Michel Dänzer
2020-08-22  9:59     ` Michel Dänzer
2020-08-24  7:43     ` Pekka Paalanen
2020-08-24  7:43       ` Pekka Paalanen
2020-08-25 14:55       ` Michel Dänzer
2020-08-25 14:55         ` Michel Dänzer
2020-09-01  7:57         ` Daniel Vetter
2020-09-01  7:57           ` Daniel Vetter
2020-09-01  8:56           ` Michel Dänzer
2020-09-01  8:56             ` Michel Dänzer
2020-09-01 10:34             ` Daniel Vetter
2020-09-01 10:34               ` Daniel Vetter
2020-08-25 16:58     ` Kazlauskas, Nicholas
2020-08-25 16:58       ` Kazlauskas, Nicholas
2020-08-26  8:24       ` Pekka Paalanen
2020-08-26  8:24         ` Pekka Paalanen
2020-08-26  8:58         ` Michel Dänzer
2020-08-26  8:58           ` Michel Dänzer
2020-09-01  7:54         ` Daniel Vetter
2020-09-01  7:54           ` Daniel Vetter
2020-09-01 13:58           ` Harry Wentland
2020-09-01 13:58             ` Harry Wentland
2020-09-02  7:02             ` Daniel Vetter
2020-09-02  7:02               ` Daniel Vetter
2020-09-02  9:26               ` Michel Dänzer
2020-09-02  9:26                 ` Michel Dänzer
2020-09-04 10:43 ` [PATCH v2] " Michel Dänzer
2020-09-04 10:43   ` Michel Dänzer
2020-09-07  7:57   ` Daniel Vetter
2020-09-07  7:57     ` Daniel Vetter
2020-09-14  7:52     ` Michel Dänzer
2020-09-14  7:52       ` Michel Dänzer
2020-09-14 14:37       ` Kazlauskas, Nicholas
2020-09-14 14:37         ` Kazlauskas, Nicholas
2020-09-14 15:22         ` Michel Dänzer
2020-09-14 15:22           ` Michel Dänzer
2020-09-14 15:33           ` Kazlauskas, Nicholas
2020-09-14 15:33             ` Kazlauskas, Nicholas
2020-09-14 15:44             ` Michel Dänzer
2020-09-14 15:44               ` Michel Dänzer
2020-09-15 21:00         ` Alex Deucher
2020-09-15 21:00           ` Alex Deucher

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.