]> git.dujemihanovic.xyz Git - linux.git/commitdiff
drm/{i915,xe}: Implement fbdev client callbacks
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 9 Apr 2024 08:04:27 +0000 (10:04 +0200)
committerJani Nikula <jani.nikula@intel.com>
Thu, 25 Apr 2024 11:25:54 +0000 (14:25 +0300)
Move code from ad-hoc fbdev callbacks into DRM client functions
and remove the old callbacks. The functions instruct the client
to poll for changed output or restore the display.

The DRM core calls both, the old callbacks and the new client
helpers, from the same places. The new functions perform the same
operation as before, so there's no change in functionality.

Fox xe, remove xe_display_last_close(), which restored the fbdev
display. As with i915, the DRM core's drm_lastclose() performs
this operation automatically.

v8:
- mention xe in commit message

v7:
- update xe driver

v6:
- return errors from client callbacks (Jouni)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
Acked-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240409081029.17843-6-tzimmermann@suse.de
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_display_driver.c
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/i915/display/intel_fbdev.h
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/xe/display/xe_display.c

index 951a30a6b7730b5aaeff8be1ac42e2d1bef51925..6cea4e39ae8f72f69a8e2028d3c2bf6d81677bb8 100644 (file)
@@ -99,7 +99,6 @@ void intel_display_driver_init_hw(struct drm_i915_private *i915)
 static const struct drm_mode_config_funcs intel_mode_funcs = {
        .fb_create = intel_user_framebuffer_create,
        .get_format_info = intel_fb_get_format_info,
-       .output_poll_changed = intel_fbdev_output_poll_changed,
        .mode_valid = intel_mode_valid,
        .atomic_check = intel_atomic_check,
        .atomic_commit = intel_atomic_commit,
index 4d0dba6c47d3a2f491e786da2d63c9de94610acf..f783de611a7f5eba137b75607be5d74418101c2d 100644 (file)
@@ -551,13 +551,13 @@ set_suspend:
        intel_fbdev_hpd_set_suspend(dev_priv, state);
 }
 
-void intel_fbdev_output_poll_changed(struct drm_device *dev)
+static int intel_fbdev_output_poll_changed(struct drm_device *dev)
 {
        struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev;
        bool send_hpd;
 
        if (!ifbdev)
-               return;
+               return -EINVAL;
 
        intel_fbdev_sync(ifbdev);
 
@@ -568,21 +568,29 @@ void intel_fbdev_output_poll_changed(struct drm_device *dev)
 
        if (send_hpd && (ifbdev->vma || ifbdev->helper.deferred_setup))
                drm_fb_helper_hotplug_event(&ifbdev->helper);
+
+       return 0;
 }
 
-void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
+static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
 {
        struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;
+       int ret;
 
        if (!ifbdev)
-               return;
+               return -EINVAL;
 
        intel_fbdev_sync(ifbdev);
        if (!ifbdev->vma)
-               return;
+               return -ENOMEM;
 
-       if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper) == 0)
-               intel_fbdev_invalidate(ifbdev);
+       ret = drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper);
+       if (ret)
+               return ret;
+
+       intel_fbdev_invalidate(ifbdev);
+
+       return 0;
 }
 
 /*
@@ -594,12 +602,21 @@ static void intel_fbdev_client_unregister(struct drm_client_dev *client)
 
 static int intel_fbdev_client_restore(struct drm_client_dev *client)
 {
+       struct drm_i915_private *dev_priv = to_i915(client->dev);
+       int ret;
+
+       ret = intel_fbdev_restore_mode(dev_priv);
+       if (ret)
+               return ret;
+
+       vga_switcheroo_process_delayed_switch();
+
        return 0;
 }
 
 static int intel_fbdev_client_hotplug(struct drm_client_dev *client)
 {
-       return 0;
+       return intel_fbdev_output_poll_changed(client->dev);
 }
 
 static const struct drm_client_funcs intel_fbdev_client_funcs = {
index 04fd523a502329d803b58fc5e57146e236eee07f..8c953f102ba22e72b872e78e7f4aa9c1cb784b5e 100644 (file)
@@ -19,8 +19,6 @@ void intel_fbdev_initial_config_async(struct drm_i915_private *dev_priv);
 void intel_fbdev_unregister(struct drm_i915_private *dev_priv);
 void intel_fbdev_fini(struct drm_i915_private *dev_priv);
 void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous);
-void intel_fbdev_output_poll_changed(struct drm_device *dev);
-void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv);
 struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
 #else
 static inline int intel_fbdev_init(struct drm_device *dev)
@@ -44,13 +42,6 @@ static inline void intel_fbdev_set_suspend(struct drm_device *dev, int state, bo
 {
 }
 
-static inline void intel_fbdev_output_poll_changed(struct drm_device *dev)
-{
-}
-
-static inline void intel_fbdev_restore_mode(struct drm_i915_private *i915)
-{
-}
 static inline struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev)
 {
        return NULL;
index 4b9233c07a22c6e12d4705c37a44fe6fe920d40f..6551c806e2ae0cbb78d13a3409fca6ffcd9106ad 100644 (file)
@@ -920,27 +920,6 @@ static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
        return 0;
 }
 
-/**
- * i915_driver_lastclose - clean up after all DRM clients have exited
- * @dev: DRM device
- *
- * Take care of cleaning up after all DRM clients have exited.  In the
- * mode setting case, we want to restore the kernel's initial mode (just
- * in case the last client left us in a bad state).
- *
- * Additionally, in the non-mode setting case, we'll tear down the GTT
- * and DMA structures, since the kernel won't be using them, and clea
- * up any GEM state.
- */
-static void i915_driver_lastclose(struct drm_device *dev)
-{
-       struct drm_i915_private *i915 = to_i915(dev);
-
-       intel_fbdev_restore_mode(i915);
-
-       vga_switcheroo_process_delayed_switch();
-}
-
 static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
@@ -1831,7 +1810,6 @@ static const struct drm_driver i915_drm_driver = {
            DRIVER_SYNCOBJ_TIMELINE,
        .release = i915_driver_release,
        .open = i915_driver_open,
-       .lastclose = i915_driver_lastclose,
        .postclose = i915_driver_postclose,
        .show_fdinfo = PTR_IF(IS_ENABLED(CONFIG_PROC_FS), i915_drm_client_fdinfo),
 
index e4db069f0db3f1fd27ed80eb84fc4544ea0831df..cdbc3f04c80a7ea7d1959d43b1fd6e50092d6e57 100644 (file)
@@ -51,14 +51,6 @@ bool xe_display_driver_probe_defer(struct pci_dev *pdev)
        return intel_display_driver_probe_defer(pdev);
 }
 
-static void xe_display_last_close(struct drm_device *dev)
-{
-       struct xe_device *xe = to_xe_device(dev);
-
-       if (xe->info.enable_display)
-               intel_fbdev_restore_mode(to_xe_device(dev));
-}
-
 /**
  * xe_display_driver_set_hooks - Add driver flags and hooks for display
  * @driver: DRM device driver
@@ -73,7 +65,6 @@ void xe_display_driver_set_hooks(struct drm_driver *driver)
                return;
 
        driver->driver_features |= DRIVER_MODESET | DRIVER_ATOMIC;
-       driver->lastclose = xe_display_last_close;
 }
 
 static void unset_display_features(struct xe_device *xe)