Package: release.debian.org
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock the package xserver-xorg-video-nouveau, it fixes a bug
leading to a black screen when the monitor returns from powersave mode.

The problem only becomes visible with atomic modesetting in Linux 4.10
and later, but as quite a few people will install a newer kernel than
4.9 in stretch, I think it's important to fix it in the next release.

No bug report in the BTS, but it has been reported upstream at
https://bugs.freedesktop.org/show_bug.cgi?id=99922, and I could both
reproduce the bug and that the fix works.

unblock xserver-xorg-video-nouveau/1:1.0.13-2


diff -u xserver-xorg-video-nouveau-1.0.13/debian/changelog xserver-xorg-video-nouveau-1.0.13/debian/changelog
--- xserver-xorg-video-nouveau-1.0.13/debian/changelog
+++ xserver-xorg-video-nouveau-1.0.13/debian/changelog
@@ -1,3 +1,11 @@
+xserver-xorg-video-nouveau (1:1.0.13-2) unstable; urgency=medium
+
+  * Team upload.
+  * Cherry-pick commit 924083938c ("Consider CRTCs disabled when DPMS is
+    off") from upstream.
+
+ -- Sven Joachim <svenj...@gmx.de>  Sat, 11 Mar 2017 09:00:49 +0100
+
 xserver-xorg-video-nouveau (1:1.0.13-1) unstable; urgency=medium
 
   * Team upload.
only in patch2:
unchanged:
--- xserver-xorg-video-nouveau-1.0.13.orig/src/drmmode_display.c
+++ xserver-xorg-video-nouveau-1.0.13/src/drmmode_display.c
@@ -65,6 +65,7 @@
     uint32_t rotate_fb_id;
     Bool cursor_visible;
     int scanout_pixmap_x;
+    int dpms_mode;
 } drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
 
 typedef struct {
@@ -114,6 +115,14 @@
 	return drmmode_crtc->mode_crtc->crtc_id;
 }
 
+Bool
+drmmode_crtc_on(xf86CrtcPtr crtc)
+{
+    drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+
+    return crtc->enabled && drmmode_crtc->dpms_mode == DPMSModeOn;
+}
+
 int
 drmmode_head(xf86CrtcPtr crtc)
 {
@@ -313,9 +322,10 @@
 }
 
 static void
-drmmode_crtc_dpms(xf86CrtcPtr drmmode_crtc, int mode)
+drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
 {
-
+	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+	drmmode_crtc->dpms_mode = mode;
 }
 
 void
only in patch2:
unchanged:
--- xserver-xorg-video-nouveau-1.0.13.orig/src/nouveau_dri2.c
+++ xserver-xorg-video-nouveau-1.0.13/src/nouveau_dri2.c
@@ -279,23 +279,27 @@
 	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
 	NVPtr pNv = NVPTR(scrn);
-	int i;
+	int i, active_crtc_count = 0;
 
 	if (!xf86_config->num_crtc)
 		return FALSE;
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
-		if (crtc->enabled && crtc->rotatedData)
-			return FALSE;
+		if (drmmode_crtc_on(crtc)) {
+			if (crtc->rotatedData)
+				return FALSE;
 
+			active_crtc_count++;
+		}
 	}
 
 	return ((DRI2CanFlip(draw) && pNv->has_pageflip)) &&
 		dst_pix->drawable.width == src_pix->drawable.width &&
 		dst_pix->drawable.height == src_pix->drawable.height &&
 		dst_pix->drawable.bitsPerPixel == src_pix->drawable.bitsPerPixel &&
-		dst_pix->devKind == src_pix->devKind;
+		dst_pix->devKind == src_pix->devKind &&
+		active_crtc_count;
 }
 
 static Bool
@@ -475,7 +479,7 @@
 		int head = drmmode_crtc(config->crtc[i]);
 		void *token;
 
-		if (!config->crtc[i]->enabled)
+		if (!drmmode_crtc_on(config->crtc[i]))
 			continue;
 
 		flipdata->flip_count++;
only in patch2:
unchanged:
--- xserver-xorg-video-nouveau-1.0.13.orig/src/nouveau_present.c
+++ xserver-xorg-video-nouveau-1.0.13/src/nouveau_present.c
@@ -152,7 +152,7 @@
 	ScrnInfoPtr scrn = xf86ScreenToScrn(window->drawable.pScreen);
 	xf86CrtcPtr crtc = rrcrtc->devPrivate;
 
-	if (!scrn->vtSema || !crtc->enabled)
+	if (!scrn->vtSema || !drmmode_crtc_on(crtc))
 		return FALSE;
 
 	return TRUE;
@@ -199,7 +199,7 @@
 			flip->msc = target_msc;
 
 			for (i = 0; i < config->num_crtc; i++) {
-				if (config->crtc[i]->enabled)
+				if (drmmode_crtc_on(config->crtc[i]))
 					last = i;
 			}
 
@@ -208,7 +208,7 @@
 				int crtc = drmmode_crtc(config->crtc[i]);
 				void *user = NULL;
 
-				if (!config->crtc[i]->enabled)
+				if (!drmmode_crtc_on(config->crtc[i]))
 					continue;
 
 				if (token && ((crtc == sync) || (i == last))) {
only in patch2:
unchanged:
--- xserver-xorg-video-nouveau-1.0.13.orig/src/nouveau_xv.c
+++ xserver-xorg-video-nouveau-1.0.13/src/nouveau_xv.c
@@ -299,7 +299,7 @@
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
 
-		if (!crtc->enabled)
+		if (!drmmode_crtc_on(crtc))
 			continue;
 
 		if ((x < (crtc->x + crtc->mode.HDisplay)) &&
only in patch2:
unchanged:
--- xserver-xorg-video-nouveau-1.0.13.orig/src/nv_proto.h
+++ xserver-xorg-video-nouveau-1.0.13/src/nv_proto.h
@@ -13,6 +13,7 @@
 void drmmode_screen_fini(ScreenPtr pScreen);
 
 int  drmmode_crtc(xf86CrtcPtr crtc);
+Bool drmmode_crtc_on(xf86CrtcPtr crtc);
 int  drmmode_head(xf86CrtcPtr crtc);
 void drmmode_swap(ScrnInfoPtr, uint32_t, uint32_t *);
 

Reply via email to