aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-08-16 04:52:04 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2017-08-18 06:55:02 -0400
commitf2f5c0610fbc251b127a6fffda6c651288695430 (patch)
tree91d4466eb6b988efd943630bae72ca0ca14dd7fb
parent4055dc75d6b51c23602b11c6f716e59b8947ffbf (diff)
drm/i915: Don't use MI_STORE_DWORD_IMM on Sandybridge/vcs
MI_STORE_DWORD_IMM just doesn't work on the video decode engine under Sandybridge, so refrain from using it. Then switch the selftests over to using the now common test prior to using MI_STORE_DWORD_IMM. Fixes: 7dd4f6729f92 ("drm/i915: Async GPU relocation processing") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.13-rc1+ Link: https://patchwork.freedesktop.org/patch/msgid/20170816085210.4199-1-chris@chris-wilson.co.uk Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h7
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c8
-rw-r--r--drivers/gpu/drm/i915/i915_selftest.h2
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h12
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_coherency.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_context.c6
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_hangcheck.c18
7 files changed, 40 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3ee4fd2a9b41..a4ce8fb25fdb 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -4328,4 +4328,11 @@ int remap_io_mapping(struct vm_area_struct *vma,
4328 unsigned long addr, unsigned long pfn, unsigned long size, 4328 unsigned long addr, unsigned long pfn, unsigned long size,
4329 struct io_mapping *iomap); 4329 struct io_mapping *iomap);
4330 4330
4331static inline bool
4332intel_engine_can_store_dword(struct intel_engine_cs *engine)
4333{
4334 return __intel_engine_can_store_dword(INTEL_GEN(engine->i915),
4335 engine->class);
4336}
4337
4331#endif 4338#endif
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 8e8bc7aefd9c..359d5dc6d8df 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1268,7 +1268,9 @@ relocate_entry(struct i915_vma *vma,
1268 1268
1269 if (!eb->reloc_cache.vaddr && 1269 if (!eb->reloc_cache.vaddr &&
1270 (DBG_FORCE_RELOC == FORCE_GPU_RELOC || 1270 (DBG_FORCE_RELOC == FORCE_GPU_RELOC ||
1271 !reservation_object_test_signaled_rcu(vma->resv, true))) { 1271 !reservation_object_test_signaled_rcu(vma->resv, true)) &&
1272 __intel_engine_can_store_dword(eb->reloc_cache.gen,
1273 eb->engine->class)) {
1272 const unsigned int gen = eb->reloc_cache.gen; 1274 const unsigned int gen = eb->reloc_cache.gen;
1273 unsigned int len; 1275 unsigned int len;
1274 u32 *batch; 1276 u32 *batch;
@@ -1278,10 +1280,8 @@ relocate_entry(struct i915_vma *vma,
1278 len = offset & 7 ? 8 : 5; 1280 len = offset & 7 ? 8 : 5;
1279 else if (gen >= 4) 1281 else if (gen >= 4)
1280 len = 4; 1282 len = 4;
1281 else if (gen >= 3) 1283 else
1282 len = 3; 1284 len = 3;
1283 else /* On gen2 MI_STORE_DWORD_IMM uses a physical address */
1284 goto repeat;
1285 1285
1286 batch = reloc_gpu(eb, vma, len); 1286 batch = reloc_gpu(eb, vma, len);
1287 if (IS_ERR(batch)) 1287 if (IS_ERR(batch))
diff --git a/drivers/gpu/drm/i915/i915_selftest.h b/drivers/gpu/drm/i915/i915_selftest.h
index 9d7d86f1733d..78e1a1b168ff 100644
--- a/drivers/gpu/drm/i915/i915_selftest.h
+++ b/drivers/gpu/drm/i915/i915_selftest.h
@@ -101,6 +101,4 @@ bool __igt_timeout(unsigned long timeout, const char *fmt, ...);
101#define igt_timeout(t, fmt, ...) \ 101#define igt_timeout(t, fmt, ...) \
102 __igt_timeout((t), KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) 102 __igt_timeout((t), KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
103 103
104#define igt_can_mi_store_dword_imm(D) (INTEL_GEN(D) > 2)
105
106#endif /* !__I915_SELFTEST_H__ */ 104#endif /* !__I915_SELFTEST_H__ */
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index d33c93444c0d..02d8974bf9ab 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -735,4 +735,16 @@ bool intel_engines_are_idle(struct drm_i915_private *dev_priv);
735void intel_engines_mark_idle(struct drm_i915_private *i915); 735void intel_engines_mark_idle(struct drm_i915_private *i915);
736void intel_engines_reset_default_submission(struct drm_i915_private *i915); 736void intel_engines_reset_default_submission(struct drm_i915_private *i915);
737 737
738static inline bool
739__intel_engine_can_store_dword(unsigned int gen, unsigned int class)
740{
741 if (gen <= 2)
742 return false; /* uses physical not virtual addresses */
743
744 if (gen == 6 && class == VIDEO_DECODE_CLASS)
745 return false; /* b0rked */
746
747 return true;
748}
749
738#endif /* _INTEL_RINGBUFFER_H_ */ 750#endif /* _INTEL_RINGBUFFER_H_ */
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
index 95d4aebc0181..35d778d70626 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
@@ -241,7 +241,7 @@ static bool always_valid(struct drm_i915_private *i915)
241 241
242static bool needs_mi_store_dword(struct drm_i915_private *i915) 242static bool needs_mi_store_dword(struct drm_i915_private *i915)
243{ 243{
244 return igt_can_mi_store_dword_imm(i915); 244 return intel_engine_can_store_dword(i915->engine[RCS]);
245} 245}
246 246
247static const struct igt_coherency_mode { 247static const struct igt_coherency_mode {
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index 12b85b3278cd..fb0a58fc8348 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -38,8 +38,6 @@ gpu_fill_dw(struct i915_vma *vma, u64 offset, unsigned long count, u32 value)
38 u32 *cmd; 38 u32 *cmd;
39 int err; 39 int err;
40 40
41 GEM_BUG_ON(!igt_can_mi_store_dword_imm(vma->vm->i915));
42
43 size = (4 * count + 1) * sizeof(u32); 41 size = (4 * count + 1) * sizeof(u32);
44 size = round_up(size, PAGE_SIZE); 42 size = round_up(size, PAGE_SIZE);
45 obj = i915_gem_object_create_internal(vma->vm->i915, size); 43 obj = i915_gem_object_create_internal(vma->vm->i915, size);
@@ -123,6 +121,7 @@ static int gpu_fill(struct drm_i915_gem_object *obj,
123 int err; 121 int err;
124 122
125 GEM_BUG_ON(obj->base.size > vm->total); 123 GEM_BUG_ON(obj->base.size > vm->total);
124 GEM_BUG_ON(!intel_engine_can_store_dword(engine));
126 125
127 vma = i915_vma_instance(obj, vm, NULL); 126 vma = i915_vma_instance(obj, vm, NULL);
128 if (IS_ERR(vma)) 127 if (IS_ERR(vma))
@@ -359,6 +358,9 @@ static int igt_ctx_exec(void *arg)
359 } 358 }
360 359
361 for_each_engine(engine, i915, id) { 360 for_each_engine(engine, i915, id) {
361 if (!intel_engine_can_store_dword(engine))
362 continue;
363
362 if (!obj) { 364 if (!obj) {
363 obj = create_test_object(ctx, file, &objects); 365 obj = create_test_object(ctx, file, &objects);
364 if (IS_ERR(obj)) { 366 if (IS_ERR(obj)) {
diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
index 208b34e864fb..02e52a146ed8 100644
--- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
+++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
@@ -253,9 +253,6 @@ static int igt_hang_sanitycheck(void *arg)
253 253
254 /* Basic check that we can execute our hanging batch */ 254 /* Basic check that we can execute our hanging batch */
255 255
256 if (!igt_can_mi_store_dword_imm(i915))
257 return 0;
258
259 mutex_lock(&i915->drm.struct_mutex); 256 mutex_lock(&i915->drm.struct_mutex);
260 err = hang_init(&h, i915); 257 err = hang_init(&h, i915);
261 if (err) 258 if (err)
@@ -264,6 +261,9 @@ static int igt_hang_sanitycheck(void *arg)
264 for_each_engine(engine, i915, id) { 261 for_each_engine(engine, i915, id) {
265 long timeout; 262 long timeout;
266 263
264 if (!intel_engine_can_store_dword(engine))
265 continue;
266
267 rq = hang_create_request(&h, engine, i915->kernel_context); 267 rq = hang_create_request(&h, engine, i915->kernel_context);
268 if (IS_ERR(rq)) { 268 if (IS_ERR(rq)) {
269 err = PTR_ERR(rq); 269 err = PTR_ERR(rq);
@@ -599,6 +599,9 @@ static int igt_wait_reset(void *arg)
599 long timeout; 599 long timeout;
600 int err; 600 int err;
601 601
602 if (!intel_engine_can_store_dword(i915->engine[RCS]))
603 return 0;
604
602 /* Check that we detect a stuck waiter and issue a reset */ 605 /* Check that we detect a stuck waiter and issue a reset */
603 606
604 global_reset_lock(i915); 607 global_reset_lock(i915);
@@ -664,9 +667,6 @@ static int igt_reset_queue(void *arg)
664 667
665 /* Check that we replay pending requests following a hang */ 668 /* Check that we replay pending requests following a hang */
666 669
667 if (!igt_can_mi_store_dword_imm(i915))
668 return 0;
669
670 global_reset_lock(i915); 670 global_reset_lock(i915);
671 671
672 mutex_lock(&i915->drm.struct_mutex); 672 mutex_lock(&i915->drm.struct_mutex);
@@ -679,6 +679,9 @@ static int igt_reset_queue(void *arg)
679 IGT_TIMEOUT(end_time); 679 IGT_TIMEOUT(end_time);
680 unsigned int count; 680 unsigned int count;
681 681
682 if (!intel_engine_can_store_dword(engine))
683 continue;
684
682 prev = hang_create_request(&h, engine, i915->kernel_context); 685 prev = hang_create_request(&h, engine, i915->kernel_context);
683 if (IS_ERR(prev)) { 686 if (IS_ERR(prev)) {
684 err = PTR_ERR(prev); 687 err = PTR_ERR(prev);
@@ -784,6 +787,9 @@ static int igt_handle_error(void *arg)
784 if (!intel_has_reset_engine(i915)) 787 if (!intel_has_reset_engine(i915))
785 return 0; 788 return 0;
786 789
790 if (!intel_engine_can_store_dword(i915->engine[RCS]))
791 return 0;
792
787 mutex_lock(&i915->drm.struct_mutex); 793 mutex_lock(&i915->drm.struct_mutex);
788 794
789 err = hang_init(&h, i915); 795 err = hang_init(&h, i915);