diff options
Diffstat (limited to 'drivers/gpu/drm/i915/selftests/i915_gem_coherency.c')
-rw-r--r-- | drivers/gpu/drm/i915/selftests/i915_gem_coherency.c | 43 |
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 | ||
237 | static bool always_valid(struct drm_i915_private *i915) | 248 | static 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 | ||
253 | static bool needs_fence_registers(struct drm_i915_private *i915) | ||
254 | { | ||
255 | return !i915_terminally_wedged(&i915->gpu_error); | ||
256 | } | ||
257 | |||
242 | static bool needs_mi_store_dword(struct drm_i915_private *i915) | 258 | static 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 | { }, |