]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm: Disable the cursor plane on atomic contexts with virtualized drivers
authorZack Rusin <zackr@vmware.com>
Mon, 23 Oct 2023 07:46:05 +0000 (09:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:19:08 +0000 (16:19 -0800)
commit 4e3b70da64a53784683cfcbac2deda5d6e540407 upstream.

Cursor planes on virtualized drivers have special meaning and require
that the clients handle them in specific ways, e.g. the cursor plane
should react to the mouse movement the way a mouse cursor would be
expected to and the client is required to set hotspot properties on it
in order for the mouse events to be routed correctly.

This breaks the contract as specified by the "universal planes". Fix it
by disabling the cursor planes on virtualized drivers while adding
a foundation on top of which it's possible to special case mouse cursor
planes for clients that want it.

Disabling the cursor planes makes some kms compositors which were broken,
e.g. Weston, fallback to software cursor which works fine or at least
better than currently while having no effect on others, e.g. gnome-shell
or kwin, which put virtualized drivers on a deny-list when running in
atomic context to make them fallback to legacy kms and avoid this issue.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Fixes: 681e7ec73044 ("drm: Allow userspace to ask for universal plane list (v2)")
Cc: <stable@vger.kernel.org> # v5.4+
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Cc: virtualization@lists.linux-foundation.org
Cc: spice-devel@lists.freedesktop.org
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Simon Ser <contact@emersion.fr>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231023074613.41327-2-aesteve@redhat.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/drm_plane.c
drivers/gpu/drm/qxl/qxl_drv.c
drivers/gpu/drm/vboxvideo/vbox_drv.c
drivers/gpu/drm/virtio/virtgpu_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
include/drm/drm_drv.h
include/drm/drm_file.h

index 01fbd3fb7b9ec59224c67fc5227e6bfcfb5ac394..311e179904a2ab025962bccdb1bbf81f4edf3378 100644 (file)
@@ -678,6 +678,19 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data,
                    !file_priv->universal_planes)
                        continue;
 
+               /*
+                * If we're running on a virtualized driver then,
+                * unless userspace advertizes support for the
+                * virtualized cursor plane, disable cursor planes
+                * because they'll be broken due to missing cursor
+                * hotspot info.
+                */
+               if (plane->type == DRM_PLANE_TYPE_CURSOR &&
+                   drm_core_check_feature(dev, DRIVER_CURSOR_HOTSPOT) &&
+                   file_priv->atomic &&
+                   !file_priv->supports_virtualized_cursor_plane)
+                       continue;
+
                if (drm_lease_held(file_priv, plane->base.id)) {
                        if (count < plane_resp->count_planes &&
                            put_user(plane->base.id, plane_ptr + count))
index b30ede1cf62d329389c2becc03836b9856082e4f..91930e84a9cd269f1c98ac669e175f96aa7ed391 100644 (file)
@@ -283,7 +283,7 @@ static const struct drm_ioctl_desc qxl_ioctls[] = {
 };
 
 static struct drm_driver qxl_driver = {
-       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
+       .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_CURSOR_HOTSPOT,
 
        .dumb_create = qxl_mode_dumb_create,
        .dumb_map_offset = drm_gem_ttm_dumb_map_offset,
index 047b958123341bf86ee83a5f1ef89548da34afea..cd9e66a06596a7a834af4917aa9f1f59811827a3 100644 (file)
@@ -182,7 +182,7 @@ DEFINE_DRM_GEM_FOPS(vbox_fops);
 
 static const struct drm_driver driver = {
        .driver_features =
-           DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
+           DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC | DRIVER_CURSOR_HOTSPOT,
 
        .fops = &vbox_fops,
        .name = DRIVER_NAME,
index 644b8ee51009bf92bf6263c098251fcb9b79b42b..148f09aaf99a7e76d13f801748b06f69223bb022 100644 (file)
@@ -177,7 +177,7 @@ static const struct drm_driver driver = {
         * out via drm_device::driver_features:
         */
        .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_RENDER | DRIVER_ATOMIC |
-                          DRIVER_SYNCOBJ | DRIVER_SYNCOBJ_TIMELINE,
+                          DRIVER_SYNCOBJ | DRIVER_SYNCOBJ_TIMELINE | DRIVER_CURSOR_HOTSPOT,
        .open = virtio_gpu_driver_open,
        .postclose = virtio_gpu_driver_postclose,
 
index 8b24ecf60e3ec5aba4da7a5fd6bcc94f1e6d6e23..d3e308fdfd5be80bb5c8a606eccceae82810da9a 100644 (file)
@@ -1611,7 +1611,7 @@ static const struct file_operations vmwgfx_driver_fops = {
 
 static const struct drm_driver driver = {
        .driver_features =
-       DRIVER_MODESET | DRIVER_RENDER | DRIVER_ATOMIC | DRIVER_GEM,
+       DRIVER_MODESET | DRIVER_RENDER | DRIVER_ATOMIC | DRIVER_GEM | DRIVER_CURSOR_HOTSPOT,
        .ioctls = vmw_ioctls,
        .num_ioctls = ARRAY_SIZE(vmw_ioctls),
        .master_set = vmw_master_set,
index 9813fa759b75d4dd39350a6eb687fbf455a64aed..0a72b13781f1397ded7cb0d742a02b59e36f57dd 100644 (file)
@@ -110,6 +110,15 @@ enum drm_driver_feature {
         * Driver supports user defined GPU VA bindings for GEM objects.
         */
        DRIVER_GEM_GPUVA                = BIT(8),
+       /**
+        * @DRIVER_CURSOR_HOTSPOT:
+        *
+        * Driver supports and requires cursor hotspot information in the
+        * cursor plane (e.g. cursor plane has to actually track the mouse
+        * cursor and the clients are required to set hotspot in order for
+        * the cursor planes to work correctly).
+        */
+       DRIVER_CURSOR_HOTSPOT           = BIT(9),
 
        /* IMPORTANT: Below are all the legacy flags, add new ones above. */
 
index 9c47a43f42a62d8cdd9e1cab0b8eb8996f58d13d..c8c2a63b9e7e05b832d3ce8de70665addb57714b 100644 (file)
@@ -228,6 +228,18 @@ struct drm_file {
         */
        bool is_master;
 
+       /**
+        * @supports_virtualized_cursor_plane:
+        *
+        * This client is capable of handling the cursor plane with the
+        * restrictions imposed on it by the virtualized drivers.
+        *
+        * This implies that the cursor plane has to behave like a cursor
+        * i.e. track cursor movement. It also requires setting of the
+        * hotspot properties by the client on the cursor plane.
+        */
+       bool supports_virtualized_cursor_plane;
+
        /**
         * @master:
         *