svn commit: r310593 - head/sys/dev/drm2
Michal Meloun
mmel at FreeBSD.org
Mon Dec 26 11:20:42 UTC 2016
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) {
More information about the svn-src-all
mailing list