Date: Tuesday, March 7, 2017 @ 07:27:08
  Author: lcarlier
Revision: 290080

upgpkg: xf86-video-nouveau 1.0.13-3

fix dpms with kernel 4.10.x

Added:
  xf86-video-nouveau/trunk/DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch
Modified:
  xf86-video-nouveau/trunk/PKGBUILD

----------------------------------------------------+
 DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch |  141 +++++++++++++++++++
 PKGBUILD                                           |   15 +-
 2 files changed, 153 insertions(+), 3 deletions(-)

Added: DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch
===================================================================
--- DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch                          
(rev 0)
+++ DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch  2017-03-07 07:27:08 UTC 
(rev 290080)
@@ -0,0 +1,141 @@
+diff --git a/src/drmmode_display.c b/src/drmmode_display.c
+index b6c9bb9..dd9fa27 100644
+--- a/src/drmmode_display.c
++++ b/src/drmmode_display.c
+@@ -65,6 +65,7 @@ typedef struct {
+     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 @@ drmmode_crtc(xf86CrtcPtr crtc)
+       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 @@ drmmode_ConvertToKMode(ScrnInfoPtr scrn, drmModeModeInfo 
*kmode,
+ }
+ 
+ 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
+diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c
+index 81ee9be..cbb7b2a 100644
+--- a/src/nouveau_dri2.c
++++ b/src/nouveau_dri2.c
+@@ -279,23 +279,27 @@ can_exchange(DrawablePtr draw, PixmapPtr dst_pix, 
PixmapPtr src_pix)
+       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 @@ dri2_page_flip(DrawablePtr draw, PixmapPtr back, void 
*priv,
+               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++;
+diff --git a/src/nouveau_present.c b/src/nouveau_present.c
+index 482ac6e..ebd5fcf 100644
+--- a/src/nouveau_present.c
++++ b/src/nouveau_present.c
+@@ -152,7 +152,7 @@ nouveau_present_flip_check(RRCrtcPtr rrcrtc, WindowPtr 
window,
+       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 @@ nouveau_present_flip_exec(ScrnInfoPtr scrn, uint64_t 
event_id, int sync,
+                       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 @@ nouveau_present_flip_exec(ScrnInfoPtr scrn, uint64_t 
event_id, int sync,
+                               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))) {
+diff --git a/src/nouveau_xv.c b/src/nouveau_xv.c
+index 716b18d..4b939f7 100644
+--- a/src/nouveau_xv.c
++++ b/src/nouveau_xv.c
+@@ -299,7 +299,7 @@ nv_window_belongs_to_crtc(ScrnInfoPtr pScrn, int x, int y, 
int w, int h)
+       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)) &&
+diff --git a/src/nv_proto.h b/src/nv_proto.h
+index 122ede5..4a57406 100644
+--- a/src/nv_proto.h
++++ b/src/nv_proto.h
+@@ -13,6 +13,7 @@ void drmmode_screen_init(ScreenPtr pScreen);
+ 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 *);
+ 

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2017-03-07 07:20:06 UTC (rev 290079)
+++ PKGBUILD    2017-03-07 07:27:08 UTC (rev 290080)
@@ -4,7 +4,7 @@
 
 pkgname=xf86-video-nouveau
 pkgver=1.0.13
-pkgrel=2
+pkgrel=3
 pkgdesc="Open Source 2D acceleration driver for nVidia cards"
 arch=('i686' 'x86_64')
 url="http://nouveau.freedesktop.org/";
@@ -13,11 +13,20 @@
 makedepends=('xorg-server-devel' 'X-ABI-VIDEODRV_VERSION=23' 'systemd')
 conflicts=('xorg-server<1.19' 'X-ABI-VIDEODRV_VERSION<23' 
'X-ABI-VIDEODRV_VERSION>=24')
 groups=('xorg-drivers')
-source=(https://xorg.freedesktop.org/archive/individual/driver/$pkgname-$pkgver.tar.bz2{,.sig})
+source=(https://xorg.freedesktop.org/archive/individual/driver/$pkgname-$pkgver.tar.bz2{,.sig}
+        DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch)
 sha256sums=('6d9242ba139c3df7afefffb455573b52f4427920b978161c00483c64a6da47cb'
-            'SKIP')
+            'SKIP'
+            '47bb07ec5f2a0abe113899907fc0eb634a592c78e3562ab7770256f30a1a05fd')
 validpgpkeys=('B97BD6A80CAC4981091AE547FE558C72A67013C3') # Maarten Lankhorst 
<[email protected]>
 
+prepare() {
+  cd $pkgname-$pkgver
+
+  # Fix dpms with kernel 4.10.x 
https://bugs.freedesktop.org/show_bug.cgi?id=99922
+  patch -Np1 -i ../DDX-Consider-CRTCs-disabled-when-DPMS-is-off.patch
+}
+
 build() {
   cd $pkgname-$pkgver
   ./configure --prefix=/usr

Reply via email to