[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-intel: Changes to 'ubuntu'



 debian/changelog                                              |   10 
 debian/patches/check-hosted-initialisation-succeeds.patch     |   26 
 debian/patches/disable-unneeded-functions-when-hosted.patch   |  261 ++
 debian/patches/dont-copy-fbcon-if-hosted.patch                |   26 
 debian/patches/fix-spelling-of-caching.patch                  |  180 +
 debian/patches/more-modesetting-disablement-when-hosted.patch |  235 ++
 debian/patches/series                                         |    9 
 debian/patches/unwrap-legacy-modesetting-when-hosted.patch    |   57 
 debian/patches/xmir.patch                                     |  940 +---------
 9 files changed, 949 insertions(+), 795 deletions(-)

New commits:
commit 55d225496e8a2f90d03cdf093e9c5bc6a5562f40
Author: Christopher James Halse Rogers <raof@ubuntu.com>
Date:   Fri Sep 6 17:31:44 2013 +1000

    Fix cacheline dirt corruption

diff --git a/debian/changelog b/debian/changelog
index 408b179..02ac4bd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+xserver-xorg-video-intel (2:2.21.14-4ubuntu4) saucy; urgency=low
+
+  * XMir: Make a conservative guess as to whether the Mir buffer will be used
+    for scanout, and take caching decisions appropriately. Fixes "cache dirt"
+    transient horizontal-line misrendering with Mir bypass (LP: #1218735)
+  * xmir.patch: Split monolithic concatenated patch out into a quilt patch
+    series.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Thu, 05 Sep 2013 15:56:49 +1000
+
 xserver-xorg-video-intel (2:2.21.14-4ubuntu3) saucy; urgency=low
 
   * Fix valgrind-enabling check
diff --git a/debian/patches/check-hosted-initialisation-succeeds.patch b/debian/patches/check-hosted-initialisation-succeeds.patch
new file mode 100644
index 0000000..829e3f4
--- /dev/null
+++ b/debian/patches/check-hosted-initialisation-succeeds.patch
@@ -0,0 +1,26 @@
+commit 394978867edf3746c285491db6be41abfe325d87
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Wed Aug 14 08:38:52 2013 +0100
+
+    sna: Check that we successfully install the required hosting midlayer
+    
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index c27deb6..83a5bba 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -430,6 +430,13 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ 		goto cleanup;
+ 	}
+ 
++	/* Sanity check */
++	if (hosted() && (sna->flags & SNA_IS_HOSTED) == 0) {
++		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
++			   "Failed to setup hosted device.\n");
++		goto cleanup;
++	}
++
+ 	preferred_depth = sna->info->gen < 030 ? 15 : 24;
+ 	if (!fb_supports_depth(fd, preferred_depth))
+ 		preferred_depth = 24;
diff --git a/debian/patches/disable-unneeded-functions-when-hosted.patch b/debian/patches/disable-unneeded-functions-when-hosted.patch
new file mode 100644
index 0000000..69198fd
--- /dev/null
+++ b/debian/patches/disable-unneeded-functions-when-hosted.patch
@@ -0,0 +1,261 @@
+commit b6b5c3f009585151eb772dfc2526843c7cee82b3
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Fri Aug 9 11:34:39 2013 +0100
+
+    intel: Disable incompatible features whilst hosted
+    
+    Start adding the infrastructure to disable direct hardware access if X
+    is being run under a system compositor (aka "hosted").
+    
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/intel_device.c b/src/intel_device.c
+index c5f0a38..d9ff8bc 100644
+--- a/src/intel_device.c
++++ b/src/intel_device.c
+@@ -92,7 +92,7 @@ static int __intel_check_device(int fd)
+ 		if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
+ 			ret = FALSE;
+ 	}
+-	if (ret) {
++	if (ret && !hosted()) {
+ 		struct drm_mode_card_res res;
+ 
+ 		memset(&res, 0, sizeof(res));
+@@ -199,6 +199,12 @@ int intel_open_device(int entity_num,
+ 	dev->open_count = 0;
+ 	dev->master_count = 0;
+ 
++	/* If hosted under a system compositor, just pretend to be master */
++	if (hosted()) {
++		dev->open_count++;
++		dev->master_count++;
++	}
++
+ 	xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
+ 
+ 	return fd;
+@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
+ 		drmSetVersion sv;
+ 		int retry = 2000;
+ 
++		assert(!hosted());
++
+ 		/* Check that what we opened was a master or a
+ 		 * master-capable FD, by setting the version of the
+ 		 * interface we'll use to talk to it.
+@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
+ 	if (dev->master_count++ == 0) {
+ 		int retry = 2000;
+ 
++		assert(!hosted());
+ 		do {
+ 			ret = drmSetMaster(dev->fd);
+ 			if (ret == 0)
+@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
+ 	ret = 0;
+ 	assert(dev->master_count);
+ 	if (--dev->master_count == 0) {
++		assert(!hosted());
+ 		assert(drmSetMaster(dev->fd) == 0);
+ 		ret = drmDropMaster(dev->fd);
+ 	}
+@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
+ 	if (--dev->open_count)
+ 		return;
+ 
++	assert(!hosted());
+ 	intel_set_device(scrn, NULL);
+ 
+ 	drmClose(dev->fd);
+diff --git a/src/intel_driver.h b/src/intel_driver.h
+index 1e67eab..4768536 100644
+--- a/src/intel_driver.h
++++ b/src/intel_driver.h
+@@ -129,4 +129,6 @@ void intel_put_device(ScrnInfoPtr scrn);
+ 
+ void __intel_uxa_release_device(ScrnInfoPtr scrn);
+ 
++#define hosted() (0)
++
+ #endif /* INTEL_DRIVER_H */
+diff --git a/src/intel_module.c b/src/intel_module.c
+index 47e494c..42fa8d8 100644
+--- a/src/intel_module.c
++++ b/src/intel_module.c
+@@ -382,6 +382,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
+ #else
+ 		(*flag) = HW_IO | HW_MMIO;
+ #endif
++		if (hosted())
++			(*flag) = HW_SKIP_CONSOLE;
++
+ 		return TRUE;
+ 	default:
+ 		/* Unknown or deprecated function */
+@@ -410,6 +413,9 @@ static enum accel_method { UXA, SNA } get_accel_method(void)
+ 	enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
+ 	XF86ConfDevicePtr dev;
+ 
++	if (hosted())
++		return SNA;
++
+ 	dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
+ 	if (dev && dev->dev_option_lst) {
+ 		const char *s;
+@@ -493,7 +499,8 @@ static Bool intel_pci_probe(DriverPtr		driver,
+ 		case PCI_CHIP_I810_DC100:
+ 		case PCI_CHIP_I810_E:
+ 		case PCI_CHIP_I815:
+-			break;
++			if (!hosted())
++				break;
+ 		default:
+ 			return FALSE;
+ 		}
+diff --git a/src/sna/sna.h b/src/sna/sna.h
+index caf671f..7387088 100644
+--- a/src/sna/sna.h
++++ b/src/sna/sna.h
+@@ -229,6 +229,7 @@ struct sna {
+ #define SNA_TEAR_FREE		0x10
+ #define SNA_FORCE_SHADOW	0x20
+ #define SNA_FLUSH_GTT		0x40
++#define SNA_IS_HOSTED		0x80
+ #define SNA_REPROBE		0x80000000
+ 
+ 	unsigned cpu_features;
+diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
+index 5dcf47f..f86d93d 100644
+--- a/src/sna/sna_display.c
++++ b/src/sna/sna_display.c
+@@ -3151,11 +3151,22 @@ sna_crtc_config_notify(ScreenPtr screen)
+ 	sna_mode_update(to_sna_from_screen(screen));
+ }
+ 
++#if HAS_PIXMAP_SHARING
++#define sna_setup_provider(scrn) xf86ProviderSetup(scrn, NULL, "Intel")
++#else
++#define sna_setup_provider(scrn)
++#endif
++
+ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
+ {
+ 	struct sna_mode *mode = &sna->mode;
+ 	int i;
+ 
++	if (sna->flags & SNA_IS_HOSTED) {
++		sna_setup_provider(scrn);
++		return true;
++	}
++
+ 	mode->kmode = drmModeGetResources(sna->kgem.fd);
+ 	if (mode->kmode) {
+ 		xf86CrtcConfigInit(scrn, &sna_mode_funcs);
+@@ -3172,9 +3183,7 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
+ 		if (!xf86IsEntityShared(scrn->entityList[0]))
+ 			sna_mode_compute_possible_clones(scrn);
+ 
+-#if HAS_PIXMAP_SHARING
+-		xf86ProviderSetup(scrn, NULL, "Intel");
+-#endif
++		sna_setup_provider(scrn);
+ 	} else {
+ 		if (!sna_mode_fake_init(sna))
+ 			return false;
+@@ -3200,6 +3209,9 @@ sna_mode_close(struct sna *sna)
+ 	while (sna_mode_has_pending_events(sna))
+ 		sna_mode_wakeup(sna);
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return;
++
+ 	for (i = 0; i < xf86_config->num_crtc; i++)
+ 		sna_crtc_disable_shadow(sna, to_sna_crtc(xf86_config->crtc[i]));
+ }
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index fc8773b..7f2c0ac 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -287,7 +287,7 @@ static bool has_pageflipping(struct sna *sna)
+ 	drm_i915_getparam_t gp;
+ 	int v;
+ 
+-	if (sna->flags & SNA_NO_WAIT)
++	if (sna->flags & (SNA_IS_HOSTED | SNA_NO_WAIT))
+ 		return false;
+ 
+ 	v = 0;
+@@ -413,6 +413,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ 	sna = to_sna(scrn);
+ 	sna->scrn = scrn;
+ 	sna->pEnt = pEnt;
++	sna->flags = 0;
+ 
+ 	scrn->displayWidth = 640;	/* default it */
+ 
+@@ -425,7 +426,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ 	fd = intel_get_device(scrn);
+ 	if (fd == -1) {
+ 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+-			   "Failed to become DRM master.\n");
++			   "Failed to claim DRM device.\n");
+ 		goto cleanup;
+ 	}
+ 
+@@ -484,7 +485,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ 	if (xf86ReturnOptValBool(sna->Options, OPTION_TILING_FB, FALSE))
+ 		sna->tiling &= ~SNA_TILING_FB;
+ 
+-	sna->flags = 0;
+ 	if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
+ 		sna->flags |= SNA_NO_WAIT;
+ 	if (xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
+@@ -629,6 +629,9 @@ sna_uevent_init(ScrnInfoPtr scrn)
+ 	Bool hotplug;
+ 	MessageType from = X_CONFIG;
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return;
++
+ 	DBG(("%s\n", __FUNCTION__));
+ 
+ 	/* RandR will be disabled if Xinerama is active, and so generating
+@@ -895,7 +898,8 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
+ 	if (!miDCInitialize(screen, xf86GetPointerScreenFuncs()))
+ 		return FALSE;
+ 
+-	if (xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
++	if ((sna->flags & SNA_IS_HOSTED) == 0 &&
++	    xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
+ 			       HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ 			       HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
+ 			       HARDWARE_CURSOR_INVERT_MASK |
+diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
+index a0b4db9..a68a173 100644
+--- a/src/sna/sna_video_overlay.c
++++ b/src/sna/sna_video_overlay.c
+@@ -683,6 +683,9 @@ void sna_video_overlay_setup(struct sna *sna, ScreenPtr screen)
+ 	struct sna_video *video;
+ 	XvPortPtr port;
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return;
++
+ 	if (!sna_has_overlay(sna))
+ 		return;
+ 
+diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
+index 07e59bd..a8d50ab 100644
+--- a/src/sna/sna_video_sprite.c
++++ b/src/sna/sna_video_sprite.c
+@@ -456,6 +456,9 @@ void sna_video_sprite_setup(struct sna *sna, ScreenPtr screen)
+ 	struct sna_video *video;
+ 	XvPortPtr port;
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return;
++
+ 	memset(&r, 0, sizeof(struct drm_mode_get_plane_res));
+ 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPLANERESOURCES, &r))
+ 		return;
diff --git a/debian/patches/dont-copy-fbcon-if-hosted.patch b/debian/patches/dont-copy-fbcon-if-hosted.patch
new file mode 100644
index 0000000..3bec2a7
--- /dev/null
+++ b/debian/patches/dont-copy-fbcon-if-hosted.patch
@@ -0,0 +1,26 @@
+commit 7690346248fd8d3460cc07f018827ff55b85d19d
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Sat Aug 24 14:00:34 2013 +0100
+
+    sna: Don't copy fbcon if hosted
+    
+    When hosted, we have no idea what the right initial contents should be
+    as we are independent of the CRTC and so the existing fb is irrelevant.
+    Plus, not actually being master will cause the attempt to read back the
+    bound framebuffer to fail...
+    
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index 83a5bba..e6c424a 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -259,7 +259,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
+ 	screen->SetScreenPixmap(sna->front);
+ 
+ 	/* Only preserve the fbcon, not any subsequent server regens */
+-	if (serverGeneration == 1)
++	if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0)
+ 		sna_copy_fbcon(sna);
+ 
+ 	if (!sna_become_master(sna)) {
diff --git a/debian/patches/fix-spelling-of-caching.patch b/debian/patches/fix-spelling-of-caching.patch
new file mode 100644
index 0000000..00dba87
--- /dev/null
+++ b/debian/patches/fix-spelling-of-caching.patch
@@ -0,0 +1,180 @@
+commit 6bd897157b34e3b80dea68fa615d0fba08238486
+Author: Sedat Dilek <sedat.dilek@gmail.com>
+Date:   Wed Aug 14 10:01:13 2013 +0200
+
+    Correct misspelled caching
+    
+    Signed-off-by: Sedat Dilek <sedat.dilek@gmail.com>
+
+--- a/src/sna/kgem.c
++++ b/src/sna/kgem.c
+@@ -159,13 +159,13 @@
+ #define UNCACHED	0
+ #define SNOOPED		1
+ 
+-struct local_i915_gem_cacheing {
++struct local_i915_gem_caching {
+ 	uint32_t handle;
+-	uint32_t cacheing;
++	uint32_t caching;
+ };
+ 
+-#define LOCAL_I915_GEM_SET_CACHEING	0x2f
+-#define LOCAL_IOCTL_I915_GEM_SET_CACHEING DRM_IOW(DRM_COMMAND_BASE + LOCAL_I915_GEM_SET_CACHEING, struct local_i915_gem_cacheing)
++#define LOCAL_I915_GEM_SET_CACHING	0x2f
++#define LOCAL_IOCTL_I915_GEM_SET_CACHING DRM_IOW(DRM_COMMAND_BASE + LOCAL_I915_GEM_SET_CACHING, struct local_i915_gem_caching)
+ 
+ struct kgem_buffer {
+ 	struct kgem_bo base;
+@@ -257,14 +257,14 @@
+ 	return ret == 0;
+ }
+ 
+-static bool gem_set_cacheing(int fd, uint32_t handle, int cacheing)
++static bool gem_set_caching(int fd, uint32_t handle, int caching)
+ {
+-	struct local_i915_gem_cacheing arg;
++	struct local_i915_gem_caching arg;
+ 
+ 	VG_CLEAR(arg);
+ 	arg.handle = handle;
+-	arg.cacheing = cacheing;
+-	return drmIoctl(fd, LOCAL_IOCTL_I915_GEM_SET_CACHEING, &arg) == 0;
++	arg.caching = caching;
++	return drmIoctl(fd, LOCAL_IOCTL_I915_GEM_SET_CACHING, &arg) == 0;
+ }
+ 
+ static uint32_t gem_userptr(int fd, void *ptr, int size, int read_only)
+@@ -925,7 +925,7 @@
+ 	return has_llc;
+ }
+ 
+-static bool test_has_cacheing(struct kgem *kgem)
++static bool test_has_caching(struct kgem *kgem)
+ {
+ 	uint32_t handle;
+ 	bool ret;
+@@ -941,7 +941,7 @@
+ 	if (handle == 0)
+ 		return false;
+ 
+-	ret = gem_set_cacheing(kgem->fd, handle, UNCACHED);
++	ret = gem_set_caching(kgem->fd, handle, UNCACHED);
+ 	gem_close(kgem->fd, handle);
+ 	return ret;
+ }
+@@ -1171,12 +1171,12 @@
+ 	     kgem->has_llc));
+ 
+ 	kgem->has_wt = test_has_wt(kgem);
+-	DBG(("%s: has write-through cacheing for scanouts? %d\n", __FUNCTION__,
++	DBG(("%s: has write-through caching for scanouts? %d\n", __FUNCTION__,
+ 	     kgem->has_wt));
+ 
+-	kgem->has_cacheing = test_has_cacheing(kgem);
++	kgem->has_caching = test_has_caching(kgem);
+ 	DBG(("%s: has set-cache-level? %d\n", __FUNCTION__,
+-	     kgem->has_cacheing));
++	     kgem->has_caching));
+ 
+ 	kgem->has_userptr = test_has_userptr(kgem);
+ 	DBG(("%s: has userptr? %d\n", __FUNCTION__,
+@@ -1254,8 +1254,8 @@
+ 	kgem->next_request = __kgem_request_alloc(kgem);
+ 
+ 	DBG(("%s: cpu bo enabled %d: llc? %d, set-cache-level? %d, userptr? %d\n", __FUNCTION__,
+-	     !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_cacheing),
+-	     kgem->has_llc, kgem->has_cacheing, kgem->has_userptr));
++	     !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_caching),
++	     kgem->has_llc, kgem->has_caching, kgem->has_userptr));
+ 
+ 	VG_CLEAR(aperture);
+ 	aperture.aper_size = 0;
+@@ -1344,7 +1344,7 @@
+ 	if (kgem->max_copy_tile_size < 16*PAGE_SIZE)
+ 		kgem->max_copy_tile_size = 16*PAGE_SIZE;
+ 
+-	if (kgem->has_llc | kgem->has_cacheing | kgem->has_userptr) {
++	if (kgem->has_llc | kgem->has_caching | kgem->has_userptr) {
+ 		if (kgem->large_object_size > kgem->max_cpu_size)
+ 			kgem->large_object_size = kgem->max_cpu_size;
+ 	} else
+@@ -1817,7 +1817,7 @@
+ 	bo->reusable = true;
+ 
+ 	if (kgem->has_llc &&
+-	    !gem_set_cacheing(kgem->fd, bo->handle, SNOOPED))
++	    !gem_set_caching(kgem->fd, bo->handle, SNOOPED))
+ 		bo->reusable = false;
+ }
+ 
+@@ -1894,7 +1894,7 @@
+ 
+ 	DBG(("%s: num_pages=%d, flags=%x\n", __FUNCTION__, num_pages, flags));
+ 
+-	if ((kgem->has_cacheing | kgem->has_userptr) == 0)
++	if ((kgem->has_caching | kgem->has_userptr) == 0)
+ 		return NULL;
+ 
+ 	if (list_is_empty(&kgem->snoop)) {
+@@ -4421,7 +4421,7 @@
+ 		return bo;
+ 	}
+ 
+-	if (kgem->has_cacheing) {
++	if (kgem->has_caching) {
+ 		bo = kgem_create_linear(kgem, size, flags);
+ 		if (bo == NULL)
+ 			return NULL;
+@@ -4429,7 +4429,7 @@
+ 		assert(bo->tiling == I915_TILING_NONE);
+ 		assert_tiling(kgem, bo);
+ 
+-		if (!gem_set_cacheing(kgem->fd, bo->handle, SNOOPED)) {
++		if (!gem_set_caching(kgem->fd, bo->handle, SNOOPED)) {
+ 			kgem_bo_destroy(kgem, bo);
+ 			return NULL;
+ 		}
+@@ -5494,7 +5494,7 @@
+ 		kgem_bo_free(kgem, &bo->base);
+ 	}
+ 
+-	if (kgem->has_cacheing) {
++	if (kgem->has_caching) {
+ 		struct kgem_bo *old;
+ 
+ 		bo = buffer_alloc();
+@@ -5522,18 +5522,18 @@
+ 		assert(bo->mmapped == true);
+ 		assert(bo->need_io == false);
+ 
+-		if (!gem_set_cacheing(kgem->fd, bo->base.handle, SNOOPED))
+-			goto free_cacheing;
++		if (!gem_set_caching(kgem->fd, bo->base.handle, SNOOPED))
++			goto free_caching;
+ 
+ 		bo->base.snoop = true;
+ 
+ 		bo->mem = kgem_bo_map__cpu(kgem, &bo->base);
+ 		if (bo->mem == NULL)
+-			goto free_cacheing;
++			goto free_caching;
+ 
+ 		return bo;
+ 
+-free_cacheing:
++free_caching:
+ 		bo->base.refcnt = 0; /* for valgrind */
+ 		kgem_bo_free(kgem, &bo->base);
+ 	}
+--- a/src/sna/kgem.h
++++ b/src/sna/kgem.h
+@@ -177,7 +177,7 @@
+ 	uint32_t has_semaphores :1;
+ 	uint32_t has_secure_batches :1;
+ 	uint32_t has_pinned_batches :1;
+-	uint32_t has_cacheing :1;
++	uint32_t has_caching :1;
+ 	uint32_t has_llc :1;
+ 	uint32_t has_wt :1;
+ 	uint32_t has_no_reloc :1;
diff --git a/debian/patches/more-modesetting-disablement-when-hosted.patch b/debian/patches/more-modesetting-disablement-when-hosted.patch
new file mode 100644
index 0000000..797acd0
--- /dev/null
+++ b/debian/patches/more-modesetting-disablement-when-hosted.patch
@@ -0,0 +1,235 @@
+commit 097c2567939f2063749acf0bc768df7bb002d535
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Sun Aug 25 10:49:57 2013 +0100
+
+    sna: Add a few more checks for a hosted Xserver before walking CRTC lists
+    
+    If we are hosted, we do not own the CRTC configuration, and deferencing
+    the private data structures believing them to be ours, only leads to
+    disaster.
+    
+    Based on patches by Christopher James Halse Rogers.
+    
+    Reported-by: Christopher James Halse Rogers <raof@ubuntu.com>
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna.h b/src/sna/sna.h
+index f4722d1..337ebc8 100644
+--- a/src/sna/sna.h
++++ b/src/sna/sna.h
+@@ -389,7 +389,7 @@ to_sna_from_kgem(struct kgem *kgem)
+ #define MAX(a,b)	((a) >= (b) ? (a) : (b))
+ #endif
+ 
+-extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
++extern xf86CrtcPtr sna_covering_crtc(struct sna *sna,
+ 				     const BoxRec *box,
+ 				     xf86CrtcPtr desired);
+ 
+diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
+index 3d42eb9..daffbc2 100644
+--- a/src/sna/sna_display.c
++++ b/src/sna/sna_display.c
+@@ -1004,6 +1004,7 @@ void sna_copy_fbcon(struct sna *sna)
+ 		return;
+ 
+ 	DBG(("%s\n", __FUNCTION__));
++	assert((sna->flags & SNA_IS_HOSTED) == 0);
+ 
+ 	priv = sna_pixmap(sna->front);
+ 	assert(priv && priv->gpu_bo);
+@@ -2736,6 +2737,7 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
+ 	DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
+ 	     scrn->virtualX, scrn->virtualY,
+ 	     width, height));
++	assert((sna->flags & SNA_IS_HOSTED) == 0);
+ 
+ 	if (scrn->virtualX == width && scrn->virtualY == height)
+ 		return TRUE;
+@@ -2873,6 +2875,7 @@ sna_page_flip(struct sna *sna,
+ 
+ 	DBG(("%s: handle %d attached\n", __FUNCTION__, bo->handle));
+ 	assert(bo->refcnt);
++	assert((sna->flags & SNA_IS_HOSTED) == 0);
+ 
+ 	kgem_bo_submit(&sna->kgem, bo);
+ 
+@@ -2979,6 +2982,8 @@ static bool sna_probe_initial_configuration(struct sna *sna)
+ 	int width, height;
+ 	int i, j;
+ 
++	assert((sna->flags & SNA_IS_HOSTED) == 0);
++
+ 	if (xf86ReturnOptValBool(sna->Options, OPTION_REPROBE, FALSE))
+ 		return false;
+ 
+@@ -3278,16 +3283,17 @@ static int sna_box_area(const BoxRec *box)
+  * with greater coverage
+  */
+ xf86CrtcPtr
+-sna_covering_crtc(ScrnInfoPtr scrn,
+-		  const BoxRec *box,
+-		  xf86CrtcPtr desired)
++sna_covering_crtc(struct sna *sna, const BoxRec *box, xf86CrtcPtr desired)
+ {
+-	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
++	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ 	xf86CrtcPtr best_crtc;
+ 	int best_coverage, c;
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return NULL;
++
+ 	/* If we do not own the VT, we do not own the CRTC either */
+-	if (!scrn->vtSema)
++	if (!sna->scrn->vtSema)
+ 		return NULL;
+ 
+ 	DBG(("%s for box=(%d, %d), (%d, %d)\n",
+@@ -3616,6 +3622,9 @@ void sna_mode_update(struct sna *sna)
+ 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ 	int i;
+ 
++	if (sna->flags & SNA_IS_HOSTED)
++		return;
++
+ 	/* Validate CRTC attachments and force consistency upon the kernel */
+ 	for (i = 0; i < xf86_config->num_crtc; i++) {
+ 		xf86CrtcPtr crtc = xf86_config->crtc[i];
+@@ -3906,6 +3915,7 @@ void sna_mode_redisplay(struct sna *sna)
+ 		return;
+ 
+ 	DBG(("%s: posting shadow damage\n", __FUNCTION__));
++	assert((sna->flags & SNA_IS_HOSTED) == 0);
+ 	assert(sna->mode.shadow_active);
+ 
+ 	region = DamageRegion(sna->mode.shadow_damage);
+diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
+index 5f2811b..1eec740 100644
+--- a/src/sna/sna_dri.c
++++ b/src/sna/sna_dri.c
+@@ -781,7 +781,7 @@ __sna_dri_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
+ 
+ 		crtc = NULL;
+ 		if (sync && sna_pixmap_is_scanout(sna, pixmap))
+-			crtc = sna_covering_crtc(sna->scrn, &clip.extents, NULL);
++			crtc = sna_covering_crtc(sna, &clip.extents, NULL);
+ 		sna_dri_select_mode(sna, dst_bo, src_bo, crtc != NULL);
+ 
+ 		sync = (crtc != NULL&&
+@@ -885,22 +885,22 @@ static inline int sna_wait_vblank(struct sna *sna, drmVBlank *vbl)
+ #if DRI2INFOREC_VERSION >= 4
+ 
+ static int
+-sna_dri_get_pipe(DrawablePtr pDraw)
++sna_dri_get_pipe(DrawablePtr draw)
+ {
+-	ScrnInfoPtr pScrn = xf86ScreenToScrn(pDraw->pScreen);
++	struct sna *sna = to_sna_from_drawable(draw);
+ 	xf86CrtcPtr crtc;
+ 	BoxRec box;
+ 	int pipe;
+ 
+-	if (pDraw->type == DRAWABLE_PIXMAP)
++	if (draw->type == DRAWABLE_PIXMAP)
+ 		return -1;
+ 
+-	box.x1 = pDraw->x;
+-	box.y1 = pDraw->y;
+-	box.x2 = box.x1 + pDraw->width;
+-	box.y2 = box.y1 + pDraw->height;
++	box.x1 = draw->x;
++	box.y1 = draw->y;
++	box.x2 = box.x1 + draw->width;
++	box.y2 = box.y1 + draw->height;
+ 
+-	crtc = sna_covering_crtc(pScrn, &box, NULL);
++	crtc = sna_covering_crtc(sna, &box, NULL);
+ 
+ 	/* Make sure the CRTC is valid and this is the real front buffer */
+ 	pipe = -1;
+diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
+index cd9e3ee..2083a22 100644
+--- a/src/sna/sna_video.c
++++ b/src/sna/sna_video.c
+@@ -121,10 +121,9 @@ void sna_video_buffer_fini(struct sna_video *video)
+ }
+ 
+ bool
+-sna_video_clip_helper(ScrnInfoPtr scrn,
+-		      struct sna_video *video,
++sna_video_clip_helper(struct sna_video *video,
+ 		      struct sna_video_frame *frame,
+-		      xf86CrtcPtr * crtc_ret,
++		      xf86CrtcPtr *crtc_ret,
+ 		      BoxPtr dst,
+ 		      short src_x, short src_y,
+ 		      short drw_x, short drw_y,
+@@ -152,7 +151,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
+ 	 * For overlay video, compute the relevant CRTC and
+ 	 * clip video to that
+ 	 */
+-	crtc = sna_covering_crtc(scrn, dst, video->desired_crtc);
++	crtc = sna_covering_crtc(video->sna, dst, video->desired_crtc);
+ 
+ 	/* For textured video, we don't actually want to clip at all. */
+ 	if (crtc && !video->textured) {
+diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
+index 875f8cc..cbb3ea3 100644
+--- a/src/sna/sna_video.h
++++ b/src/sna/sna_video.h
+@@ -162,10 +162,9 @@ static inline int is_planar_fourcc(int id)
+ }
+ 
+ bool
+-sna_video_clip_helper(ScrnInfoPtr scrn,
+-		      struct sna_video *adaptor_priv,
++sna_video_clip_helper(struct sna_video *video,
+ 		      struct sna_video_frame *frame,
+-		      xf86CrtcPtr * crtc_ret,
++		      xf86CrtcPtr *crtc_ret,
+ 		      BoxPtr dst,
+ 		      short src_x, short src_y,
+ 		      short drw_x, short drw_y,
+diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
+index 0b53e6e..766e048 100644
+--- a/src/sna/sna_video_overlay.c
++++ b/src/sna/sna_video_overlay.c
+@@ -524,8 +524,7 @@ sna_video_overlay_put_image(ClientPtr client,
+ 
+ 	sna_video_frame_init(video, format->id, width, height, &frame);
+ 
+-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
+-				   &crtc, &dstBox,
++	if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
+ 				   src_x, src_y, draw->x + drw_x, draw->y + drw_y,
+ 				   src_w, src_h, drw_w, drw_h,
+ 				   &clip))
+diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
+index 8b094c4..22b5e08 100644
+--- a/src/sna/sna_video_sprite.c
++++ b/src/sna/sna_video_sprite.c
+@@ -366,8 +366,7 @@ static int sna_video_sprite_put_image(ClientPtr client,
+ 
+ 	sna_video_frame_init(video, format->id, width, height, &frame);
+ 
+-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
+-				   &crtc, &dst_box,
++	if (!sna_video_clip_helper(video, &frame, &crtc, &dst_box,
+ 				   src_x, src_y, draw->x + drw_x, draw->y + drw_y,
+ 				   src_w, src_h, drw_w, drw_h,
+ 				   &clip))
+diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
+index 7ec17d1..b7f4d4f 100644
+--- a/src/sna/sna_video_textured.c
++++ b/src/sna/sna_video_textured.c
+@@ -205,8 +205,7 @@ sna_video_textured_put_image(ClientPtr client,
+ 
+ 	sna_video_frame_init(video, format->id, width, height, &frame);
+ 
+-	if (!sna_video_clip_helper(sna->scrn, video, &frame,
+-				   &crtc, &dstBox,
++	if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
+ 				   src_x, src_y, drw_x + draw->x, drw_y + draw->y,
+ 				   src_w, src_h, drw_w, drw_h,
+ 				   &clip))
diff --git a/debian/patches/series b/debian/patches/series
index f8966b4..e90dd88 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,4 +1,13 @@
 Check-for-struct-sysinfo-as-well-as-sys-sysinfo.h.patch
 Link-the-driver-against-pixman.patch
 0001-sna-Make-sure-the-frontbuffer-exists-before-doing-pi.patch
+
+# XMir series
+
+disable-unneeded-functions-when-hosted.patch
+unwrap-legacy-modesetting-when-hosted.patch
+check-hosted-initialisation-succeeds.patch
+fix-spelling-of-caching.patch
+dont-copy-fbcon-if-hosted.patch
+more-modesetting-disablement-when-hosted.patch
 xmir.patch
diff --git a/debian/patches/unwrap-legacy-modesetting-when-hosted.patch b/debian/patches/unwrap-legacy-modesetting-when-hosted.patch
new file mode 100644
index 0000000..c62639b
--- /dev/null
+++ b/debian/patches/unwrap-legacy-modesetting-when-hosted.patch
@@ -0,0 +1,57 @@
+commit 3d818c0a36919add462c05d01a64b297f693fa69
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Wed Aug 14 08:34:46 2013 +0100
+
+    sna: unwrap old modesetting API whilst hosted
+    
+    If we are hosted, then we do not have our own modesetting backend and
+    calling it results in fireworks. So leave the old modesetting entry
+    points for the hosting midlayer to control.
+    
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index 7f2c0ac..c27deb6 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -1080,6 +1080,15 @@ static Bool sna_pm_event(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
+ 	return TRUE;
+ }
+ 
++static Bool sna_enter_vt__hosted(VT_FUNC_ARGS_DECL)
++{
++	return TRUE;
++}
++
++static void sna_leave_vt__hosted(VT_FUNC_ARGS_DECL)
++{
++}
++
+ Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
+ {
+ 	DBG(("%s: entity_num=%d\n", __FUNCTION__, entity_num));
+@@ -1110,13 +1119,18 @@ Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
+ 
+ 	scrn->PreInit = sna_pre_init;
+ 	scrn->ScreenInit = sna_screen_init;
+-	scrn->SwitchMode = sna_switch_mode;
+-	scrn->AdjustFrame = sna_adjust_frame;
+-	scrn->EnterVT = sna_enter_vt;
+-	scrn->LeaveVT = sna_leave_vt;
++	if (!hosted()) {
++		scrn->SwitchMode = sna_switch_mode;
++		scrn->AdjustFrame = sna_adjust_frame;
++		scrn->EnterVT = sna_enter_vt;
++		scrn->LeaveVT = sna_leave_vt;
++		scrn->ValidMode = sna_valid_mode;
++		scrn->PMEvent = sna_pm_event;
++	} else {
++		scrn->EnterVT = sna_enter_vt__hosted;
++		scrn->LeaveVT = sna_leave_vt__hosted;
++	}
+ 	scrn->FreeScreen = sna_free_screen;
+-	scrn->ValidMode = sna_valid_mode;
+-	scrn->PMEvent = sna_pm_event;
+ 
+ 	xf86SetEntitySharable(entity_num);
+ 	xf86SetEntityInstanceForScreen(scrn, entity_num,
diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch
index 05155a6..9b8f7e3 100644
--- a/debian/patches/xmir.patch
+++ b/debian/patches/xmir.patch
@@ -1,348 +1,4 @@
-commit b6b5c3f009585151eb772dfc2526843c7cee82b3
-Author: Chris Wilson <chris@chris-wilson.co.uk>
-Date:   Fri Aug 9 11:34:39 2013 +0100
-
-    intel: Disable incompatible features whilst hosted
-    
-    Start adding the infrastructure to disable direct hardware access if X
-    is being run under a system compositor (aka "hosted").
-    
-    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-
-diff --git a/src/intel_device.c b/src/intel_device.c
-index c5f0a38..d9ff8bc 100644
---- a/src/intel_device.c
-+++ b/src/intel_device.c
-@@ -92,7 +92,7 @@ static int __intel_check_device(int fd)
- 		if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
- 			ret = FALSE;
- 	}
--	if (ret) {
-+	if (ret && !hosted()) {
- 		struct drm_mode_card_res res;
- 
- 		memset(&res, 0, sizeof(res));
-@@ -199,6 +199,12 @@ int intel_open_device(int entity_num,
- 	dev->open_count = 0;
- 	dev->master_count = 0;
- 
-+	/* If hosted under a system compositor, just pretend to be master */
-+	if (hosted()) {
-+		dev->open_count++;
-+		dev->master_count++;
-+	}
-+
- 	xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
- 
- 	return fd;
-@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
- 		drmSetVersion sv;
- 		int retry = 2000;
- 
-+		assert(!hosted());
-+
- 		/* Check that what we opened was a master or a
- 		 * master-capable FD, by setting the version of the
- 		 * interface we'll use to talk to it.
-@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
- 	if (dev->master_count++ == 0) {
- 		int retry = 2000;
- 
-+		assert(!hosted());
- 		do {
- 			ret = drmSetMaster(dev->fd);
- 			if (ret == 0)
-@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
- 	ret = 0;
- 	assert(dev->master_count);
- 	if (--dev->master_count == 0) {
-+		assert(!hosted());
- 		assert(drmSetMaster(dev->fd) == 0);
- 		ret = drmDropMaster(dev->fd);
- 	}
-@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
- 	if (--dev->open_count)
- 		return;
- 
-+	assert(!hosted());
- 	intel_set_device(scrn, NULL);
- 
- 	drmClose(dev->fd);
-diff --git a/src/intel_driver.h b/src/intel_driver.h
-index 1e67eab..4768536 100644
---- a/src/intel_driver.h
-+++ b/src/intel_driver.h
-@@ -129,4 +129,6 @@ void intel_put_device(ScrnInfoPtr scrn);
- 
- void __intel_uxa_release_device(ScrnInfoPtr scrn);
- 
-+#define hosted() (0)
-+
- #endif /* INTEL_DRIVER_H */
-diff --git a/src/intel_module.c b/src/intel_module.c
-index 47e494c..42fa8d8 100644
---- a/src/intel_module.c
-+++ b/src/intel_module.c
-@@ -382,6 +382,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
- #else
- 		(*flag) = HW_IO | HW_MMIO;
- #endif
-+		if (hosted())
-+			(*flag) = HW_SKIP_CONSOLE;
-+
- 		return TRUE;
- 	default:
- 		/* Unknown or deprecated function */
-@@ -410,6 +413,9 @@ static enum accel_method { UXA, SNA } get_accel_method(void)
- 	enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
- 	XF86ConfDevicePtr dev;
- 
-+	if (hosted())
-+		return SNA;
-+
- 	dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
- 	if (dev && dev->dev_option_lst) {
- 		const char *s;
-@@ -493,7 +499,8 @@ static Bool intel_pci_probe(DriverPtr		driver,
- 		case PCI_CHIP_I810_DC100:
- 		case PCI_CHIP_I810_E:
- 		case PCI_CHIP_I815:
--			break;
-+			if (!hosted())
-+				break;
- 		default:
- 			return FALSE;
- 		}
-diff --git a/src/sna/sna.h b/src/sna/sna.h
-index caf671f..7387088 100644
---- a/src/sna/sna.h
-+++ b/src/sna/sna.h
-@@ -229,6 +229,7 @@ struct sna {


Reply to: