diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2018-09-06 12:47:40 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2018-09-06 13:00:04 +0100 |
commit | 25c9a2fcc83ae7252a178b42262da383e59df744 (patch) | |
tree | 2b900e5633447a33e74a71e8696ead8fcf221c7b | |
parent | 00184dc03c1f1e1059fdf08064f8b0367d6cb08c (diff) | |
download | xorg-driver-xf86-video-intel-25c9a2fcc83ae7252a178b42262da383e59df744.tar.gz |
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@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
-rw-r--r-- | src/sna/kgem.c | 18 | ||||
-rw-r--r-- | src/sna/kgem.h | 1 |
2 files changed, 18 insertions, 1 deletions
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; |