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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to