| From 626bf90fe03fa080d8df06bb0397c95c53ae8e27 Mon Sep 17 00:00:00 2001 |
| From: Simon Ser <contact@emersion.fr> |
| Date: Mon, 30 Mar 2020 09:23:21 +0000 |
| Subject: drm/amd/display: add basic atomic check for cursor plane |
| |
| From: Simon Ser <contact@emersion.fr> |
| |
| commit 626bf90fe03fa080d8df06bb0397c95c53ae8e27 upstream. |
| |
| 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: Simon Ser <contact@emersion.fr> |
| Reported-by: Roman 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: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 ++++++++++++++++++++-- |
| 1 file changed, 24 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -7716,6 +7716,7 @@ static int dm_update_plane_state(struct |
| struct drm_crtc_state *old_crtc_state, *new_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 amdgpu_crtc *new_acrtc; |
| bool needs_reset; |
| int ret = 0; |
| |
| @@ -7725,9 +7726,30 @@ static int dm_update_plane_state(struct |
| dm_new_plane_state = to_dm_plane_state(new_plane_state); |
| dm_old_plane_state = to_dm_plane_state(old_plane_state); |
| |
| - /*TODO Implement atomic check for cursor plane */ |
| - if (plane->type == DRM_PLANE_TYPE_CURSOR) |
| + /*TODO Implement better atomic check for cursor plane */ |
| + if (plane->type == DRM_PLANE_TYPE_CURSOR) { |
| + if (!enable || !new_plane_crtc || |
| + drm_atomic_plane_disabling(plane->state, new_plane_state)) |
| + 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, |
| new_plane_state); |