[PATCH v2 5/5] drm/omapdrm: Implement fbdev emulation as in-kernel client
Emil Velikov
emil.l.velikov at gmail.com
Mon Apr 3 14:27:21 UTC 2023
On Mon, 3 Apr 2023 at 11:41, Thomas Zimmermann <tzimmermann at suse.de> 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.
>
> Replace all code that initializes or releases fbdev emulation
> throughout the driver. Instead initialize the fbdev client by a
> single call to omapdrm_fbdev_setup() after omapdrm has registered
> its DRM device. As in most drivers, omapdrm's fbdev emulation now
> acts like a regular DRM client.
>
> The fbdev client setup consists of the initial preparation and the
> hot-plugging of the display. The latter creates the fbdev device
> and sets up the fbdev framebuffer. The setup performs display
> hot-plugging once. If no display can be detected, DRM probe helpers
> re-run the detection on each hotplug event.
>
> A call to drm_dev_unregister() releases the client automatically.
> No further action is required within omapdrm. If the fbdev
> framebuffer has been fully set up, struct fb_ops.fb_destroy
> implements the release. For partially initialized emulation, the
> fbdev client reverts the initial setup.
>
> v2:
> * init drm_client in this patch (Tomi)
> * don't handle non-atomic modesetting (Tomi)
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> Reviewed-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> ---
> drivers/gpu/drm/omapdrm/omap_drv.c | 11 +--
> drivers/gpu/drm/omapdrm/omap_fbdev.c | 132 +++++++++++++++++----------
> drivers/gpu/drm/omapdrm/omap_fbdev.h | 9 +-
> 3 files changed, 90 insertions(+), 62 deletions(-)
>
> +static void omap_fbdev_fb_destroy(struct fb_info *info)
> +{
> + struct drm_fb_helper *helper = info->par;
> + struct drm_framebuffer *fb = helper->fb;
> + struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0);
> + struct omap_fbdev *fbdev = to_omap_fbdev(helper);
> +
> + DBG();
> +
What a lovely little surprise. It's a pre-existing "feature", so let's
ignore that for now ;-)
> + drm_fb_helper_fini(helper);
> +
> + omap_gem_unpin(bo);
> + drm_framebuffer_remove(fb);
> +
> + drm_client_release(&helper->client);
> + drm_fb_helper_unprepare(helper);
> + kfree(fbdev);
> +}
> -void omap_fbdev_fini(struct drm_device *dev)
> +static const struct drm_client_funcs omap_fbdev_client_funcs = {
> + .owner = THIS_MODULE,
> + .unregister = omap_fbdev_client_unregister,
> + .restore = omap_fbdev_client_restore,
> + .hotplug = omap_fbdev_client_hotplug,
AFAICT the fbdev client helpers above are identical to the generic
ones in drm_fbdev_generic.c. Why aren't we reusing those but
copy/pasting them in the driver?
Thanks
Emil
More information about the dri-devel
mailing list