| From 204f640da6914844b3270b41b29c84f6e3b74083 Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Thu, 28 Feb 2019 15:49:08 +0100 |
| Subject: drm/lease: Make sure implicit planes are leased |
| |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| commit 204f640da6914844b3270b41b29c84f6e3b74083 upstream. |
| |
| If userspace doesn't enable universal planes, then we automatically |
| add the primary and cursor planes. But for universal userspace there's |
| no such check (and maybe we only want to give the lessee one plane, |
| maybe not even the primary one), hence we need to check for the |
| implied plane. |
| |
| v2: don't forget setcrtc ioctl. |
| |
| v3: Still allow disabling of the crtc in SETCRTC. |
| |
| Cc: stable@vger.kernel.org |
| Cc: Keith Packard <keithp@keithp.com> |
| Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190228144910.26488-6-daniel.vetter@ffwll.ch |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/drm_crtc.c | 4 ++++ |
| drivers/gpu/drm/drm_plane.c | 8 ++++++++ |
| 2 files changed, 12 insertions(+) |
| |
| --- a/drivers/gpu/drm/drm_crtc.c |
| +++ b/drivers/gpu/drm/drm_crtc.c |
| @@ -595,6 +595,10 @@ int drm_mode_setcrtc(struct drm_device * |
| |
| plane = crtc->primary; |
| |
| + /* allow disabling with the primary plane leased */ |
| + if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id)) |
| + return -EACCES; |
| + |
| mutex_lock(&crtc->dev->mode_config.mutex); |
| drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); |
| retry: |
| --- a/drivers/gpu/drm/drm_plane.c |
| +++ b/drivers/gpu/drm/drm_plane.c |
| @@ -940,6 +940,11 @@ retry: |
| if (ret) |
| goto out; |
| |
| + if (!drm_lease_held(file_priv, crtc->cursor->base.id)) { |
| + ret = -EACCES; |
| + goto out; |
| + } |
| + |
| ret = drm_mode_cursor_universal(crtc, req, file_priv, &ctx); |
| goto out; |
| } |
| @@ -1042,6 +1047,9 @@ int drm_mode_page_flip_ioctl(struct drm_ |
| |
| plane = crtc->primary; |
| |
| + if (!drm_lease_held(file_priv, plane->base.id)) |
| + return -EACCES; |
| + |
| if (crtc->funcs->page_flip_target) { |
| u32 current_vblank; |
| int r; |