Commit 626bf90f authored by Simon Ser's avatar Simon Ser Committed by Alex Deucher
Browse files

drm/amd/display: add basic atomic check for cursor plane



This patch adds a basic cursor check when an atomic test-only commit is
performed. The position and size of the cursor plane is checked.

This should fix user-space relying on atomic checks to assign buffers to
planes.

Signed-off-by: default avatarSimon Ser <contact@emersion.fr>
Reported-by: default avatarRoman Gilg <subdiff@gmail.com>
References: https://github.com/emersion/libliftoff/issues/46


Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Harry Wentland <hwentlan@amd.com>
Reviewed-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 2346ef47
Loading
Loading
Loading
Loading
+24 −2
Original line number Original line Diff line number Diff line
@@ -7855,6 +7855,7 @@ static int dm_update_plane_state(struct dc *dc,
	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
	struct dm_crtc_state *dm_new_crtc_state, *dm_old_crtc_state;
	struct dm_crtc_state *dm_new_crtc_state, *dm_old_crtc_state;
	struct dm_plane_state *dm_new_plane_state, *dm_old_plane_state;
	struct dm_plane_state *dm_new_plane_state, *dm_old_plane_state;
	struct amdgpu_crtc *new_acrtc;
	bool needs_reset;
	bool needs_reset;
	int ret = 0;
	int ret = 0;


@@ -7864,10 +7865,31 @@ static int dm_update_plane_state(struct dc *dc,
	dm_new_plane_state = to_dm_plane_state(new_plane_state);
	dm_new_plane_state = to_dm_plane_state(new_plane_state);
	dm_old_plane_state = to_dm_plane_state(old_plane_state);
	dm_old_plane_state = to_dm_plane_state(old_plane_state);


	/*TODO Implement atomic check for cursor plane */
	/*TODO Implement better atomic check for cursor plane */
	if (plane->type == DRM_PLANE_TYPE_CURSOR)
	if (plane->type == DRM_PLANE_TYPE_CURSOR) {
		if (!enable || !new_plane_crtc ||
			drm_atomic_plane_disabling(plane->state, new_plane_state))
			return 0;
			return 0;


		new_acrtc = to_amdgpu_crtc(new_plane_crtc);

		if ((new_plane_state->crtc_w > new_acrtc->max_cursor_width) ||
			(new_plane_state->crtc_h > new_acrtc->max_cursor_height)) {
			DRM_DEBUG_ATOMIC("Bad cursor size %d x %d\n",
							 new_plane_state->crtc_w, new_plane_state->crtc_h);
			return -EINVAL;
		}

		if (new_plane_state->crtc_x <= -new_acrtc->max_cursor_width ||
			new_plane_state->crtc_y <= -new_acrtc->max_cursor_height) {
			DRM_DEBUG_ATOMIC("Bad cursor position %d, %d\n",
							 new_plane_state->crtc_x, new_plane_state->crtc_y);
			return -EINVAL;
		}

		return 0;
	}

	needs_reset = should_reset_plane(state, plane, old_plane_state,
	needs_reset = should_reset_plane(state, plane, old_plane_state,
					 new_plane_state);
					 new_plane_state);