| From cd449f79d9e8a2b681ea6505fbddafc6bfc9f37c Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Thu, 5 Sep 2019 20:53:18 +0200 |
| Subject: [PATCH] drm/atomic: Take the atomic toys away from X |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 26b1d3b527e7bf3e24b814d617866ac5199ce68d upstream. |
| |
| The -modesetting ddx has a totally broken idea of how atomic works: |
| - doesn't disable old connectors, assuming they get auto-disable like |
| with the legacy setcrtc |
| - assumes ASYNC_FLIP is wired through for the atomic ioctl |
| - not a single call to TEST_ONLY |
| |
| Iow the implementation is a 1:1 translation of legacy ioctls to |
| atomic, which is a) broken b) pointless. |
| |
| We already have bugs in both i915 and amdgpu-DC where this prevents us |
| from enabling neat features. |
| |
| If anyone ever cares about atomic in X we can easily add a new atomic |
| level (req->value == 2) for X to get back the shiny toys. |
| |
| Since these broken versions of -modesetting have been shipping, |
| there's really no other way to get out of this bind. |
| |
| v2: |
| - add an informational dmesg output (Rob, Ajax) |
| - reorder after the DRIVER_ATOMIC check to avoid useless noise (Ilia) |
| - allow req->value > 2 so that X can do another attempt at atomic in |
| the future |
| |
| v3: Go with paranoid, insist that the X should be first (suggested by |
| Rob) |
| |
| Cc: Ilia Mirkin <imirkin@alum.mit.edu> |
| References: https://gitlab.freedesktop.org/xorg/xserver/issues/629 |
| References: https://gitlab.freedesktop.org/xorg/xserver/merge_requests/180 |
| References: abbc0697d5fb ("drm/fb: revert the i915 Actually configure untiled displays from master") |
| Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> |
| Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> (v1) |
| Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> (v1) |
| Cc: Michel Dรคnzer <michel@daenzer.net> |
| Cc: Alex Deucher <alexdeucher@gmail.com> |
| Cc: Adam Jackson <ajax@redhat.com> |
| Acked-by: Adam Jackson <ajax@redhat.com> |
| Cc: Sean Paul <sean@poorly.run> |
| Cc: David Airlie <airlied@linux.ie> |
| Cc: Rob Clark <robdclark@gmail.com> |
| Acked-by: Rob Clark <robdclark@gmail.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190905185318.31363-1-daniel.vetter@ffwll.ch |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c |
| index 2263e3ddd822..f55acd56078e 100644 |
| --- a/drivers/gpu/drm/drm_ioctl.c |
| +++ b/drivers/gpu/drm/drm_ioctl.c |
| @@ -330,7 +330,12 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) |
| case DRM_CLIENT_CAP_ATOMIC: |
| if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) |
| return -EOPNOTSUPP; |
| - if (req->value > 1) |
| + /* The modesetting DDX has a totally broken idea of atomic. */ |
| + if (current->comm[0] == 'X' && req->value == 1) { |
| + pr_info("broken atomic modeset userspace detected, disabling atomic\n"); |
| + return -EOPNOTSUPP; |
| + } |
| + if (req->value > 2) |
| return -EINVAL; |
| file_priv->atomic = req->value; |
| file_priv->universal_planes = req->value; |
| -- |
| 2.7.4 |
| |