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