desktop-packages team mailing list archive
-
desktop-packages team
-
Mailing list archive
-
Message #140830
[Bug 1501941] Re: Screen turned off after X server exits
The issue is in git master and bisecting shows it to be this commit:
commit 7d9a74622e5a936e4860fcef8358619bf59adae8
Author: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
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 <xhejtman@xxxxxxxxxx>
References: https://bugs.freedesktop.org/show_bug.cgi?id=90179
Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
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
References