aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/selftests/i915_gem_coherency.c')
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_coherency.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
index a4900091ae3d..3a095c37c120 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
@@ -42,11 +42,21 @@ static int cpu_set(struct drm_i915_gem_object *obj,
42 42
43 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT); 43 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
44 map = kmap_atomic(page); 44 map = kmap_atomic(page);
45 if (needs_clflush & CLFLUSH_BEFORE) 45
46 if (needs_clflush & CLFLUSH_BEFORE) {
47 mb();
46 clflush(map+offset_in_page(offset) / sizeof(*map)); 48 clflush(map+offset_in_page(offset) / sizeof(*map));
49 mb();
50 }
51
47 map[offset_in_page(offset) / sizeof(*map)] = v; 52 map[offset_in_page(offset) / sizeof(*map)] = v;
48 if (needs_clflush & CLFLUSH_AFTER) 53
54 if (needs_clflush & CLFLUSH_AFTER) {
55 mb();
49 clflush(map+offset_in_page(offset) / sizeof(*map)); 56 clflush(map+offset_in_page(offset) / sizeof(*map));
57 mb();
58 }
59
50 kunmap_atomic(map); 60 kunmap_atomic(map);
51 61
52 i915_gem_obj_finish_shmem_access(obj); 62 i915_gem_obj_finish_shmem_access(obj);
@@ -68,8 +78,13 @@ static int cpu_get(struct drm_i915_gem_object *obj,
68 78
69 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT); 79 page = i915_gem_object_get_page(obj, offset >> PAGE_SHIFT);
70 map = kmap_atomic(page); 80 map = kmap_atomic(page);
71 if (needs_clflush & CLFLUSH_BEFORE) 81
82 if (needs_clflush & CLFLUSH_BEFORE) {
83 mb();
72 clflush(map+offset_in_page(offset) / sizeof(*map)); 84 clflush(map+offset_in_page(offset) / sizeof(*map));
85 mb();
86 }
87
73 *v = map[offset_in_page(offset) / sizeof(*map)]; 88 *v = map[offset_in_page(offset) / sizeof(*map)];
74 kunmap_atomic(map); 89 kunmap_atomic(map);
75 90
@@ -210,28 +225,24 @@ static int gpu_set(struct drm_i915_gem_object *obj,
210 *cs++ = upper_32_bits(i915_ggtt_offset(vma) + offset); 225 *cs++ = upper_32_bits(i915_ggtt_offset(vma) + offset);
211 *cs++ = v; 226 *cs++ = v;
212 } else if (INTEL_GEN(i915) >= 4) { 227 } else if (INTEL_GEN(i915) >= 4) {
213 *cs++ = MI_STORE_DWORD_IMM_GEN4 | 1 << 22; 228 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
214 *cs++ = 0; 229 *cs++ = 0;
215 *cs++ = i915_ggtt_offset(vma) + offset; 230 *cs++ = i915_ggtt_offset(vma) + offset;
216 *cs++ = v; 231 *cs++ = v;
217 } else { 232 } else {
218 *cs++ = MI_STORE_DWORD_IMM | 1 << 22; 233 *cs++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
219 *cs++ = i915_ggtt_offset(vma) + offset; 234 *cs++ = i915_ggtt_offset(vma) + offset;
220 *cs++ = v; 235 *cs++ = v;
221 *cs++ = MI_NOOP; 236 *cs++ = MI_NOOP;
222 } 237 }
223 intel_ring_advance(rq, cs); 238 intel_ring_advance(rq, cs);
224 239
225 i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE); 240 err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
226 i915_vma_unpin(vma); 241 i915_vma_unpin(vma);
227 242
228 reservation_object_lock(obj->resv, NULL);
229 reservation_object_add_excl_fence(obj->resv, &rq->fence);
230 reservation_object_unlock(obj->resv);
231
232 i915_request_add(rq); 243 i915_request_add(rq);
233 244
234 return 0; 245 return err;
235} 246}
236 247
237static bool always_valid(struct drm_i915_private *i915) 248static bool always_valid(struct drm_i915_private *i915)
@@ -239,8 +250,16 @@ static bool always_valid(struct drm_i915_private *i915)
239 return true; 250 return true;
240} 251}
241 252
253static bool needs_fence_registers(struct drm_i915_private *i915)
254{
255 return !i915_terminally_wedged(&i915->gpu_error);
256}
257
242static bool needs_mi_store_dword(struct drm_i915_private *i915) 258static bool needs_mi_store_dword(struct drm_i915_private *i915)
243{ 259{
260 if (i915_terminally_wedged(&i915->gpu_error))
261 return false;
262
244 return intel_engine_can_store_dword(i915->engine[RCS]); 263 return intel_engine_can_store_dword(i915->engine[RCS]);
245} 264}
246 265
@@ -251,7 +270,7 @@ static const struct igt_coherency_mode {
251 bool (*valid)(struct drm_i915_private *i915); 270 bool (*valid)(struct drm_i915_private *i915);
252} igt_coherency_mode[] = { 271} igt_coherency_mode[] = {
253 { "cpu", cpu_set, cpu_get, always_valid }, 272 { "cpu", cpu_set, cpu_get, always_valid },
254 { "gtt", gtt_set, gtt_get, always_valid }, 273 { "gtt", gtt_set, gtt_get, needs_fence_registers },
255 { "wc", wc_set, wc_get, always_valid }, 274 { "wc", wc_set, wc_get, always_valid },
256 { "gpu", gpu_set, NULL, needs_mi_store_dword }, 275 { "gpu", gpu_set, NULL, needs_mi_store_dword },
257 { }, 276 { },