2 * SPDX-License-Identifier: MIT
4 * Copyright © 2018 Intel Corporation
7 #include <linux/prime_numbers.h>
9 #include "gem/i915_gem_pm.h"
10 #include "gt/intel_reset.h"
12 #include "i915_selftest.h"
13 #include "selftests/i915_random.h"
14 #include "selftests/igt_flush_test.h"
15 #include "selftests/igt_live_test.h"
16 #include "selftests/igt_spinner.h"
17 #include "selftests/lib_sw_fence.h"
19 #include "gem/selftests/igt_gem_utils.h"
20 #include "gem/selftests/mock_context.h"
22 static int live_sanitycheck(void *arg)
24 struct drm_i915_private *i915 = arg;
25 struct i915_gem_engines_iter it;
26 struct i915_gem_context *ctx;
27 struct intel_context *ce;
28 struct igt_spinner spin;
29 intel_wakeref_t wakeref;
32 if (!HAS_LOGICAL_RING_CONTEXTS(i915))
35 mutex_lock(&i915->drm.struct_mutex);
36 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
38 if (igt_spinner_init(&spin, &i915->gt))
41 ctx = kernel_context(i915);
45 for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
46 struct i915_request *rq;
48 rq = igt_spinner_create_request(&spin, ce, MI_NOOP);
55 if (!igt_wait_for_spinner(&spin, rq)) {
56 GEM_TRACE("spinner failed to start\n");
58 intel_gt_set_wedged(&i915->gt);
63 igt_spinner_end(&spin);
64 if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
72 i915_gem_context_unlock_engines(ctx);
73 kernel_context_close(ctx);
75 igt_spinner_fini(&spin);
77 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
78 mutex_unlock(&i915->drm.struct_mutex);
83 emit_semaphore_chain(struct i915_request *rq, struct i915_vma *vma, int idx)
87 cs = intel_ring_begin(rq, 10);
91 *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
93 *cs++ = MI_SEMAPHORE_WAIT |
94 MI_SEMAPHORE_GLOBAL_GTT |
96 MI_SEMAPHORE_SAD_NEQ_SDD;
98 *cs++ = i915_ggtt_offset(vma) + 4 * idx;
102 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
103 *cs++ = i915_ggtt_offset(vma) + 4 * (idx - 1);
113 *cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
115 intel_ring_advance(rq, cs);
119 static struct i915_request *
120 semaphore_queue(struct intel_engine_cs *engine, struct i915_vma *vma, int idx)
122 struct i915_gem_context *ctx;
123 struct i915_request *rq;
126 ctx = kernel_context(engine->i915);
128 return ERR_PTR(-ENOMEM);
130 rq = igt_request_alloc(ctx, engine);
134 err = emit_semaphore_chain(rq, vma, idx);
135 i915_request_add(rq);
140 kernel_context_close(ctx);
145 release_queue(struct intel_engine_cs *engine,
146 struct i915_vma *vma,
149 struct i915_sched_attr attr = {
150 .priority = I915_USER_PRIORITY(I915_PRIORITY_MAX),
152 struct i915_request *rq;
155 rq = i915_request_create(engine->kernel_context);
159 cs = intel_ring_begin(rq, 4);
161 i915_request_add(rq);
165 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
166 *cs++ = i915_ggtt_offset(vma) + 4 * (idx - 1);
170 intel_ring_advance(rq, cs);
171 i915_request_add(rq);
173 engine->schedule(rq, &attr);
179 slice_semaphore_queue(struct intel_engine_cs *outer,
180 struct i915_vma *vma,
183 struct intel_engine_cs *engine;
184 struct i915_request *head;
185 enum intel_engine_id id;
188 head = semaphore_queue(outer, vma, n++);
190 return PTR_ERR(head);
192 i915_request_get(head);
193 for_each_engine(engine, outer->i915, id) {
194 for (i = 0; i < count; i++) {
195 struct i915_request *rq;
197 rq = semaphore_queue(engine, vma, n++);
205 err = release_queue(outer, vma, n);
209 if (i915_request_wait(head,
211 2 * RUNTIME_INFO(outer->i915)->num_engines * (count + 2) * (count + 3)) < 0) {
212 pr_err("Failed to slice along semaphore chain of length (%d, %d)!\n",
215 intel_gt_set_wedged(outer->gt);
220 i915_request_put(head);
224 static int live_timeslice_preempt(void *arg)
226 struct drm_i915_private *i915 = arg;
227 struct drm_i915_gem_object *obj;
228 intel_wakeref_t wakeref;
229 struct i915_vma *vma;
235 * If a request takes too long, we would like to give other users
236 * a fair go on the GPU. In particular, users may create batches
237 * that wait upon external input, where that input may even be
238 * supplied by another GPU job. To avoid blocking forever, we
239 * need to preempt the current task and replace it with another
243 mutex_lock(&i915->drm.struct_mutex);
244 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
246 obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
252 vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
258 vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
260 err = PTR_ERR(vaddr);
264 err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
268 for_each_prime_number_from(count, 1, 16) {
269 struct intel_engine_cs *engine;
270 enum intel_engine_id id;
272 for_each_engine(engine, i915, id) {
273 if (!intel_engine_has_preemption(engine))
276 memset(vaddr, 0, PAGE_SIZE);
278 err = slice_semaphore_queue(engine, vma, count);
282 if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
292 i915_gem_object_unpin_map(obj);
294 i915_gem_object_put(obj);
296 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
297 mutex_unlock(&i915->drm.struct_mutex);
302 static int live_busywait_preempt(void *arg)
304 struct drm_i915_private *i915 = arg;
305 struct i915_gem_context *ctx_hi, *ctx_lo;
306 struct intel_engine_cs *engine;
307 struct drm_i915_gem_object *obj;
308 struct i915_vma *vma;
309 enum intel_engine_id id;
310 intel_wakeref_t wakeref;
315 * Verify that even without HAS_LOGICAL_RING_PREEMPTION, we can
316 * preempt the busywaits used to synchronise between rings.
319 mutex_lock(&i915->drm.struct_mutex);
320 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
322 ctx_hi = kernel_context(i915);
325 ctx_hi->sched.priority =
326 I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
328 ctx_lo = kernel_context(i915);
331 ctx_lo->sched.priority =
332 I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
334 obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
340 map = i915_gem_object_pin_map(obj, I915_MAP_WC);
346 vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
352 err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
356 for_each_engine(engine, i915, id) {
357 struct i915_request *lo, *hi;
358 struct igt_live_test t;
361 if (!intel_engine_has_preemption(engine))
364 if (!intel_engine_can_store_dword(engine))
367 if (igt_live_test_begin(&t, i915, __func__, engine->name)) {
373 * We create two requests. The low priority request
374 * busywaits on a semaphore (inside the ringbuffer where
375 * is should be preemptible) and the high priority requests
376 * uses a MI_STORE_DWORD_IMM to update the semaphore value
377 * allowing the first request to complete. If preemption
378 * fails, we hang instead.
381 lo = igt_request_alloc(ctx_lo, engine);
387 cs = intel_ring_begin(lo, 8);
390 i915_request_add(lo);
394 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
395 *cs++ = i915_ggtt_offset(vma);
399 /* XXX Do we need a flush + invalidate here? */
401 *cs++ = MI_SEMAPHORE_WAIT |
402 MI_SEMAPHORE_GLOBAL_GTT |
404 MI_SEMAPHORE_SAD_EQ_SDD;
406 *cs++ = i915_ggtt_offset(vma);
409 intel_ring_advance(lo, cs);
410 i915_request_add(lo);
412 if (wait_for(READ_ONCE(*map), 10)) {
417 /* Low priority request should be busywaiting now */
418 if (i915_request_wait(lo, 0, 1) != -ETIME) {
419 pr_err("%s: Busywaiting request did not!\n",
425 hi = igt_request_alloc(ctx_hi, engine);
431 cs = intel_ring_begin(hi, 4);
434 i915_request_add(hi);
438 *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
439 *cs++ = i915_ggtt_offset(vma);
443 intel_ring_advance(hi, cs);
444 i915_request_add(hi);
446 if (i915_request_wait(lo, 0, HZ / 5) < 0) {
447 struct drm_printer p = drm_info_printer(i915->drm.dev);
449 pr_err("%s: Failed to preempt semaphore busywait!\n",
452 intel_engine_dump(engine, &p, "%s\n", engine->name);
455 intel_gt_set_wedged(&i915->gt);
459 GEM_BUG_ON(READ_ONCE(*map));
461 if (igt_live_test_end(&t)) {
471 i915_gem_object_unpin_map(obj);
473 i915_gem_object_put(obj);
475 kernel_context_close(ctx_lo);
477 kernel_context_close(ctx_hi);
479 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
480 mutex_unlock(&i915->drm.struct_mutex);
484 static struct i915_request *
485 spinner_create_request(struct igt_spinner *spin,
486 struct i915_gem_context *ctx,
487 struct intel_engine_cs *engine,
490 struct intel_context *ce;
491 struct i915_request *rq;
493 ce = i915_gem_context_get_engine(ctx, engine->legacy_idx);
497 rq = igt_spinner_create_request(spin, ce, arb);
498 intel_context_put(ce);
502 static int live_preempt(void *arg)
504 struct drm_i915_private *i915 = arg;
505 struct i915_gem_context *ctx_hi, *ctx_lo;
506 struct igt_spinner spin_hi, spin_lo;
507 struct intel_engine_cs *engine;
508 enum intel_engine_id id;
509 intel_wakeref_t wakeref;
512 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
515 if (!(i915->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION))
516 pr_err("Logical preemption supported, but not exposed\n");
518 mutex_lock(&i915->drm.struct_mutex);
519 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
521 if (igt_spinner_init(&spin_hi, &i915->gt))
524 if (igt_spinner_init(&spin_lo, &i915->gt))
527 ctx_hi = kernel_context(i915);
530 ctx_hi->sched.priority =
531 I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
533 ctx_lo = kernel_context(i915);
536 ctx_lo->sched.priority =
537 I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
539 for_each_engine(engine, i915, id) {
540 struct igt_live_test t;
541 struct i915_request *rq;
543 if (!intel_engine_has_preemption(engine))
546 if (igt_live_test_begin(&t, i915, __func__, engine->name)) {
551 rq = spinner_create_request(&spin_lo, ctx_lo, engine,
558 i915_request_add(rq);
559 if (!igt_wait_for_spinner(&spin_lo, rq)) {
560 GEM_TRACE("lo spinner failed to start\n");
562 intel_gt_set_wedged(&i915->gt);
567 rq = spinner_create_request(&spin_hi, ctx_hi, engine,
570 igt_spinner_end(&spin_lo);
575 i915_request_add(rq);
576 if (!igt_wait_for_spinner(&spin_hi, rq)) {
577 GEM_TRACE("hi spinner failed to start\n");
579 intel_gt_set_wedged(&i915->gt);
584 igt_spinner_end(&spin_hi);
585 igt_spinner_end(&spin_lo);
587 if (igt_live_test_end(&t)) {
595 kernel_context_close(ctx_lo);
597 kernel_context_close(ctx_hi);
599 igt_spinner_fini(&spin_lo);
601 igt_spinner_fini(&spin_hi);
603 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
604 mutex_unlock(&i915->drm.struct_mutex);
608 static int live_late_preempt(void *arg)
610 struct drm_i915_private *i915 = arg;
611 struct i915_gem_context *ctx_hi, *ctx_lo;
612 struct igt_spinner spin_hi, spin_lo;
613 struct intel_engine_cs *engine;
614 struct i915_sched_attr attr = {};
615 enum intel_engine_id id;
616 intel_wakeref_t wakeref;
619 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
622 mutex_lock(&i915->drm.struct_mutex);
623 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
625 if (igt_spinner_init(&spin_hi, &i915->gt))
628 if (igt_spinner_init(&spin_lo, &i915->gt))
631 ctx_hi = kernel_context(i915);
635 ctx_lo = kernel_context(i915);
639 /* Make sure ctx_lo stays before ctx_hi until we trigger preemption. */
640 ctx_lo->sched.priority = I915_USER_PRIORITY(1);
642 for_each_engine(engine, i915, id) {
643 struct igt_live_test t;
644 struct i915_request *rq;
646 if (!intel_engine_has_preemption(engine))
649 if (igt_live_test_begin(&t, i915, __func__, engine->name)) {
654 rq = spinner_create_request(&spin_lo, ctx_lo, engine,
661 i915_request_add(rq);
662 if (!igt_wait_for_spinner(&spin_lo, rq)) {
663 pr_err("First context failed to start\n");
667 rq = spinner_create_request(&spin_hi, ctx_hi, engine,
670 igt_spinner_end(&spin_lo);
675 i915_request_add(rq);
676 if (igt_wait_for_spinner(&spin_hi, rq)) {
677 pr_err("Second context overtook first?\n");
681 attr.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX);
682 engine->schedule(rq, &attr);
684 if (!igt_wait_for_spinner(&spin_hi, rq)) {
685 pr_err("High priority context failed to preempt the low priority context\n");
690 igt_spinner_end(&spin_hi);
691 igt_spinner_end(&spin_lo);
693 if (igt_live_test_end(&t)) {
701 kernel_context_close(ctx_lo);
703 kernel_context_close(ctx_hi);
705 igt_spinner_fini(&spin_lo);
707 igt_spinner_fini(&spin_hi);
709 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
710 mutex_unlock(&i915->drm.struct_mutex);
714 igt_spinner_end(&spin_hi);
715 igt_spinner_end(&spin_lo);
716 intel_gt_set_wedged(&i915->gt);
721 struct preempt_client {
722 struct igt_spinner spin;
723 struct i915_gem_context *ctx;
726 static int preempt_client_init(struct drm_i915_private *i915,
727 struct preempt_client *c)
729 c->ctx = kernel_context(i915);
733 if (igt_spinner_init(&c->spin, &i915->gt))
739 kernel_context_close(c->ctx);
743 static void preempt_client_fini(struct preempt_client *c)
745 igt_spinner_fini(&c->spin);
746 kernel_context_close(c->ctx);
749 static int live_nopreempt(void *arg)
751 struct drm_i915_private *i915 = arg;
752 struct intel_engine_cs *engine;
753 struct preempt_client a, b;
754 enum intel_engine_id id;
755 intel_wakeref_t wakeref;
759 * Verify that we can disable preemption for an individual request
760 * that may be being observed and not want to be interrupted.
763 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
766 mutex_lock(&i915->drm.struct_mutex);
767 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
769 if (preempt_client_init(i915, &a))
771 if (preempt_client_init(i915, &b))
773 b.ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX);
775 for_each_engine(engine, i915, id) {
776 struct i915_request *rq_a, *rq_b;
778 if (!intel_engine_has_preemption(engine))
781 engine->execlists.preempt_hang.count = 0;
783 rq_a = spinner_create_request(&a.spin,
791 /* Low priority client, but unpreemptable! */
792 rq_a->flags |= I915_REQUEST_NOPREEMPT;
794 i915_request_add(rq_a);
795 if (!igt_wait_for_spinner(&a.spin, rq_a)) {
796 pr_err("First client failed to start\n");
800 rq_b = spinner_create_request(&b.spin,
808 i915_request_add(rq_b);
810 /* B is much more important than A! (But A is unpreemptable.) */
811 GEM_BUG_ON(rq_prio(rq_b) <= rq_prio(rq_a));
813 /* Wait long enough for preemption and timeslicing */
814 if (igt_wait_for_spinner(&b.spin, rq_b)) {
815 pr_err("Second client started too early!\n");
819 igt_spinner_end(&a.spin);
821 if (!igt_wait_for_spinner(&b.spin, rq_b)) {
822 pr_err("Second client failed to start\n");
826 igt_spinner_end(&b.spin);
828 if (engine->execlists.preempt_hang.count) {
829 pr_err("Preemption recorded x%d; should have been suppressed!\n",
830 engine->execlists.preempt_hang.count);
835 if (igt_flush_test(i915, I915_WAIT_LOCKED))
841 preempt_client_fini(&b);
843 preempt_client_fini(&a);
845 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
846 mutex_unlock(&i915->drm.struct_mutex);
850 igt_spinner_end(&b.spin);
851 igt_spinner_end(&a.spin);
852 intel_gt_set_wedged(&i915->gt);
857 static int live_suppress_self_preempt(void *arg)
859 struct drm_i915_private *i915 = arg;
860 struct intel_engine_cs *engine;
861 struct i915_sched_attr attr = {
862 .priority = I915_USER_PRIORITY(I915_PRIORITY_MAX)
864 struct preempt_client a, b;
865 enum intel_engine_id id;
866 intel_wakeref_t wakeref;
870 * Verify that if a preemption request does not cause a change in
871 * the current execution order, the preempt-to-idle injection is
872 * skipped and that we do not accidentally apply it after the CS
876 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
879 if (USES_GUC_SUBMISSION(i915))
880 return 0; /* presume black blox */
882 if (intel_vgpu_active(i915))
883 return 0; /* GVT forces single port & request submission */
885 mutex_lock(&i915->drm.struct_mutex);
886 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
888 if (preempt_client_init(i915, &a))
890 if (preempt_client_init(i915, &b))
893 for_each_engine(engine, i915, id) {
894 struct i915_request *rq_a, *rq_b;
897 if (!intel_engine_has_preemption(engine))
900 if (igt_flush_test(i915, I915_WAIT_LOCKED))
903 intel_engine_pm_get(engine);
904 engine->execlists.preempt_hang.count = 0;
906 rq_a = spinner_create_request(&a.spin,
911 intel_engine_pm_put(engine);
915 i915_request_add(rq_a);
916 if (!igt_wait_for_spinner(&a.spin, rq_a)) {
917 pr_err("First client failed to start\n");
918 intel_engine_pm_put(engine);
922 /* Keep postponing the timer to avoid premature slicing */
923 mod_timer(&engine->execlists.timer, jiffies + HZ);
924 for (depth = 0; depth < 8; depth++) {
925 rq_b = spinner_create_request(&b.spin,
930 intel_engine_pm_put(engine);
933 i915_request_add(rq_b);
935 GEM_BUG_ON(i915_request_completed(rq_a));
936 engine->schedule(rq_a, &attr);
937 igt_spinner_end(&a.spin);
939 if (!igt_wait_for_spinner(&b.spin, rq_b)) {
940 pr_err("Second client failed to start\n");
941 intel_engine_pm_put(engine);
948 igt_spinner_end(&a.spin);
950 if (engine->execlists.preempt_hang.count) {
951 pr_err("Preemption on %s recorded x%d, depth %d; should have been suppressed!\n",
953 engine->execlists.preempt_hang.count,
955 intel_engine_pm_put(engine);
960 intel_engine_pm_put(engine);
961 if (igt_flush_test(i915, I915_WAIT_LOCKED))
967 preempt_client_fini(&b);
969 preempt_client_fini(&a);
971 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
972 mutex_unlock(&i915->drm.struct_mutex);
976 igt_spinner_end(&b.spin);
977 igt_spinner_end(&a.spin);
978 intel_gt_set_wedged(&i915->gt);
983 static int __i915_sw_fence_call
984 dummy_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
989 static struct i915_request *dummy_request(struct intel_engine_cs *engine)
991 struct i915_request *rq;
993 rq = kzalloc(sizeof(*rq), GFP_KERNEL);
997 INIT_LIST_HEAD(&rq->active_list);
1000 i915_sched_node_init(&rq->sched);
1002 /* mark this request as permanently incomplete */
1003 rq->fence.seqno = 1;
1004 BUILD_BUG_ON(sizeof(rq->fence.seqno) != 8); /* upper 32b == 0 */
1005 rq->hwsp_seqno = (u32 *)&rq->fence.seqno + 1;
1006 GEM_BUG_ON(i915_request_completed(rq));
1008 i915_sw_fence_init(&rq->submit, dummy_notify);
1009 set_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags);
1011 spin_lock_init(&rq->lock);
1012 rq->fence.lock = &rq->lock;
1013 INIT_LIST_HEAD(&rq->fence.cb_list);
1018 static void dummy_request_free(struct i915_request *dummy)
1020 /* We have to fake the CS interrupt to kick the next request */
1021 i915_sw_fence_commit(&dummy->submit);
1023 i915_request_mark_complete(dummy);
1024 dma_fence_signal(&dummy->fence);
1026 i915_sched_node_fini(&dummy->sched);
1027 i915_sw_fence_fini(&dummy->submit);
1029 dma_fence_free(&dummy->fence);
1032 static int live_suppress_wait_preempt(void *arg)
1034 struct drm_i915_private *i915 = arg;
1035 struct preempt_client client[4];
1036 struct intel_engine_cs *engine;
1037 enum intel_engine_id id;
1038 intel_wakeref_t wakeref;
1043 * Waiters are given a little priority nudge, but not enough
1044 * to actually cause any preemption. Double check that we do
1045 * not needlessly generate preempt-to-idle cycles.
1048 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
1051 mutex_lock(&i915->drm.struct_mutex);
1052 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1054 if (preempt_client_init(i915, &client[0])) /* ELSP[0] */
1056 if (preempt_client_init(i915, &client[1])) /* ELSP[1] */
1058 if (preempt_client_init(i915, &client[2])) /* head of queue */
1060 if (preempt_client_init(i915, &client[3])) /* bystander */
1063 for_each_engine(engine, i915, id) {
1066 if (!intel_engine_has_preemption(engine))
1069 if (!engine->emit_init_breadcrumb)
1072 for (depth = 0; depth < ARRAY_SIZE(client); depth++) {
1073 struct i915_request *rq[ARRAY_SIZE(client)];
1074 struct i915_request *dummy;
1076 engine->execlists.preempt_hang.count = 0;
1078 dummy = dummy_request(engine);
1082 for (i = 0; i < ARRAY_SIZE(client); i++) {
1083 rq[i] = spinner_create_request(&client[i].spin,
1084 client[i].ctx, engine,
1086 if (IS_ERR(rq[i])) {
1087 err = PTR_ERR(rq[i]);
1091 /* Disable NEWCLIENT promotion */
1092 __i915_active_request_set(&i915_request_timeline(rq[i])->last_request,
1094 i915_request_add(rq[i]);
1097 dummy_request_free(dummy);
1099 GEM_BUG_ON(i915_request_completed(rq[0]));
1100 if (!igt_wait_for_spinner(&client[0].spin, rq[0])) {
1101 pr_err("%s: First client failed to start\n",
1105 GEM_BUG_ON(!i915_request_started(rq[0]));
1107 if (i915_request_wait(rq[depth],
1110 pr_err("%s: Waiter depth:%d completed!\n",
1111 engine->name, depth);
1115 for (i = 0; i < ARRAY_SIZE(client); i++)
1116 igt_spinner_end(&client[i].spin);
1118 if (igt_flush_test(i915, I915_WAIT_LOCKED))
1121 if (engine->execlists.preempt_hang.count) {
1122 pr_err("%s: Preemption recorded x%d, depth %d; should have been suppressed!\n",
1124 engine->execlists.preempt_hang.count,
1134 preempt_client_fini(&client[3]);
1136 preempt_client_fini(&client[2]);
1138 preempt_client_fini(&client[1]);
1140 preempt_client_fini(&client[0]);
1142 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1143 mutex_unlock(&i915->drm.struct_mutex);
1147 for (i = 0; i < ARRAY_SIZE(client); i++)
1148 igt_spinner_end(&client[i].spin);
1149 intel_gt_set_wedged(&i915->gt);
1154 static int live_chain_preempt(void *arg)
1156 struct drm_i915_private *i915 = arg;
1157 struct intel_engine_cs *engine;
1158 struct preempt_client hi, lo;
1159 enum intel_engine_id id;
1160 intel_wakeref_t wakeref;
1164 * Build a chain AB...BA between two contexts (A, B) and request
1165 * preemption of the last request. It should then complete before
1166 * the previously submitted spinner in B.
1169 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
1172 mutex_lock(&i915->drm.struct_mutex);
1173 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1175 if (preempt_client_init(i915, &hi))
1178 if (preempt_client_init(i915, &lo))
1181 for_each_engine(engine, i915, id) {
1182 struct i915_sched_attr attr = {
1183 .priority = I915_USER_PRIORITY(I915_PRIORITY_MAX),
1185 struct igt_live_test t;
1186 struct i915_request *rq;
1187 int ring_size, count, i;
1189 if (!intel_engine_has_preemption(engine))
1192 rq = spinner_create_request(&lo.spin,
1197 i915_request_add(rq);
1199 ring_size = rq->wa_tail - rq->head;
1201 ring_size += rq->ring->size;
1202 ring_size = rq->ring->size / ring_size;
1203 pr_debug("%s(%s): Using maximum of %d requests\n",
1204 __func__, engine->name, ring_size);
1206 igt_spinner_end(&lo.spin);
1207 if (i915_request_wait(rq, 0, HZ / 2) < 0) {
1208 pr_err("Timed out waiting to flush %s\n", engine->name);
1212 if (igt_live_test_begin(&t, i915, __func__, engine->name)) {
1217 for_each_prime_number_from(count, 1, ring_size) {
1218 rq = spinner_create_request(&hi.spin,
1223 i915_request_add(rq);
1224 if (!igt_wait_for_spinner(&hi.spin, rq))
1227 rq = spinner_create_request(&lo.spin,
1232 i915_request_add(rq);
1234 for (i = 0; i < count; i++) {
1235 rq = igt_request_alloc(lo.ctx, engine);
1238 i915_request_add(rq);
1241 rq = igt_request_alloc(hi.ctx, engine);
1244 i915_request_add(rq);
1245 engine->schedule(rq, &attr);
1247 igt_spinner_end(&hi.spin);
1248 if (i915_request_wait(rq, 0, HZ / 5) < 0) {
1249 struct drm_printer p =
1250 drm_info_printer(i915->drm.dev);
1252 pr_err("Failed to preempt over chain of %d\n",
1254 intel_engine_dump(engine, &p,
1255 "%s\n", engine->name);
1258 igt_spinner_end(&lo.spin);
1260 rq = igt_request_alloc(lo.ctx, engine);
1263 i915_request_add(rq);
1264 if (i915_request_wait(rq, 0, HZ / 5) < 0) {
1265 struct drm_printer p =
1266 drm_info_printer(i915->drm.dev);
1268 pr_err("Failed to flush low priority chain of %d requests\n",
1270 intel_engine_dump(engine, &p,
1271 "%s\n", engine->name);
1276 if (igt_live_test_end(&t)) {
1284 preempt_client_fini(&lo);
1286 preempt_client_fini(&hi);
1288 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1289 mutex_unlock(&i915->drm.struct_mutex);
1293 igt_spinner_end(&hi.spin);
1294 igt_spinner_end(&lo.spin);
1295 intel_gt_set_wedged(&i915->gt);
1300 static int live_preempt_hang(void *arg)
1302 struct drm_i915_private *i915 = arg;
1303 struct i915_gem_context *ctx_hi, *ctx_lo;
1304 struct igt_spinner spin_hi, spin_lo;
1305 struct intel_engine_cs *engine;
1306 enum intel_engine_id id;
1307 intel_wakeref_t wakeref;
1310 if (!HAS_LOGICAL_RING_PREEMPTION(i915))
1313 if (!intel_has_reset_engine(&i915->gt))
1316 mutex_lock(&i915->drm.struct_mutex);
1317 wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1319 if (igt_spinner_init(&spin_hi, &i915->gt))
1322 if (igt_spinner_init(&spin_lo, &i915->gt))
1325 ctx_hi = kernel_context(i915);
1328 ctx_hi->sched.priority =
1329 I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
1331 ctx_lo = kernel_context(i915);
1334 ctx_lo->sched.priority =
1335 I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
1337 for_each_engine(engine, i915, id) {
1338 struct i915_request *rq;
1340 if (!intel_engine_has_preemption(engine))
1343 rq = spinner_create_request(&spin_lo, ctx_lo, engine,
1350 i915_request_add(rq);
1351 if (!igt_wait_for_spinner(&spin_lo, rq)) {
1352 GEM_TRACE("lo spinner failed to start\n");
1354 intel_gt_set_wedged(&i915->gt);
1359 rq = spinner_create_request(&spin_hi, ctx_hi, engine,
1362 igt_spinner_end(&spin_lo);
1367 init_completion(&engine->execlists.preempt_hang.completion);
1368 engine->execlists.preempt_hang.inject_hang = true;
1370 i915_request_add(rq);
1372 if (!wait_for_completion_timeout(&engine->execlists.preempt_hang.completion,
1374 pr_err("Preemption did not occur within timeout!");
1376 intel_gt_set_wedged(&i915->gt);
1381 set_bit(I915_RESET_ENGINE + id, &i915->gt.reset.flags);
1382 intel_engine_reset(engine, NULL);
1383 clear_bit(I915_RESET_ENGINE + id, &i915->gt.reset.flags);
1385 engine->execlists.preempt_hang.inject_hang = false;
1387 if (!igt_wait_for_spinner(&spin_hi, rq)) {
1388 GEM_TRACE("hi spinner failed to start\n");
1390 intel_gt_set_wedged(&i915->gt);
1395 igt_spinner_end(&spin_hi);
1396 igt_spinner_end(&spin_lo);
1397 if (igt_flush_test(i915, I915_WAIT_LOCKED)) {
1405 kernel_context_close(ctx_lo);
1407 kernel_context_close(ctx_hi);
1409 igt_spinner_fini(&spin_lo);
1411 igt_spinner_fini(&spin_hi);
1413 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1414 mutex_unlock(&i915->drm.struct_mutex);
1418 static int random_range(struct rnd_state *rnd, int min, int max)
1420 return i915_prandom_u32_max_state(max - min, rnd) + min;
1423 static int random_priority(struct rnd_state *rnd)
1425 return random_range(rnd, I915_PRIORITY_MIN, I915_PRIORITY_MAX);
1428 struct preempt_smoke {
1429 struct drm_i915_private *i915;
1430 struct i915_gem_context **contexts;
1431 struct intel_engine_cs *engine;
1432 struct drm_i915_gem_object *batch;
1433 unsigned int ncontext;
1434 struct rnd_state prng;
1435 unsigned long count;
1438 static struct i915_gem_context *smoke_context(struct preempt_smoke *smoke)
1440 return smoke->contexts[i915_prandom_u32_max_state(smoke->ncontext,
1444 static int smoke_submit(struct preempt_smoke *smoke,
1445 struct i915_gem_context *ctx, int prio,
1446 struct drm_i915_gem_object *batch)
1448 struct i915_request *rq;
1449 struct i915_vma *vma = NULL;
1453 vma = i915_vma_instance(batch, ctx->vm, NULL);
1455 return PTR_ERR(vma);
1457 err = i915_vma_pin(vma, 0, 0, PIN_USER);
1462 ctx->sched.priority = prio;
1464 rq = igt_request_alloc(ctx, smoke->engine);
1472 err = i915_request_await_object(rq, vma->obj, false);
1474 err = i915_vma_move_to_active(vma, rq, 0);
1476 err = rq->engine->emit_bb_start(rq,
1479 i915_vma_unlock(vma);
1482 i915_request_add(rq);
1486 i915_vma_unpin(vma);
1491 static int smoke_crescendo_thread(void *arg)
1493 struct preempt_smoke *smoke = arg;
1494 IGT_TIMEOUT(end_time);
1495 unsigned long count;
1499 struct i915_gem_context *ctx = smoke_context(smoke);
1502 mutex_lock(&smoke->i915->drm.struct_mutex);
1503 err = smoke_submit(smoke,
1504 ctx, count % I915_PRIORITY_MAX,
1506 mutex_unlock(&smoke->i915->drm.struct_mutex);
1511 } while (!__igt_timeout(end_time, NULL));
1513 smoke->count = count;
1517 static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags)
1518 #define BATCH BIT(0)
1520 struct task_struct *tsk[I915_NUM_ENGINES] = {};
1521 struct preempt_smoke arg[I915_NUM_ENGINES];
1522 struct intel_engine_cs *engine;
1523 enum intel_engine_id id;
1524 unsigned long count;
1527 mutex_unlock(&smoke->i915->drm.struct_mutex);
1529 for_each_engine(engine, smoke->i915, id) {
1531 arg[id].engine = engine;
1532 if (!(flags & BATCH))
1533 arg[id].batch = NULL;
1536 tsk[id] = kthread_run(smoke_crescendo_thread, &arg,
1537 "igt/smoke:%d", id);
1538 if (IS_ERR(tsk[id])) {
1539 err = PTR_ERR(tsk[id]);
1542 get_task_struct(tsk[id]);
1546 for_each_engine(engine, smoke->i915, id) {
1549 if (IS_ERR_OR_NULL(tsk[id]))
1552 status = kthread_stop(tsk[id]);
1556 count += arg[id].count;
1558 put_task_struct(tsk[id]);
1561 mutex_lock(&smoke->i915->drm.struct_mutex);
1563 pr_info("Submitted %lu crescendo:%x requests across %d engines and %d contexts\n",
1565 RUNTIME_INFO(smoke->i915)->num_engines, smoke->ncontext);
1569 static int smoke_random(struct preempt_smoke *smoke, unsigned int flags)
1571 enum intel_engine_id id;
1572 IGT_TIMEOUT(end_time);
1573 unsigned long count;
1577 for_each_engine(smoke->engine, smoke->i915, id) {
1578 struct i915_gem_context *ctx = smoke_context(smoke);
1581 err = smoke_submit(smoke,
1582 ctx, random_priority(&smoke->prng),
1583 flags & BATCH ? smoke->batch : NULL);
1589 } while (!__igt_timeout(end_time, NULL));
1591 pr_info("Submitted %lu random:%x requests across %d engines and %d contexts\n",
1593 RUNTIME_INFO(smoke->i915)->num_engines, smoke->ncontext);
1597 static int live_preempt_smoke(void *arg)
1599 struct preempt_smoke smoke = {
1601 .prng = I915_RND_STATE_INITIALIZER(i915_selftest.random_seed),
1604 const unsigned int phase[] = { 0, BATCH };
1605 intel_wakeref_t wakeref;
1606 struct igt_live_test t;
1611 if (!HAS_LOGICAL_RING_PREEMPTION(smoke.i915))
1614 smoke.contexts = kmalloc_array(smoke.ncontext,
1615 sizeof(*smoke.contexts),
1617 if (!smoke.contexts)
1620 mutex_lock(&smoke.i915->drm.struct_mutex);
1621 wakeref = intel_runtime_pm_get(&smoke.i915->runtime_pm);
1623 smoke.batch = i915_gem_object_create_internal(smoke.i915, PAGE_SIZE);
1624 if (IS_ERR(smoke.batch)) {
1625 err = PTR_ERR(smoke.batch);
1629 cs = i915_gem_object_pin_map(smoke.batch, I915_MAP_WB);
1634 for (n = 0; n < PAGE_SIZE / sizeof(*cs) - 1; n++)
1635 cs[n] = MI_ARB_CHECK;
1636 cs[n] = MI_BATCH_BUFFER_END;
1637 i915_gem_object_flush_map(smoke.batch);
1638 i915_gem_object_unpin_map(smoke.batch);
1640 if (igt_live_test_begin(&t, smoke.i915, __func__, "all")) {
1645 for (n = 0; n < smoke.ncontext; n++) {
1646 smoke.contexts[n] = kernel_context(smoke.i915);
1647 if (!smoke.contexts[n])
1651 for (n = 0; n < ARRAY_SIZE(phase); n++) {
1652 err = smoke_crescendo(&smoke, phase[n]);
1656 err = smoke_random(&smoke, phase[n]);
1662 if (igt_live_test_end(&t))
1665 for (n = 0; n < smoke.ncontext; n++) {
1666 if (!smoke.contexts[n])
1668 kernel_context_close(smoke.contexts[n]);
1672 i915_gem_object_put(smoke.batch);
1674 intel_runtime_pm_put(&smoke.i915->runtime_pm, wakeref);
1675 mutex_unlock(&smoke.i915->drm.struct_mutex);
1676 kfree(smoke.contexts);
1681 static int nop_virtual_engine(struct drm_i915_private *i915,
1682 struct intel_engine_cs **siblings,
1683 unsigned int nsibling,
1686 #define CHAIN BIT(0)
1688 IGT_TIMEOUT(end_time);
1689 struct i915_request *request[16];
1690 struct i915_gem_context *ctx[16];
1691 struct intel_context *ve[16];
1692 unsigned long n, prime, nc;
1693 struct igt_live_test t;
1694 ktime_t times[2] = {};
1697 GEM_BUG_ON(!nctx || nctx > ARRAY_SIZE(ctx));
1699 for (n = 0; n < nctx; n++) {
1700 ctx[n] = kernel_context(i915);
1707 ve[n] = intel_execlists_create_virtual(ctx[n],
1708 siblings, nsibling);
1709 if (IS_ERR(ve[n])) {
1710 kernel_context_close(ctx[n]);
1711 err = PTR_ERR(ve[n]);
1716 err = intel_context_pin(ve[n]);
1718 intel_context_put(ve[n]);
1719 kernel_context_close(ctx[n]);
1725 err = igt_live_test_begin(&t, i915, __func__, ve[0]->engine->name);
1729 for_each_prime_number_from(prime, 1, 8192) {
1730 times[1] = ktime_get_raw();
1732 if (flags & CHAIN) {
1733 for (nc = 0; nc < nctx; nc++) {
1734 for (n = 0; n < prime; n++) {
1736 i915_request_create(ve[nc]);
1737 if (IS_ERR(request[nc])) {
1738 err = PTR_ERR(request[nc]);
1742 i915_request_add(request[nc]);
1746 for (n = 0; n < prime; n++) {
1747 for (nc = 0; nc < nctx; nc++) {
1749 i915_request_create(ve[nc]);
1750 if (IS_ERR(request[nc])) {
1751 err = PTR_ERR(request[nc]);
1755 i915_request_add(request[nc]);
1760 for (nc = 0; nc < nctx; nc++) {
1761 if (i915_request_wait(request[nc], 0, HZ / 10) < 0) {
1762 pr_err("%s(%s): wait for %llx:%lld timed out\n",
1763 __func__, ve[0]->engine->name,
1764 request[nc]->fence.context,
1765 request[nc]->fence.seqno);
1767 GEM_TRACE("%s(%s) failed at request %llx:%lld\n",
1768 __func__, ve[0]->engine->name,
1769 request[nc]->fence.context,
1770 request[nc]->fence.seqno);
1772 intel_gt_set_wedged(&i915->gt);
1777 times[1] = ktime_sub(ktime_get_raw(), times[1]);
1779 times[0] = times[1];
1781 if (__igt_timeout(end_time, NULL))
1785 err = igt_live_test_end(&t);
1789 pr_info("Requestx%d latencies on %s: 1 = %lluns, %lu = %lluns\n",
1790 nctx, ve[0]->engine->name, ktime_to_ns(times[0]),
1791 prime, div64_u64(ktime_to_ns(times[1]), prime));
1794 if (igt_flush_test(i915, I915_WAIT_LOCKED))
1797 for (nc = 0; nc < nctx; nc++) {
1798 intel_context_unpin(ve[nc]);
1799 intel_context_put(ve[nc]);
1800 kernel_context_close(ctx[nc]);
1805 static int live_virtual_engine(void *arg)
1807 struct drm_i915_private *i915 = arg;
1808 struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
1809 struct intel_engine_cs *engine;
1810 struct intel_gt *gt = &i915->gt;
1811 enum intel_engine_id id;
1812 unsigned int class, inst;
1815 if (USES_GUC_SUBMISSION(i915))
1818 mutex_lock(&i915->drm.struct_mutex);
1820 for_each_engine(engine, i915, id) {
1821 err = nop_virtual_engine(i915, &engine, 1, 1, 0);
1823 pr_err("Failed to wrap engine %s: err=%d\n",
1829 for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
1833 for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
1834 if (!gt->engine_class[class][inst])
1837 siblings[nsibling++] = gt->engine_class[class][inst];
1842 for (n = 1; n <= nsibling + 1; n++) {
1843 err = nop_virtual_engine(i915, siblings, nsibling,
1849 err = nop_virtual_engine(i915, siblings, nsibling, n, CHAIN);
1855 mutex_unlock(&i915->drm.struct_mutex);
1859 static int mask_virtual_engine(struct drm_i915_private *i915,
1860 struct intel_engine_cs **siblings,
1861 unsigned int nsibling)
1863 struct i915_request *request[MAX_ENGINE_INSTANCE + 1];
1864 struct i915_gem_context *ctx;
1865 struct intel_context *ve;
1866 struct igt_live_test t;
1871 * Check that by setting the execution mask on a request, we can
1872 * restrict it to our desired engine within the virtual engine.
1875 ctx = kernel_context(i915);
1879 ve = intel_execlists_create_virtual(ctx, siblings, nsibling);
1885 err = intel_context_pin(ve);
1889 err = igt_live_test_begin(&t, i915, __func__, ve->engine->name);
1893 for (n = 0; n < nsibling; n++) {
1894 request[n] = i915_request_create(ve);
1895 if (IS_ERR(request[n])) {
1896 err = PTR_ERR(request[n]);
1901 /* Reverse order as it's more likely to be unnatural */
1902 request[n]->execution_mask = siblings[nsibling - n - 1]->mask;
1904 i915_request_get(request[n]);
1905 i915_request_add(request[n]);
1908 for (n = 0; n < nsibling; n++) {
1909 if (i915_request_wait(request[n], 0, HZ / 10) < 0) {
1910 pr_err("%s(%s): wait for %llx:%lld timed out\n",
1911 __func__, ve->engine->name,
1912 request[n]->fence.context,
1913 request[n]->fence.seqno);
1915 GEM_TRACE("%s(%s) failed at request %llx:%lld\n",
1916 __func__, ve->engine->name,
1917 request[n]->fence.context,
1918 request[n]->fence.seqno);
1920 intel_gt_set_wedged(&i915->gt);
1925 if (request[n]->engine != siblings[nsibling - n - 1]) {
1926 pr_err("Executed on wrong sibling '%s', expected '%s'\n",
1927 request[n]->engine->name,
1928 siblings[nsibling - n - 1]->name);
1934 err = igt_live_test_end(&t);
1939 if (igt_flush_test(i915, I915_WAIT_LOCKED))
1942 for (n = 0; n < nsibling; n++)
1943 i915_request_put(request[n]);
1946 intel_context_unpin(ve);
1948 intel_context_put(ve);
1950 kernel_context_close(ctx);
1954 static int live_virtual_mask(void *arg)
1956 struct drm_i915_private *i915 = arg;
1957 struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
1958 struct intel_gt *gt = &i915->gt;
1959 unsigned int class, inst;
1962 if (USES_GUC_SUBMISSION(i915))
1965 mutex_lock(&i915->drm.struct_mutex);
1967 for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
1968 unsigned int nsibling;
1971 for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
1972 if (!gt->engine_class[class][inst])
1975 siblings[nsibling++] = gt->engine_class[class][inst];
1980 err = mask_virtual_engine(i915, siblings, nsibling);
1986 mutex_unlock(&i915->drm.struct_mutex);
1990 static int bond_virtual_engine(struct drm_i915_private *i915,
1992 struct intel_engine_cs **siblings,
1993 unsigned int nsibling,
1995 #define BOND_SCHEDULE BIT(0)
1997 struct intel_engine_cs *master;
1998 struct i915_gem_context *ctx;
1999 struct i915_request *rq[16];
2000 enum intel_engine_id id;
2004 GEM_BUG_ON(nsibling >= ARRAY_SIZE(rq) - 1);
2006 ctx = kernel_context(i915);
2011 rq[0] = ERR_PTR(-ENOMEM);
2012 for_each_engine(master, i915, id) {
2013 struct i915_sw_fence fence = {};
2015 if (master->class == class)
2018 memset_p((void *)rq, ERR_PTR(-EINVAL), ARRAY_SIZE(rq));
2020 rq[0] = igt_request_alloc(ctx, master);
2021 if (IS_ERR(rq[0])) {
2022 err = PTR_ERR(rq[0]);
2025 i915_request_get(rq[0]);
2027 if (flags & BOND_SCHEDULE) {
2028 onstack_fence_init(&fence);
2029 err = i915_sw_fence_await_sw_fence_gfp(&rq[0]->submit,
2033 i915_request_add(rq[0]);
2037 for (n = 0; n < nsibling; n++) {
2038 struct intel_context *ve;
2040 ve = intel_execlists_create_virtual(ctx,
2045 onstack_fence_fini(&fence);
2049 err = intel_virtual_engine_attach_bond(ve->engine,
2053 intel_context_put(ve);
2054 onstack_fence_fini(&fence);
2058 err = intel_context_pin(ve);
2059 intel_context_put(ve);
2061 onstack_fence_fini(&fence);
2065 rq[n + 1] = i915_request_create(ve);
2066 intel_context_unpin(ve);
2067 if (IS_ERR(rq[n + 1])) {
2068 err = PTR_ERR(rq[n + 1]);
2069 onstack_fence_fini(&fence);
2072 i915_request_get(rq[n + 1]);
2074 err = i915_request_await_execution(rq[n + 1],
2076 ve->engine->bond_execute);
2077 i915_request_add(rq[n + 1]);
2079 onstack_fence_fini(&fence);
2083 onstack_fence_fini(&fence);
2085 if (i915_request_wait(rq[0], 0, HZ / 10) < 0) {
2086 pr_err("Master request did not execute (on %s)!\n",
2087 rq[0]->engine->name);
2092 for (n = 0; n < nsibling; n++) {
2093 if (i915_request_wait(rq[n + 1], 0,
2094 MAX_SCHEDULE_TIMEOUT) < 0) {
2099 if (rq[n + 1]->engine != siblings[n]) {
2100 pr_err("Bonded request did not execute on target engine: expected %s, used %s; master was %s\n",
2102 rq[n + 1]->engine->name,
2103 rq[0]->engine->name);
2109 for (n = 0; !IS_ERR(rq[n]); n++)
2110 i915_request_put(rq[n]);
2111 rq[0] = ERR_PTR(-ENOMEM);
2115 for (n = 0; !IS_ERR(rq[n]); n++)
2116 i915_request_put(rq[n]);
2117 if (igt_flush_test(i915, I915_WAIT_LOCKED))
2120 kernel_context_close(ctx);
2124 static int live_virtual_bond(void *arg)
2126 static const struct phase {
2131 { "schedule", BOND_SCHEDULE },
2134 struct drm_i915_private *i915 = arg;
2135 struct intel_engine_cs *siblings[MAX_ENGINE_INSTANCE + 1];
2136 struct intel_gt *gt = &i915->gt;
2137 unsigned int class, inst;
2140 if (USES_GUC_SUBMISSION(i915))
2143 mutex_lock(&i915->drm.struct_mutex);
2145 for (class = 0; class <= MAX_ENGINE_CLASS; class++) {
2146 const struct phase *p;
2150 for (inst = 0; inst <= MAX_ENGINE_INSTANCE; inst++) {
2151 if (!gt->engine_class[class][inst])
2154 GEM_BUG_ON(nsibling == ARRAY_SIZE(siblings));
2155 siblings[nsibling++] = gt->engine_class[class][inst];
2160 for (p = phases; p->name; p++) {
2161 err = bond_virtual_engine(i915,
2162 class, siblings, nsibling,
2165 pr_err("%s(%s): failed class=%d, nsibling=%d, err=%d\n",
2166 __func__, p->name, class, nsibling, err);
2173 mutex_unlock(&i915->drm.struct_mutex);
2177 int intel_execlists_live_selftests(struct drm_i915_private *i915)
2179 static const struct i915_subtest tests[] = {
2180 SUBTEST(live_sanitycheck),
2181 SUBTEST(live_timeslice_preempt),
2182 SUBTEST(live_busywait_preempt),
2183 SUBTEST(live_preempt),
2184 SUBTEST(live_late_preempt),
2185 SUBTEST(live_nopreempt),
2186 SUBTEST(live_suppress_self_preempt),
2187 SUBTEST(live_suppress_wait_preempt),
2188 SUBTEST(live_chain_preempt),
2189 SUBTEST(live_preempt_hang),
2190 SUBTEST(live_preempt_smoke),
2191 SUBTEST(live_virtual_engine),
2192 SUBTEST(live_virtual_mask),
2193 SUBTEST(live_virtual_bond),
2196 if (!HAS_EXECLISTS(i915))
2199 if (intel_gt_is_wedged(&i915->gt))
2202 return i915_live_subtests(tests, i915);
2205 static void hexdump(const void *buf, size_t len)
2207 const size_t rowsize = 8 * sizeof(u32);
2208 const void *prev = NULL;
2212 for (pos = 0; pos < len; pos += rowsize) {
2215 if (prev && !memcmp(prev, buf + pos, rowsize)) {
2223 WARN_ON_ONCE(hex_dump_to_buffer(buf + pos, len - pos,
2224 rowsize, sizeof(u32),
2226 false) >= sizeof(line));
2227 pr_info("[%04zx] %s\n", pos, line);
2234 static int live_lrc_layout(void *arg)
2236 struct intel_gt *gt = arg;
2237 struct intel_engine_cs *engine;
2238 enum intel_engine_id id;
2243 * Check the registers offsets we use to create the initial reg state
2244 * match the layout saved by HW.
2247 mem = kmalloc(PAGE_SIZE, GFP_KERNEL);
2252 for_each_engine(engine, gt->i915, id) {
2256 if (!engine->default_state)
2259 hw = i915_gem_object_pin_map(engine->default_state,
2265 hw += LRC_STATE_PN * PAGE_SIZE / sizeof(*hw);
2267 lrc = memset(mem, 0, PAGE_SIZE);
2268 execlists_init_reg_state(lrc,
2269 engine->kernel_context,
2271 engine->kernel_context->ring,
2283 if ((lri & GENMASK(31, 23)) != MI_INSTR(0x22, 0)) {
2284 pr_err("%s: Expected LRI command at dword %d, found %08x\n",
2285 engine->name, dw, lri);
2290 if (lrc[dw] != lri) {
2291 pr_err("%s: LRI command mismatch at dword %d, expected %08x found %08x\n",
2292 engine->name, dw, lri, lrc[dw]);
2302 if (hw[dw] != lrc[dw]) {
2303 pr_err("%s: Different registers found at dword %d, expected %x, found %x\n",
2304 engine->name, dw, hw[dw], lrc[dw]);
2310 * Skip over the actual register value as we
2311 * expect that to differ.
2316 } while ((lrc[dw] & ~BIT(0)) != MI_BATCH_BUFFER_END);
2319 pr_info("%s: HW register image:\n", engine->name);
2320 hexdump(hw, PAGE_SIZE);
2322 pr_info("%s: SW register image:\n", engine->name);
2323 hexdump(lrc, PAGE_SIZE);
2326 i915_gem_object_unpin_map(engine->default_state);
2335 int intel_lrc_live_selftests(struct drm_i915_private *i915)
2337 static const struct i915_subtest tests[] = {
2338 SUBTEST(live_lrc_layout),
2341 if (!HAS_LOGICAL_RING_CONTEXTS(i915))
2344 return intel_gt_live_subtests(tests, &i915->gt);