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

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Sep 6 12:02:43 UTC 2018


 src/sna/kgem.c |   18 +++++++++++++++++-
 src/sna/kgem.h |    1 +
 2 files changed, 18 insertions(+), 1 deletion(-)

New commits:
commit 25c9a2fcc83ae7252a178b42262da383e59df744
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Sep 6 12:47:40 2018 +0100

    sna: Check for incoherent writes through the GTT
    
    Sometimes the write simply do not land until later, requiring us to be
    very careful in how we perform domain tracking.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index a4407ed6..d396f1b4 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -70,6 +70,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define DBG_NO_CREATE2 0
 #define DBG_NO_USERPTR 0
 #define DBG_NO_UNSYNCHRONIZED_USERPTR 0
+#define DBG_NO_COHERENT_MMAP_GTT 0
 #define DBG_NO_LLC 0
 #define DBG_NO_SEMAPHORES 0
 #define DBG_NO_MADV 0
@@ -140,6 +141,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define LOCAL_I915_PARAM_HAS_HANDLE_LUT		26
 #define LOCAL_I915_PARAM_HAS_WT			27
 #define LOCAL_I915_PARAM_MMAP_VERSION		30
+#define LOCAL_I915_PARAM_MMAP_GTT_COHERENT	52
 
 #define LOCAL_I915_EXEC_IS_PINNED		(1<<10)
 #define LOCAL_I915_EXEC_NO_RELOC		(1<<11)
@@ -1283,6 +1285,14 @@ static bool test_has_relaxed_fencing(struct kgem *kgem)
 		return true;
 }
 
+static bool test_has_coherent_mmap_gtt(struct kgem *kgem)
+{
+	if (DBG_NO_COHERENT_MMAP_GTT)
+		return false;
+
+	return gem_param(kgem, LOCAL_I915_PARAM_MMAP_GTT_COHERENT) > 0;
+}
+
 static bool test_has_llc(struct kgem *kgem)
 {
 	int has_llc = -1;
@@ -1987,6 +1997,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
 	DBG(("%s: has relaxed fencing? %d\n", __FUNCTION__,
 	     kgem->has_relaxed_fencing));
 
+	kgem->has_coherent_mmap_gtt = test_has_coherent_mmap_gtt(kgem);
+	DBG(("%s: has coherent writes into GTT maps? %d\n", __FUNCTION__,
+	     kgem->has_coherent_mmap_gtt));
+
 	kgem->has_llc = test_has_llc(kgem);
 	DBG(("%s: has shared last-level-cache? %d\n", __FUNCTION__,
 	     kgem->has_llc));
@@ -7177,7 +7191,9 @@ void kgem_bo_sync__gtt(struct kgem *kgem, struct kgem_bo *bo)
 
 	kgem_bo_submit(kgem, bo);
 
-	if (bo->domain != DOMAIN_GTT || FORCE_MMAP_SYNC & (1 << DOMAIN_GTT)) {
+	if (bo->domain != DOMAIN_GTT ||
+	    !kgem->has_coherent_mmap_gtt ||
+	    FORCE_MMAP_SYNC & (1 << DOMAIN_GTT)) {
 		struct drm_i915_gem_set_domain set_domain;
 
 		DBG(("%s: SYNC: handle=%d, needs_flush? %d, domain? %d, busy? %d\n",
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index b0c38dae..8101ce51 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -190,6 +190,7 @@ struct kgem {
 	uint32_t has_secure_batches :1;
 	uint32_t has_pinned_batches :1;
 	uint32_t has_caching :1;
+	uint32_t has_coherent_mmap_gtt :1;
 	uint32_t has_llc :1;
 	uint32_t has_wt :1;
 	uint32_t has_no_reloc :1;


More information about the xorg-commit mailing list