xf86-video-intel: 3 commits - src/sna/kgem.c src/sna/sna_driver.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Apr 10 02:40:35 PDT 2013


 src/sna/kgem.c       |    7 ++++++-
 src/sna/sna.h        |    1 +
 src/sna/sna_driver.c |   19 ++++++++++++++++---
 3 files changed, 23 insertions(+), 4 deletions(-)

New commits:
commit 540802595fee7f8b2c73e74c2b44e9a21f6471ae
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 10 10:33:48 2013 +0100

    sna: Suppress hotplug events whilst VT switched away
    
    Whilst we are not DRM master, not only is another server in control of
    the outputs and responding to the udev event, we ourselves cannot
    change modes and just cause contention upon the DRM device. Instead
    inform userspace of the change as soon as we are DRM master again and
    back in control.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 13a5ce3..61f2672 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -206,6 +206,7 @@ struct sna {
 #define SNA_TRIPLE_BUFFER	0x4
 #define SNA_TEAR_FREE		0x10
 #define SNA_FORCE_SHADOW	0x20
+#define SNA_REPROBE		0x80000000
 
 	unsigned cpu_features;
 #define MMX 0x1
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 0458743..5c8ba2d 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -734,8 +734,11 @@ sna_handle_uevents(int fd, void *closure)
 	if (memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t)) == 0 &&
 	    hotplug && atoi(hotplug) == 1) {
 		DBG(("%s: hotplug event\n", __FUNCTION__));
-		sna_mode_update(sna);
-		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+		if (sna->scrn->vtSema) {
+			sna_mode_update(sna);
+			RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+		} else
+			sna->flags |= SNA_REPROBE;
 	}
 
 	udev_device_unref(dev);
@@ -1106,9 +1109,19 @@ static void sna_free_screen(FREE_SCREEN_ARGS_DECL)
 static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
+	struct sna *sna = to_sna(scrn);
 
 	DBG(("%s\n", __FUNCTION__));
-	return sna_become_master(to_sna(scrn));
+	if (!sna_become_master(sna))
+		return FALSE;
+
+	if (sna->flags & SNA_REPROBE) {
+		sna_mode_update(sna);
+		RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+		sna->flags &= ~SNA_REPROBE;
+	}
+
+	return TRUE;
 }
 
 static Bool sna_switch_mode(SWITCH_MODE_ARGS_DECL)
commit 7afe2b45556f07b7e3a36e36da5a6d1c60366c25
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Apr 9 20:57:23 2013 +0100

    sna: Add a DBG option for testing userptr more thoroughly
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 67978c5..4b13cc0 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -62,6 +62,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define DBG_NO_CACHE_LEVEL 0
 #define DBG_NO_CPU 0
 #define DBG_NO_USERPTR 0
+#define DBG_NO_UNSYNCHRONIZED_USERPTR 0
 #define DBG_NO_LLC 0
 #define DBG_NO_SEMAPHORES 0
 #define DBG_NO_MADV 0
@@ -240,7 +241,8 @@ static uint32_t gem_userptr(int fd, void *ptr, int size, int read_only)
 	if (read_only)
 		arg.flags |= I915_USERPTR_READ_ONLY;
 
-	if (drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &arg)) {
+	if (DBG_NO_UNSYNCHRONIZED_USERPTR ||
+	    drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &arg)) {
 		arg.flags &= ~I915_USERPTR_UNSYNCHRONIZED;
 		if (drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &arg)) {
 			DBG(("%s: failed to map %p + %d bytes: %d\n",
commit fbe081061a2790e0e6e6a4065af313df0d1d6a84
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Apr 9 09:52:13 2013 +0100

    sna: Document fence limits for gen4+
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4136ce9..67978c5 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -3369,6 +3369,9 @@ int kgem_choose_tiling(struct kgem *kgem, int tiling, int width, int height, int
 			     __FUNCTION__, width, height));
 			tiling = -I915_TILING_X;
 		}
+
+		/* fences limited to 128k (256k on ivb) */
+		assert(width * bpp <= 128 * 1024 * 8);
 	}
 
 	if (tiling < 0)


More information about the xorg-commit mailing list