xf86-video-ati: Branch 'master'

Dave Airlie airlied at kemper.freedesktop.org
Wed Oct 27 18:13:03 PDT 2010


 src/drmmode_display.c |    4 +++-
 src/radeon_probe.h    |    1 +
 2 files changed, 4 insertions(+), 1 deletion(-)

New commits:
commit fb22d0c06a7dc42216230e198ff443d8035e9d21
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Oct 28 11:10:03 2010 +1000

    radeon: only register block handler once per fd.
    
    should fix https://bugs.freedesktop.org/show_bug.cgi?id=29726
    
    the problem is of course the second head instance tries to access the
    fd and fails, however I think this might break syncing on the second
    head but not sure, but its better than just hanging up the X server

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 3939ddf..adc7ba7 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1250,6 +1250,7 @@ drm_wakeup_handler(pointer data, int err, pointer p)
 
 Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
 {
+	RADEONEntPtr pRADEONEnt   = RADEONEntPriv(pScrn);
 	xf86CrtcConfigPtr xf86_config;
 	RADEONInfoPtr info = RADEONPTR(pScrn);
 	int i;
@@ -1280,10 +1281,11 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
 	drmmode->event_context.version = DRM_EVENT_CONTEXT_VERSION;
 	drmmode->event_context.vblank_handler = drmmode_vblank_handler;
 	drmmode->event_context.page_flip_handler = NULL;
-	if (info->dri->pKernelDRMVersion->version_minor >= 4) {
+	if (!pRADEONEnt->fd_wakeup_registered && info->dri->pKernelDRMVersion->version_minor >= 4) {
 		AddGeneralSocket(drmmode->fd);
 		RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
 				drm_wakeup_handler, drmmode);
+		pRADEONEnt->fd_wakeup_registered = TRUE;
 	}
 
 	return TRUE;
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index 36c91b2..dc19cce 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -648,6 +648,7 @@ typedef struct
     void              *FB;              /* Map of FB region                  */
     int               FB_cnt;           /* Map of FB region refcount         */
     int fd;                             /* for sharing across zaphod heads   */
+    Bool              fd_wakeup_registered; /* fd has already been registered for wakeup handling */
 } RADEONEntRec, *RADEONEntPtr;
 
 /* radeon_probe.c */


More information about the xorg-commit mailing list