Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Dec 2016 11:20:40 +0000 (UTC)
From:      Michal Meloun <mmel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r310593 - head/sys/dev/drm2
Message-ID:  <201612261120.uBQBKefw060416@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mmel
Date: Mon Dec 26 11:20:40 2016
New Revision: 310593
URL: https://svnweb.freebsd.org/changeset/base/310593

Log:
  Fix late monitor hotplug event.
  If system starts without attached monitor, DRM create framebuffer
  for VT console. Later, when monitor is attached, the hotplug event must
  issue full modeset procedure to setup CRTC.
  In original code, this was done in drm_fb_helper_set_par(), but we don't
  have this function implemented yet. Use unrolled version of
  drm_fb_helper_set_par() to ensure same functionality.
  
  MFC after: 1 month

Modified:
  head/sys/dev/drm2/drm_fb_helper.c

Modified: head/sys/dev/drm2/drm_fb_helper.c
==============================================================================
--- head/sys/dev/drm2/drm_fb_helper.c	Mon Dec 26 11:16:55 2016	(r310592)
+++ head/sys/dev/drm2/drm_fb_helper.c	Mon Dec 26 11:20:40 2016	(r310593)
@@ -339,6 +339,7 @@ bool drm_fb_helper_restore_fbdev_mode(st
 {
 	bool error = false;
 	int i, ret;
+
 	for (i = 0; i < fb_helper->crtc_count; i++) {
 		struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
 		ret = mode_set->crtc->funcs->set_config(mode_set);
@@ -841,6 +842,9 @@ int drm_fb_helper_single_fb_probe(struct
 	struct drm_fb_helper_surface_size sizes;
 	int gamma_size = 0;
 #if defined(__FreeBSD__)
+	struct drm_crtc *crtc;
+	struct drm_device *dev;
+	int ret;
 	device_t kdev;
 #endif
 
@@ -942,6 +946,24 @@ int drm_fb_helper_single_fb_probe(struct
 		if (ret != 0)
 			DRM_ERROR("Failed to attach fbd device: %d\n", ret);
 #endif
+	} else {
+		/* Modified version of drm_fb_helper_set_par() */
+		dev = fb_helper->dev;
+		sx_xlock(&dev->mode_config.mutex);
+		for (i = 0; i < fb_helper->crtc_count; i++) {
+			crtc = fb_helper->crtc_info[i].mode_set.crtc;
+			ret = crtc->funcs->set_config(&fb_helper->crtc_info[i].mode_set);
+			if (ret) {
+				sx_xunlock(&dev->mode_config.mutex);
+				return ret;
+			}
+		}
+		sx_xunlock(&dev->mode_config.mutex);
+
+		if (fb_helper->delayed_hotplug) {
+			fb_helper->delayed_hotplug = false;
+			drm_fb_helper_hotplug_event(fb_helper);
+		}
 	}
 #else
 	if (new_fb) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612261120.uBQBKefw060416>