summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-09-06 12:47:40 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2018-09-06 13:00:04 +0100
commit25c9a2fcc83ae7252a178b42262da383e59df744 (patch)
tree2b900e5633447a33e74a71e8696ead8fcf221c7b
parent00184dc03c1f1e1059fdf08064f8b0367d6cb08c (diff)
downloadxorg-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.c18
-rw-r--r--src/sna/kgem.h1
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;