Den 02.09.2016 10:22, skrev David Herrmann:
> Create a simple fbdev device during SimpleDRM setup so legacy user-space
> and fbcon can use it.
>
> Signed-off-by: David Herrmann <dh.herrmann at gmail.com>

[...]

> diff --git a/drivers/gpu/drm/simpledrm/simpledrm_fbdev.c 
> b/drivers/gpu/drm/simpledrm/simpledrm_fbdev.c

[...]

> +void sdrm_fbdev_bind(struct sdrm_device *sdrm)
> +{
> +     struct drm_fb_helper *fbdev;
> +     int r;
> +
> +     fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
> +     if (!fbdev)
> +             return;
> +
> +     drm_fb_helper_prepare(sdrm->ddev, fbdev, &sdrm_fbdev_funcs);
> +
> +     r = drm_fb_helper_init(sdrm->ddev, fbdev, 1, 1);
> +     if (r < 0)
> +             goto error;
> +
> +     r = drm_fb_helper_single_add_all_connectors(fbdev);
> +     if (r < 0)
> +             goto error;
> +
> +     r = drm_fb_helper_initial_config(fbdev,
> +                             sdrm->ddev->mode_config.preferred_depth);
> +     if (r < 0)
> +             goto error;
> +
> +     if (!fbdev->fbdev)
> +             goto error;
> +
> +     sdrm->fbdev = fbdev;
> +     return;
> +
> +error:
> +     drm_fb_helper_fini(fbdev);
> +     kfree(fbdev);
> +}
> +
> +void sdrm_fbdev_unbind(struct sdrm_device *sdrm)
> +{
> +     struct drm_fb_helper *fbdev = sdrm->fbdev;
> +
> +     if (!fbdev)
> +             return;
> +
> +     sdrm->fbdev = NULL;
> +     drm_fb_helper_unregister_fbi(fbdev);
> +     cancel_work_sync(&fbdev->dirty_work);
> +     drm_fb_helper_release_fbi(fbdev);
> +     drm_framebuffer_unreference(fbdev->fb);

I get a warning that there are still fb's left during unbind:

[   48.666003] WARNING: CPU: 0 PID: 716 at 
drivers/gpu/drm/drm_crtc.c:3855 drm_mode_config_cleanup+0x180/0x1f4 [drm]

This worked:

-       drm_framebuffer_unreference(fbdev->fb);
+       drm_framebuffer_unregister_private(fbdev->fb);
+       drm_framebuffer_cleanup(fbdev->fb);


Noralf.

> +     fbdev->fb = NULL;
> +     drm_fb_helper_fini(fbdev);
> +     kfree(fbdev);
> +}

Reply via email to