]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/fbdev-helper: don't force restores
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 4 Feb 2020 15:01:43 +0000 (16:01 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 11 Feb 2020 14:03:08 +0000 (15:03 +0100)
Instead check for master status, in case we've raced.

This is the last exception to the general rule that we restore fbcon
only when there's no master active. Compositors are supposed to drop
their master status before they switch to a different console back to
text mode (or just switch to text mode directly, without a vt switch).

This is known to break some subtests of kms_fbcon_fbt in igt, but they're
just wrong - it does a graphics/text mode switch for the vt without
updating the master status.

Also add a comment to the drm_client->restore hook that this is expected
going forward from all clients (there's currently just one).

v2: Also drop the force in pan_display

v3: Restore the _force to pan_display, this actually means _locked in that
path. Spotted by Noralf.

Cc: Noralf Trønnes <noralf@tronnes.org>
Reviewed-by: Noralf Trønnes <noralf@tronnes.org>
Tested-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200204150146.2006481-3-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_fb_helper.c
include/drm/drm_client.h

index f8e9051926083373943164a883a69764da4af284..936a66e501e7994c38662166da677479a0ea9f38 100644 (file)
@@ -250,17 +250,7 @@ int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
                return 0;
 
        mutex_lock(&fb_helper->lock);
-       /*
-        * TODO:
-        * We should bail out here if there is a master by dropping _force.
-        * Currently these igt tests fail if we do that:
-        * - kms_fbcon_fbt@psr
-        * - kms_fbcon_fbt@psr-suspend
-        *
-        * So first these tests need to be fixed so they drop master or don't
-        * have an fd open.
-        */
-       ret = drm_client_modeset_commit_force(&fb_helper->client);
+       ret = drm_client_modeset_commit(&fb_helper->client);
 
        do_delayed = fb_helper->delayed_hotplug;
        if (do_delayed)
index 5cf2c5dd8b1e63d19a52f61fd8393133f73af25b..d01d311023accd841ef94c9cdcaf8262152e1d05 100644 (file)
@@ -44,6 +44,11 @@ struct drm_client_funcs {
         * returns zero gets the privilege to restore and no more clients are
         * called. This callback is not called after @unregister has been called.
         *
+        * Note that the core does not guarantee exclusion against concurrent
+        * drm_open(). Clients need to ensure this themselves, for example by
+        * using drm_master_internal_acquire() and
+        * drm_master_internal_release().
+        *
         * This callback is optional.
         */
        int (*restore)(struct drm_client_dev *client);