Message ID | 20230328111422.23986-3-tzimmermann@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Convert fbdev to DRM client | expand |
On Tue, 28 Mar 2023, Thomas Zimmermann <tzimmermann@suse.de> wrote: > Initialize i915's fbdev client by giving an instance of struct > drm_client_funcsi to drm_client_init(). Also clean up with > drm_client_release(). > > Doing this in i915 prevents fbdev helpers from initializing and > releasing the client internally (see drm_fb_helper_init()). No > functional change yet; the client callbacks will be filled later. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++++++++++-- > 1 file changed, 39 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c > index 88de79279ce5..290da5e94bc5 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -364,6 +364,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev) > if (ifbdev->fb) > drm_framebuffer_remove(&ifbdev->fb->base); > > + drm_client_release(&ifbdev->helper.client); > drm_fb_helper_unprepare(&ifbdev->helper); > kfree(ifbdev); > } > @@ -656,6 +657,30 @@ void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv) > intel_fbdev_invalidate(ifbdev); > } > > +/* > + * Fbdev client and struct drm_client_funcs > + */ > + > +static void intel_fbdev_client_unregister(struct drm_client_dev *client) > +{ } > + > +static int intel_fbdev_client_restore(struct drm_client_dev *client) > +{ > + return 0; > +} > + > +static int intel_fbdev_client_hotplug(struct drm_client_dev *client) > +{ > + return 0; > +} > + > +static const struct drm_client_funcs intel_fbdev_client_funcs = { > + .owner = THIS_MODULE, > + .unregister = intel_fbdev_client_unregister, > + .restore = intel_fbdev_client_restore, > + .hotplug = intel_fbdev_client_hotplug, > +}; > + > int intel_fbdev_init(struct drm_device *dev) > { > struct drm_i915_private *dev_priv = to_i915(dev); > @@ -677,16 +702,26 @@ int intel_fbdev_init(struct drm_device *dev) > else > ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp; > > + ret = drm_client_init(dev, &ifbdev->helper.client, "i915-fbdev", > + &intel_fbdev_client_funcs); > + if (ret) > + goto err_drm_fb_helper_unprepare; > + > ret = drm_fb_helper_init(dev, &ifbdev->helper); > - if (ret) { > - kfree(ifbdev); > - return ret; > - } > + if (ret) > + goto err_drm_client_release; > > dev_priv->display.fbdev.fbdev = ifbdev; > INIT_WORK(&dev_priv->display.fbdev.suspend_work, intel_fbdev_suspend_worker); > > return 0; > + > +err_drm_client_release: > + drm_client_release(&ifbdev->helper.client); > +err_drm_fb_helper_unprepare: > + drm_client_release(&ifbdev->helper.client); I suppose this should be drm_fb_helper_unprepare(&ifbdev->helper); instead of the double drm_client_release(). And we're missing this cleanup already. BR, Jani. > + kfree(ifbdev); > + return ret; > } > > static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
Hi Thomas, On Tue, Mar 28, 2023 at 01:14:20PM +0200, Thomas Zimmermann wrote: > Initialize i915's fbdev client by giving an instance of struct > drm_client_funcsi to drm_client_init(). Also clean up with An extra i had sneaked in here Sam
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index 88de79279ce5..290da5e94bc5 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -364,6 +364,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev) if (ifbdev->fb) drm_framebuffer_remove(&ifbdev->fb->base); + drm_client_release(&ifbdev->helper.client); drm_fb_helper_unprepare(&ifbdev->helper); kfree(ifbdev); } @@ -656,6 +657,30 @@ void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv) intel_fbdev_invalidate(ifbdev); } +/* + * Fbdev client and struct drm_client_funcs + */ + +static void intel_fbdev_client_unregister(struct drm_client_dev *client) +{ } + +static int intel_fbdev_client_restore(struct drm_client_dev *client) +{ + return 0; +} + +static int intel_fbdev_client_hotplug(struct drm_client_dev *client) +{ + return 0; +} + +static const struct drm_client_funcs intel_fbdev_client_funcs = { + .owner = THIS_MODULE, + .unregister = intel_fbdev_client_unregister, + .restore = intel_fbdev_client_restore, + .hotplug = intel_fbdev_client_hotplug, +}; + int intel_fbdev_init(struct drm_device *dev) { struct drm_i915_private *dev_priv = to_i915(dev); @@ -677,16 +702,26 @@ int intel_fbdev_init(struct drm_device *dev) else ifbdev->preferred_bpp = ifbdev->helper.preferred_bpp; + ret = drm_client_init(dev, &ifbdev->helper.client, "i915-fbdev", + &intel_fbdev_client_funcs); + if (ret) + goto err_drm_fb_helper_unprepare; + ret = drm_fb_helper_init(dev, &ifbdev->helper); - if (ret) { - kfree(ifbdev); - return ret; - } + if (ret) + goto err_drm_client_release; dev_priv->display.fbdev.fbdev = ifbdev; INIT_WORK(&dev_priv->display.fbdev.suspend_work, intel_fbdev_suspend_worker); return 0; + +err_drm_client_release: + drm_client_release(&ifbdev->helper.client); +err_drm_fb_helper_unprepare: + drm_client_release(&ifbdev->helper.client); + kfree(ifbdev); + return ret; } static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
Initialize i915's fbdev client by giving an instance of struct drm_client_funcsi to drm_client_init(). Also clean up with drm_client_release(). Doing this in i915 prevents fbdev helpers from initializing and releasing the client internally (see drm_fb_helper_init()). No functional change yet; the client callbacks will be filled later. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/i915/display/intel_fbdev.c | 43 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-)