modeset with DRM_FBDEV_EMULATION after drm client exits
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Thu Dec 5 20:50:35 UTC 2019
Hello,
I have an i.MX6 (i.e. etnaviv) device here with a legacy qt4 application
that I cannot discuss away (sorry!) that needs framebuffer emulation.
For this machine I wrote a program that is started as pid1, shows a
splash screen using drm, forks to keep the drm device open, and execs
/sbin/init in the parent.
Then the application initializes /dev/fb0 and kills the splash process,
resulting in closing the drm device and the display falls back to show
the content of /dev/fb0.
This fallback however comes with a short flicker because in the kernel
first the drm device is completely closed (by the call of
drm_close_helper(filp);
in drm_release()) and only then the framebuffer takes over (by
drm_lastclose(dev) -> drm_client_dev_restore(dev) also in
drm_release()).
The flickering goes away for me here with the following change:
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index ea34bc991858..567983c1d137 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -440,11 +440,11 @@ int drm_release(struct inode *inode, struct file *filp)
DRM_DEBUG("open_count = %d\n", dev->open_count);
- drm_close_helper(filp);
-
if (!--dev->open_count)
drm_lastclose(dev);
+ drm_close_helper(filp);
+
mutex_unlock(&drm_global_mutex);
drm_minor_release(minor);
. I wonder if that could be done in general, or if this only works
because my setup is special (so for example the etnaviv driver doesn't
have a lastclose callback and also DRIVER_LEGACY isn't complicating
things for me).
If I'm not mistaken the fbdev emulation is the only driver implementing
a restore handler, so here are not so many options that must be cared
for and tested.
What do you think?
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
More information about the dri-devel
mailing list