The issue is in git master and bisecting shows it to be this commit: commit 7d9a74622e5a936e4860fcef8358619bf59adae8 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Mon Jun 15 14:16:34 2015 +0100
sna: Be robust in handling DPMS failures If we fail to turn off an output via DPMS, disable the entire CRTC in order to blank the output and save the screeen/power. Reported-by: Lukas Hejtmanek <xhejt...@fi.muni.cz> References: https://bugs.freedesktop.org/show_bug.cgi?id=90179 Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index f58eb8d..efc5fc9 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -213,7 +213,7 @@ struct sna_output { int panel_vdisplay; uint32_t dpms_id; - int dpms_mode; + uint8_t dpms_mode; struct backlight backlight; int backlight_active_level; @@ -251,6 +251,7 @@ enum { /* XXX copied from hw/xfree86/modes/xf86Crtc.c */ OPTION_DEFAULT_MODES, }; +static void __sna_output_dpms(xf86OutputPtr output, int dpms, int fixup); static void sna_crtc_disable_cursor(struct sna *sna, struct sna_crtc *crtc); static bool is_zaphod(ScrnInfoPtr scrn) @@ -936,7 +937,7 @@ sna_crtc_force_outputs_on(xf86CrtcPtr crtc) if (output->crtc != crtc) continue; - output->funcs->dpms(output, DPMSModeOn); + __sna_output_dpms(output, DPMSModeOn, false); } #if XF86_CRTC_VERSION >= 3 @@ -966,7 +967,7 @@ sna_crtc_force_outputs_off(xf86CrtcPtr crtc) if (output->crtc != crtc) continue; - output->funcs->dpms(output, DPMSModeOff); + __sna_output_dpms(output, DPMSModeOff, false); } } @@ -1099,7 +1100,7 @@ sna_crtc_apply(xf86CrtcPtr crtc) * and we lose track of the user settings. */ if (output->crtc == NULL) - output->funcs->dpms(output, DPMSModeOff); + __sna_output_dpms(output, DPMSModeOff, false); if (output->crtc != crtc) continue; @@ -3580,7 +3581,7 @@ sna_output_destroy(xf86OutputPtr output) } static void -sna_output_dpms(xf86OutputPtr output, int dpms) +__sna_output_dpms(xf86OutputPtr output, int dpms, int fixup) { struct sna *sna = to_sna(output->scrn); struct sna_output *sna_output = output->driver_private; @@ -3607,8 +3608,9 @@ sna_output_dpms(xf86OutputPtr output, int dpms) if (sna_output->backlight.iface && dpms != DPMSModeOn) { if (old_dpms == DPMSModeOn) { sna_output->backlight_active_level = sna_output_backlight_get(output); - DBG(("%s: saving current backlight %d\n", - __FUNCTION__, sna_output->backlight_active_level)); + DBG(("%s(%s:%d): saving current backlight %d\n", + __FUNCTION__, output->name, sna_output->id, + sna_output->backlight_active_level)); } sna_output->dpms_mode = dpms; sna_output_backlight_off(sna_output); @@ -3618,18 +3620,31 @@ sna_output_dpms(xf86OutputPtr output, int dpms) drmModeConnectorSetProperty(sna->kgem.fd, sna_output->id, sna_output->dpms_id, - dpms)) - dpms = old_dpms; + dpms)) { + DBG(("%s(%s:%d): failed to set DPMS to %d (fixup? %d)\n", + __FUNCTION__, output->name, sna_output->id, dpms, fixup)); + if (fixup) { + sna_crtc_disable(output->crtc, false); + return; + } + } if (sna_output->backlight.iface && dpms == DPMSModeOn) { - DBG(("%s: restoring previous backlight %d\n", - __FUNCTION__, sna_output->backlight_active_level)); + DBG(("%s(%d:%d: restoring previous backlight %d\n", + __FUNCTION__, output->name, sna_output->id, + sna_output->backlight_active_level)); sna_output_backlight_on(sna_output); } sna_output->dpms_mode = dpms; } +static void +sna_output_dpms(xf86OutputPtr output, int dpms) +{ + __sna_output_dpms(output, dpms, true); +} + static bool sna_property_ignore(drmModePropertyPtr prop) { @@ -4438,10 +4453,8 @@ reset: sna_output->dpms_mode = sna_output->prop_values[i]; DBG(("%s: found 'DPMS' (idx=%d, id=%d), initial value=%d\n", __FUNCTION__, i, sna_output->dpms_id, sna_output->dpms_mode)); - } else { - sna_output->dpms_id = -1; + } else sna_output->dpms_mode = DPMSModeOff; - } sna_output->possible_encoders = possible_encoders; sna_output->attached_encoders = attached_encoders; ** Bug watch added: freedesktop.org Bugzilla #90179 https://bugs.freedesktop.org/show_bug.cgi?id=90179 -- You received this bug notification because you are a member of Desktop Packages, which is subscribed to xserver-xorg-video-intel in Ubuntu. https://bugs.launchpad.net/bugs/1501941 Title: Screen turned off after X server exits Status in xserver-xorg-video-intel package in Ubuntu: New Bug description: When the X server exits, the screen turns off and doesn't seem to re- enable. The system is still running (i.e. can SSH in). To reproduce: 1. Log into a session 2. Switch to the greeter (using indicators or running "dm-tool switch-to-greeter" from a terminal") 3. Log back into session Expected result: You return to the session Observed result: Screen goes black This appears to be an issue in the Intel drivers, it occurs with the current wily (2:2.99.917+git20150808-0ubuntu2). It does not occur when downgrading to the vivid version (2:2.99.917-1~exp1ubuntu2.2 with some patches to compile in wily). To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1501941/+subscriptions -- Mailing list: https://launchpad.net/~desktop-packages Post to : desktop-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~desktop-packages More help : https://help.launchpad.net/ListHelp