On Fri, 2024-03-01 at 14:42 +0100, Thomas Zimmermann wrote: > 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. > > v7: > * update xe driver > v6: > * return errors from client callbacks (Jouni) > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> Reviewed-by: Jouni Högander <jouni.hogander@xxxxxxxxx> > --- > .../drm/i915/display/intel_display_driver.c | 1 - > drivers/gpu/drm/i915/display/intel_fbdev.c | 33 ++++++++++++++--- > -- > drivers/gpu/drm/i915/display/intel_fbdev.h | 9 ----- > drivers/gpu/drm/i915/i915_driver.c | 22 ------------- > drivers/gpu/drm/xe/display/xe_display.c | 9 ----- > 5 files changed, 25 insertions(+), 49 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c > b/drivers/gpu/drm/i915/display/intel_display_driver.c > index 87dd07e0d138d..ca92c48fbdc49 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_driver.c > +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c > @@ -98,7 +98,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, > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c > b/drivers/gpu/drm/i915/display/intel_fbdev.c > index 32aeb5faf706b..938ee709813df 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -546,13 +546,13 @@ void intel_fbdev_set_suspend(struct drm_device > *dev, int state, bool synchronous > 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); > > @@ -563,21 +563,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; > } > > /* > @@ -589,12 +597,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 = { > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h > b/drivers/gpu/drm/i915/display/intel_fbdev.h > index 04fd523a50232..8c953f102ba22 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.h > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.h > @@ -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; > diff --git a/drivers/gpu/drm/i915/i915_driver.c > b/drivers/gpu/drm/i915/i915_driver.c > index 97910a85e3917..e0f13c62a1832 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -923,27 +923,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; > @@ -1834,7 +1813,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), > > diff --git a/drivers/gpu/drm/xe/display/xe_display.c > b/drivers/gpu/drm/xe/display/xe_display.c > index e4db069f0db3f..cdbc3f04c80a7 100644 > --- a/drivers/gpu/drm/xe/display/xe_display.c > +++ b/drivers/gpu/drm/xe/display/xe_display.c > @@ -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)