1// SPDX-License-Identifier: MIT
2/*
3 * Copyright �� 2016 Intel Corporation
4 */
5
6#include <linux/kthread.h>
7
8#include "gem/i915_gem_context.h"
9#include "gem/i915_gem_internal.h"
10
11#include "i915_gem_evict.h"
12#include "intel_gt.h"
13#include "intel_engine_heartbeat.h"
14#include "intel_engine_pm.h"
15#include "selftest_engine_heartbeat.h"
16
17#include "i915_selftest.h"
18#include "selftests/i915_random.h"
19#include "selftests/igt_flush_test.h"
20#include "selftests/igt_reset.h"
21#include "selftests/igt_atomic.h"
22#include "selftests/igt_spinner.h"
23#include "selftests/intel_scheduler_helpers.h"
24
25#include "selftests/mock_drm.h"
26
27#include "gem/selftests/mock_context.h"
28#include "gem/selftests/igt_gem_utils.h"
29
30#define IGT_IDLE_TIMEOUT 50 /* ms; time to wait after flushing between tests */
31
32struct hang {
33	struct intel_gt *gt;
34	struct drm_i915_gem_object *hws;
35	struct drm_i915_gem_object *obj;
36	struct i915_gem_context *ctx;
37	u32 *seqno;
38	u32 *batch;
39};
40
41static int hang_init(struct hang *h, struct intel_gt *gt)
42{
43	void *vaddr;
44	int err;
45
46	memset(h, 0, sizeof(*h));
47	h->gt = gt;
48
49	h->ctx = kernel_context(gt->i915, NULL);
50	if (IS_ERR(h->ctx))
51		return PTR_ERR(h->ctx);
52
53	GEM_BUG_ON(i915_gem_context_is_bannable(h->ctx));
54
55	h->hws = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
56	if (IS_ERR(h->hws)) {
57		err = PTR_ERR(h->hws);
58		goto err_ctx;
59	}
60
61	h->obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
62	if (IS_ERR(h->obj)) {
63		err = PTR_ERR(h->obj);
64		goto err_hws;
65	}
66
67	i915_gem_object_set_cache_coherency(h->hws, I915_CACHE_LLC);
68	vaddr = i915_gem_object_pin_map_unlocked(h->hws, I915_MAP_WB);
69	if (IS_ERR(vaddr)) {
70		err = PTR_ERR(vaddr);
71		goto err_obj;
72	}
73	h->seqno = memset(vaddr, 0xff, PAGE_SIZE);
74
75	vaddr = i915_gem_object_pin_map_unlocked(h->obj,
76						 intel_gt_coherent_map_type(gt, h->obj, false));
77	if (IS_ERR(vaddr)) {
78		err = PTR_ERR(vaddr);
79		goto err_unpin_hws;
80	}
81	h->batch = vaddr;
82
83	return 0;
84
85err_unpin_hws:
86	i915_gem_object_unpin_map(h->hws);
87err_obj:
88	i915_gem_object_put(h->obj);
89err_hws:
90	i915_gem_object_put(h->hws);
91err_ctx:
92	kernel_context_close(h->ctx);
93	return err;
94}
95
96static u64 hws_address(const struct i915_vma *hws,
97		       const struct i915_request *rq)
98{
99	return i915_vma_offset(hws) +
100	       offset_in_page(sizeof(u32) * rq->fence.context);
101}
102
103static struct i915_request *
104hang_create_request(struct hang *h, struct intel_engine_cs *engine)
105{
106	struct intel_gt *gt = h->gt;
107	struct i915_address_space *vm = i915_gem_context_get_eb_vm(h->ctx);
108	struct drm_i915_gem_object *obj;
109	struct i915_request *rq = NULL;
110	struct i915_vma *hws, *vma;
111	unsigned int flags;
112	void *vaddr;
113	u32 *batch;
114	int err;
115
116	obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
117	if (IS_ERR(obj)) {
118		i915_vm_put(vm);
119		return ERR_CAST(obj);
120	}
121
122	vaddr = i915_gem_object_pin_map_unlocked(obj, intel_gt_coherent_map_type(gt, obj, false));
123	if (IS_ERR(vaddr)) {
124		i915_gem_object_put(obj);
125		i915_vm_put(vm);
126		return ERR_CAST(vaddr);
127	}
128
129	i915_gem_object_unpin_map(h->obj);
130	i915_gem_object_put(h->obj);
131
132	h->obj = obj;
133	h->batch = vaddr;
134
135	vma = i915_vma_instance(h->obj, vm, NULL);
136	if (IS_ERR(vma)) {
137		i915_vm_put(vm);
138		return ERR_CAST(vma);
139	}
140
141	hws = i915_vma_instance(h->hws, vm, NULL);
142	if (IS_ERR(hws)) {
143		i915_vm_put(vm);
144		return ERR_CAST(hws);
145	}
146
147	err = i915_vma_pin(vma, 0, 0, PIN_USER);
148	if (err) {
149		i915_vm_put(vm);
150		return ERR_PTR(err);
151	}
152
153	err = i915_vma_pin(hws, 0, 0, PIN_USER);
154	if (err)
155		goto unpin_vma;
156
157	rq = igt_request_alloc(h->ctx, engine);
158	if (IS_ERR(rq)) {
159		err = PTR_ERR(rq);
160		goto unpin_hws;
161	}
162
163	err = igt_vma_move_to_active_unlocked(vma, rq, 0);
164	if (err)
165		goto cancel_rq;
166
167	err = igt_vma_move_to_active_unlocked(hws, rq, 0);
168	if (err)
169		goto cancel_rq;
170
171	batch = h->batch;
172	if (GRAPHICS_VER(gt->i915) >= 8) {
173		*batch++ = MI_STORE_DWORD_IMM_GEN4;
174		*batch++ = lower_32_bits(hws_address(hws, rq));
175		*batch++ = upper_32_bits(hws_address(hws, rq));
176		*batch++ = rq->fence.seqno;
177		*batch++ = MI_NOOP;
178
179		memset(batch, 0, 1024);
180		batch += 1024 / sizeof(*batch);
181
182		*batch++ = MI_NOOP;
183		*batch++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
184		*batch++ = lower_32_bits(i915_vma_offset(vma));
185		*batch++ = upper_32_bits(i915_vma_offset(vma));
186	} else if (GRAPHICS_VER(gt->i915) >= 6) {
187		*batch++ = MI_STORE_DWORD_IMM_GEN4;
188		*batch++ = 0;
189		*batch++ = lower_32_bits(hws_address(hws, rq));
190		*batch++ = rq->fence.seqno;
191		*batch++ = MI_NOOP;
192
193		memset(batch, 0, 1024);
194		batch += 1024 / sizeof(*batch);
195
196		*batch++ = MI_NOOP;
197		*batch++ = MI_BATCH_BUFFER_START | 1 << 8;
198		*batch++ = lower_32_bits(i915_vma_offset(vma));
199	} else if (GRAPHICS_VER(gt->i915) >= 4) {
200		*batch++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
201		*batch++ = 0;
202		*batch++ = lower_32_bits(hws_address(hws, rq));
203		*batch++ = rq->fence.seqno;
204		*batch++ = MI_NOOP;
205
206		memset(batch, 0, 1024);
207		batch += 1024 / sizeof(*batch);
208
209		*batch++ = MI_NOOP;
210		*batch++ = MI_BATCH_BUFFER_START | 2 << 6;
211		*batch++ = lower_32_bits(i915_vma_offset(vma));
212	} else {
213		*batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
214		*batch++ = lower_32_bits(hws_address(hws, rq));
215		*batch++ = rq->fence.seqno;
216		*batch++ = MI_NOOP;
217
218		memset(batch, 0, 1024);
219		batch += 1024 / sizeof(*batch);
220
221		*batch++ = MI_NOOP;
222		*batch++ = MI_BATCH_BUFFER_START | 2 << 6;
223		*batch++ = lower_32_bits(i915_vma_offset(vma));
224	}
225	*batch++ = MI_BATCH_BUFFER_END; /* not reached */
226	intel_gt_chipset_flush(engine->gt);
227
228	if (rq->engine->emit_init_breadcrumb) {
229		err = rq->engine->emit_init_breadcrumb(rq);
230		if (err)
231			goto cancel_rq;
232	}
233
234	flags = 0;
235	if (GRAPHICS_VER(gt->i915) <= 5)
236		flags |= I915_DISPATCH_SECURE;
237
238	err = rq->engine->emit_bb_start(rq, i915_vma_offset(vma), PAGE_SIZE, flags);
239
240cancel_rq:
241	if (err) {
242		i915_request_set_error_once(rq, err);
243		i915_request_add(rq);
244	}
245unpin_hws:
246	i915_vma_unpin(hws);
247unpin_vma:
248	i915_vma_unpin(vma);
249	i915_vm_put(vm);
250	return err ? ERR_PTR(err) : rq;
251}
252
253static u32 hws_seqno(const struct hang *h, const struct i915_request *rq)
254{
255	return READ_ONCE(h->seqno[rq->fence.context % (PAGE_SIZE/sizeof(u32))]);
256}
257
258static void hang_fini(struct hang *h)
259{
260	*h->batch = MI_BATCH_BUFFER_END;
261	intel_gt_chipset_flush(h->gt);
262
263	i915_gem_object_unpin_map(h->obj);
264	i915_gem_object_put(h->obj);
265
266	i915_gem_object_unpin_map(h->hws);
267	i915_gem_object_put(h->hws);
268
269	kernel_context_close(h->ctx);
270
271	igt_flush_test(h->gt->i915);
272}
273
274static bool wait_until_running(struct hang *h, struct i915_request *rq)
275{
276	return !(wait_for_us(i915_seqno_passed(hws_seqno(h, rq),
277					       rq->fence.seqno),
278			     10) &&
279		 wait_for(i915_seqno_passed(hws_seqno(h, rq),
280					    rq->fence.seqno),
281			  1000));
282}
283
284static int igt_hang_sanitycheck(void *arg)
285{
286	struct intel_gt *gt = arg;
287	struct i915_request *rq;
288	struct intel_engine_cs *engine;
289	enum intel_engine_id id;
290	struct hang h;
291	int err;
292
293	/* Basic check that we can execute our hanging batch */
294
295	err = hang_init(&h, gt);
296	if (err)
297		return err;
298
299	for_each_engine(engine, gt, id) {
300		struct intel_wedge_me w;
301		long timeout;
302
303		if (!intel_engine_can_store_dword(engine))
304			continue;
305
306		rq = hang_create_request(&h, engine);
307		if (IS_ERR(rq)) {
308			err = PTR_ERR(rq);
309			pr_err("Failed to create request for %s, err=%d\n",
310			       engine->name, err);
311			goto fini;
312		}
313
314		i915_request_get(rq);
315
316		*h.batch = MI_BATCH_BUFFER_END;
317		intel_gt_chipset_flush(engine->gt);
318
319		i915_request_add(rq);
320
321		timeout = 0;
322		intel_wedge_on_timeout(&w, gt, HZ / 10 /* 100ms */)
323			timeout = i915_request_wait(rq, 0,
324						    MAX_SCHEDULE_TIMEOUT);
325		if (intel_gt_is_wedged(gt))
326			timeout = -EIO;
327
328		i915_request_put(rq);
329
330		if (timeout < 0) {
331			err = timeout;
332			pr_err("Wait for request failed on %s, err=%d\n",
333			       engine->name, err);
334			goto fini;
335		}
336	}
337
338fini:
339	hang_fini(&h);
340	return err;
341}
342
343static bool wait_for_idle(struct intel_engine_cs *engine)
344{
345	return wait_for(intel_engine_is_idle(engine), IGT_IDLE_TIMEOUT) == 0;
346}
347
348static int igt_reset_nop(void *arg)
349{
350	struct intel_gt *gt = arg;
351	struct i915_gpu_error *global = &gt->i915->gpu_error;
352	struct intel_engine_cs *engine;
353	unsigned int reset_count, count;
354	enum intel_engine_id id;
355	IGT_TIMEOUT(end_time);
356	int err = 0;
357
358	/* Check that we can reset during non-user portions of requests */
359
360	reset_count = i915_reset_count(global);
361	count = 0;
362	do {
363		for_each_engine(engine, gt, id) {
364			struct intel_context *ce;
365			int i;
366
367			ce = intel_context_create(engine);
368			if (IS_ERR(ce)) {
369				err = PTR_ERR(ce);
370				pr_err("[%s] Create context failed: %d!\n", engine->name, err);
371				break;
372			}
373
374			for (i = 0; i < 16; i++) {
375				struct i915_request *rq;
376
377				rq = intel_context_create_request(ce);
378				if (IS_ERR(rq)) {
379					err = PTR_ERR(rq);
380					pr_err("[%s] Create request failed: %d!\n",
381					       engine->name, err);
382					break;
383				}
384
385				i915_request_add(rq);
386			}
387
388			intel_context_put(ce);
389		}
390
391		igt_global_reset_lock(gt);
392		intel_gt_reset(gt, ALL_ENGINES, NULL);
393		igt_global_reset_unlock(gt);
394
395		if (intel_gt_is_wedged(gt)) {
396			pr_err("[%s] GT is wedged!\n", engine->name);
397			err = -EIO;
398			break;
399		}
400
401		if (i915_reset_count(global) != reset_count + ++count) {
402			pr_err("[%s] Reset not recorded: %d vs %d + %d!\n",
403			       engine->name, i915_reset_count(global), reset_count, count);
404			err = -EINVAL;
405			break;
406		}
407
408		err = igt_flush_test(gt->i915);
409		if (err) {
410			pr_err("[%s] Flush failed: %d!\n", engine->name, err);
411			break;
412		}
413	} while (time_before(jiffies, end_time));
414	pr_info("%s: %d resets\n", __func__, count);
415
416	if (igt_flush_test(gt->i915)) {
417		pr_err("Post flush failed: %d!\n", err);
418		err = -EIO;
419	}
420
421	return err;
422}
423
424static int igt_reset_nop_engine(void *arg)
425{
426	struct intel_gt *gt = arg;
427	struct i915_gpu_error *global = &gt->i915->gpu_error;
428	struct intel_engine_cs *engine;
429	enum intel_engine_id id;
430
431	/* Check that we can engine-reset during non-user portions */
432
433	if (!intel_has_reset_engine(gt))
434		return 0;
435
436	for_each_engine(engine, gt, id) {
437		unsigned int reset_count, reset_engine_count, count;
438		struct intel_context *ce;
439		IGT_TIMEOUT(end_time);
440		int err;
441
442		if (intel_engine_uses_guc(engine)) {
443			/* Engine level resets are triggered by GuC when a hang
444			 * is detected. They can't be triggered by the KMD any
445			 * more. Thus a nop batch cannot be used as a reset test
446			 */
447			continue;
448		}
449
450		ce = intel_context_create(engine);
451		if (IS_ERR(ce)) {
452			pr_err("[%s] Create context failed: %pe!\n", engine->name, ce);
453			return PTR_ERR(ce);
454		}
455
456		reset_count = i915_reset_count(global);
457		reset_engine_count = i915_reset_engine_count(global, engine);
458		count = 0;
459
460		st_engine_heartbeat_disable(engine);
461		GEM_BUG_ON(test_and_set_bit(I915_RESET_ENGINE + id,
462					    &gt->reset.flags));
463		do {
464			int i;
465
466			if (!wait_for_idle(engine)) {
467				pr_err("%s failed to idle before reset\n",
468				       engine->name);
469				err = -EIO;
470				break;
471			}
472
473			for (i = 0; i < 16; i++) {
474				struct i915_request *rq;
475
476				rq = intel_context_create_request(ce);
477				if (IS_ERR(rq)) {
478					struct drm_printer p =
479						drm_info_printer(gt->i915->drm.dev);
480					intel_engine_dump(engine, &p,
481							  "%s(%s): failed to submit request\n",
482							  __func__,
483							  engine->name);
484
485					GEM_TRACE("%s(%s): failed to submit request\n",
486						  __func__,
487						  engine->name);
488					GEM_TRACE_DUMP();
489
490					intel_gt_set_wedged(gt);
491
492					err = PTR_ERR(rq);
493					break;
494				}
495
496				i915_request_add(rq);
497			}
498			err = intel_engine_reset(engine, NULL);
499			if (err) {
500				pr_err("intel_engine_reset(%s) failed, err:%d\n",
501				       engine->name, err);
502				break;
503			}
504
505			if (i915_reset_count(global) != reset_count) {
506				pr_err("Full GPU reset recorded! (engine reset expected)\n");
507				err = -EINVAL;
508				break;
509			}
510
511			if (i915_reset_engine_count(global, engine) !=
512			    reset_engine_count + ++count) {
513				pr_err("%s engine reset not recorded!\n",
514				       engine->name);
515				err = -EINVAL;
516				break;
517			}
518		} while (time_before(jiffies, end_time));
519		clear_and_wake_up_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
520		st_engine_heartbeat_enable(engine);
521
522		pr_info("%s(%s): %d resets\n", __func__, engine->name, count);
523
524		intel_context_put(ce);
525		if (igt_flush_test(gt->i915))
526			err = -EIO;
527		if (err)
528			return err;
529	}
530
531	return 0;
532}
533
534static void force_reset_timeout(struct intel_engine_cs *engine)
535{
536	engine->reset_timeout.probability = 999;
537	atomic_set(&engine->reset_timeout.times, -1);
538}
539
540static void cancel_reset_timeout(struct intel_engine_cs *engine)
541{
542	memset(&engine->reset_timeout, 0, sizeof(engine->reset_timeout));
543}
544
545static int igt_reset_fail_engine(void *arg)
546{
547	struct intel_gt *gt = arg;
548	struct intel_engine_cs *engine;
549	enum intel_engine_id id;
550
551	/* Check that we can recover from engine-reset failues */
552
553	if (!intel_has_reset_engine(gt))
554		return 0;
555
556	for_each_engine(engine, gt, id) {
557		unsigned int count;
558		struct intel_context *ce;
559		IGT_TIMEOUT(end_time);
560		int err;
561
562		/* Can't manually break the reset if i915 doesn't perform it */
563		if (intel_engine_uses_guc(engine))
564			continue;
565
566		ce = intel_context_create(engine);
567		if (IS_ERR(ce)) {
568			pr_err("[%s] Create context failed: %pe!\n", engine->name, ce);
569			return PTR_ERR(ce);
570		}
571
572		st_engine_heartbeat_disable(engine);
573		GEM_BUG_ON(test_and_set_bit(I915_RESET_ENGINE + id,
574					    &gt->reset.flags));
575
576		force_reset_timeout(engine);
577		err = intel_engine_reset(engine, NULL);
578		cancel_reset_timeout(engine);
579		if (err == 0) /* timeouts only generated on gen8+ */
580			goto skip;
581
582		count = 0;
583		do {
584			struct i915_request *last = NULL;
585			int i;
586
587			if (!wait_for_idle(engine)) {
588				pr_err("%s failed to idle before reset\n",
589				       engine->name);
590				err = -EIO;
591				break;
592			}
593
594			for (i = 0; i < count % 15; i++) {
595				struct i915_request *rq;
596
597				rq = intel_context_create_request(ce);
598				if (IS_ERR(rq)) {
599					struct drm_printer p =
600						drm_info_printer(gt->i915->drm.dev);
601					intel_engine_dump(engine, &p,
602							  "%s(%s): failed to submit request\n",
603							  __func__,
604							  engine->name);
605
606					GEM_TRACE("%s(%s): failed to submit request\n",
607						  __func__,
608						  engine->name);
609					GEM_TRACE_DUMP();
610
611					intel_gt_set_wedged(gt);
612					if (last)
613						i915_request_put(last);
614
615					err = PTR_ERR(rq);
616					goto out;
617				}
618
619				if (last)
620					i915_request_put(last);
621				last = i915_request_get(rq);
622				i915_request_add(rq);
623			}
624
625			if (count & 1) {
626				err = intel_engine_reset(engine, NULL);
627				if (err) {
628					GEM_TRACE_ERR("intel_engine_reset(%s) failed, err:%d\n",
629						      engine->name, err);
630					GEM_TRACE_DUMP();
631					i915_request_put(last);
632					break;
633				}
634			} else {
635				force_reset_timeout(engine);
636				err = intel_engine_reset(engine, NULL);
637				cancel_reset_timeout(engine);
638				if (err != -ETIMEDOUT) {
639					pr_err("intel_engine_reset(%s) did not fail, err:%d\n",
640					       engine->name, err);
641					i915_request_put(last);
642					break;
643				}
644			}
645
646			err = 0;
647			if (last) {
648				if (i915_request_wait(last, 0, HZ / 2) < 0) {
649					struct drm_printer p =
650						drm_info_printer(gt->i915->drm.dev);
651
652					intel_engine_dump(engine, &p,
653							  "%s(%s): failed to complete request\n",
654							  __func__,
655							  engine->name);
656
657					GEM_TRACE("%s(%s): failed to complete request\n",
658						  __func__,
659						  engine->name);
660					GEM_TRACE_DUMP();
661
662					err = -EIO;
663				}
664				i915_request_put(last);
665			}
666			count++;
667		} while (err == 0 && time_before(jiffies, end_time));
668out:
669		pr_info("%s(%s): %d resets\n", __func__, engine->name, count);
670skip:
671		clear_and_wake_up_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
672		st_engine_heartbeat_enable(engine);
673		intel_context_put(ce);
674
675		if (igt_flush_test(gt->i915))
676			err = -EIO;
677		if (err)
678			return err;
679	}
680
681	return 0;
682}
683
684static int __igt_reset_engine(struct intel_gt *gt, bool active)
685{
686	struct i915_gpu_error *global = &gt->i915->gpu_error;
687	struct intel_engine_cs *engine;
688	enum intel_engine_id id;
689	struct hang h;
690	int err = 0;
691
692	/* Check that we can issue an engine reset on an idle engine (no-op) */
693
694	if (!intel_has_reset_engine(gt))
695		return 0;
696
697	if (active) {
698		err = hang_init(&h, gt);
699		if (err)
700			return err;
701	}
702
703	for_each_engine(engine, gt, id) {
704		unsigned int reset_count, reset_engine_count;
705		unsigned long count;
706		bool using_guc = intel_engine_uses_guc(engine);
707		IGT_TIMEOUT(end_time);
708
709		if (using_guc && !active)
710			continue;
711
712		if (active && !intel_engine_can_store_dword(engine))
713			continue;
714
715		if (!wait_for_idle(engine)) {
716			pr_err("%s failed to idle before reset\n",
717			       engine->name);
718			err = -EIO;
719			break;
720		}
721
722		reset_count = i915_reset_count(global);
723		reset_engine_count = i915_reset_engine_count(global, engine);
724
725		st_engine_heartbeat_disable(engine);
726		GEM_BUG_ON(test_and_set_bit(I915_RESET_ENGINE + id,
727					    &gt->reset.flags));
728		count = 0;
729		do {
730			struct i915_request *rq = NULL;
731			struct intel_selftest_saved_policy saved;
732			int err2;
733
734			err = intel_selftest_modify_policy(engine, &saved,
735							   SELFTEST_SCHEDULER_MODIFY_FAST_RESET);
736			if (err) {
737				pr_err("[%s] Modify policy failed: %d!\n", engine->name, err);
738				break;
739			}
740
741			if (active) {
742				rq = hang_create_request(&h, engine);
743				if (IS_ERR(rq)) {
744					err = PTR_ERR(rq);
745					pr_err("[%s] Create hang request failed: %d!\n",
746					       engine->name, err);
747					goto restore;
748				}
749
750				i915_request_get(rq);
751				i915_request_add(rq);
752
753				if (!wait_until_running(&h, rq)) {
754					struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
755
756					pr_err("%s: Failed to start request %llx, at %x\n",
757					       __func__, rq->fence.seqno, hws_seqno(&h, rq));
758					intel_engine_dump(engine, &p,
759							  "%s\n", engine->name);
760
761					i915_request_put(rq);
762					err = -EIO;
763					goto restore;
764				}
765			}
766
767			if (!using_guc) {
768				err = intel_engine_reset(engine, NULL);
769				if (err) {
770					pr_err("intel_engine_reset(%s) failed, err:%d\n",
771					       engine->name, err);
772					goto skip;
773				}
774			}
775
776			if (rq) {
777				/* Ensure the reset happens and kills the engine */
778				err = intel_selftest_wait_for_rq(rq);
779				if (err)
780					pr_err("[%s] Wait for request %lld:%lld [0x%04X] failed: %d!\n",
781					       engine->name, rq->fence.context,
782					       rq->fence.seqno, rq->context->guc_id.id, err);
783			}
784
785skip:
786			if (rq)
787				i915_request_put(rq);
788
789			if (i915_reset_count(global) != reset_count) {
790				pr_err("Full GPU reset recorded! (engine reset expected)\n");
791				err = -EINVAL;
792				goto restore;
793			}
794
795			/* GuC based resets are not logged per engine */
796			if (!using_guc) {
797				if (i915_reset_engine_count(global, engine) !=
798				    ++reset_engine_count) {
799					pr_err("%s engine reset not recorded!\n",
800					       engine->name);
801					err = -EINVAL;
802					goto restore;
803				}
804			}
805
806			count++;
807
808restore:
809			err2 = intel_selftest_restore_policy(engine, &saved);
810			if (err2)
811				pr_err("[%s] Restore policy failed: %d!\n", engine->name, err);
812			if (err == 0)
813				err = err2;
814			if (err)
815				break;
816		} while (time_before(jiffies, end_time));
817		clear_and_wake_up_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
818		st_engine_heartbeat_enable(engine);
819		pr_info("%s: Completed %lu %s resets\n",
820			engine->name, count, active ? "active" : "idle");
821
822		if (err)
823			break;
824
825		err = igt_flush_test(gt->i915);
826		if (err) {
827			pr_err("[%s] Flush failed: %d!\n", engine->name, err);
828			break;
829		}
830	}
831
832	if (intel_gt_is_wedged(gt)) {
833		pr_err("GT is wedged!\n");
834		err = -EIO;
835	}
836
837	if (active)
838		hang_fini(&h);
839
840	return err;
841}
842
843static int igt_reset_idle_engine(void *arg)
844{
845	return __igt_reset_engine(arg, false);
846}
847
848static int igt_reset_active_engine(void *arg)
849{
850	return __igt_reset_engine(arg, true);
851}
852
853struct active_engine {
854	struct kthread_worker *worker;
855	struct kthread_work work;
856	struct intel_engine_cs *engine;
857	unsigned long resets;
858	unsigned int flags;
859	bool stop;
860	int result;
861};
862
863#define TEST_ACTIVE	BIT(0)
864#define TEST_OTHERS	BIT(1)
865#define TEST_SELF	BIT(2)
866#define TEST_PRIORITY	BIT(3)
867
868static int active_request_put(struct i915_request *rq)
869{
870	int err = 0;
871
872	if (!rq)
873		return 0;
874
875	if (i915_request_wait(rq, 0, 10 * HZ) < 0) {
876		GEM_TRACE("%s timed out waiting for completion of fence %llx:%lld\n",
877			  rq->engine->name,
878			  rq->fence.context,
879			  rq->fence.seqno);
880		GEM_TRACE_DUMP();
881
882		intel_gt_set_wedged(rq->engine->gt);
883		err = -EIO;
884	}
885
886	i915_request_put(rq);
887
888	return err;
889}
890
891static void active_engine(struct kthread_work *work)
892{
893	I915_RND_STATE(prng);
894	struct active_engine *arg = container_of(work, typeof(*arg), work);
895	struct intel_engine_cs *engine = arg->engine;
896	struct i915_request *rq[8] = {};
897	struct intel_context *ce[ARRAY_SIZE(rq)];
898	unsigned long count;
899	int err = 0;
900
901	for (count = 0; count < ARRAY_SIZE(ce); count++) {
902		ce[count] = intel_context_create(engine);
903		if (IS_ERR(ce[count])) {
904			arg->result = PTR_ERR(ce[count]);
905			pr_err("[%s] Create context #%ld failed: %d!\n",
906			       engine->name, count, arg->result);
907			while (--count)
908				intel_context_put(ce[count]);
909			return;
910		}
911	}
912
913	count = 0;
914	while (!READ_ONCE(arg->stop)) {
915		unsigned int idx = count++ & (ARRAY_SIZE(rq) - 1);
916		struct i915_request *old = rq[idx];
917		struct i915_request *new;
918
919		new = intel_context_create_request(ce[idx]);
920		if (IS_ERR(new)) {
921			err = PTR_ERR(new);
922			pr_err("[%s] Create request #%d failed: %d!\n", engine->name, idx, err);
923			break;
924		}
925
926		rq[idx] = i915_request_get(new);
927		i915_request_add(new);
928
929		if (engine->sched_engine->schedule && arg->flags & TEST_PRIORITY) {
930			struct i915_sched_attr attr = {
931				.priority =
932					i915_prandom_u32_max_state(512, &prng),
933			};
934			engine->sched_engine->schedule(rq[idx], &attr);
935		}
936
937		err = active_request_put(old);
938		if (err) {
939			pr_err("[%s] Request put failed: %d!\n", engine->name, err);
940			break;
941		}
942
943		cond_resched();
944	}
945
946	for (count = 0; count < ARRAY_SIZE(rq); count++) {
947		int err__ = active_request_put(rq[count]);
948
949		if (err)
950			pr_err("[%s] Request put #%ld failed: %d!\n", engine->name, count, err);
951
952		/* Keep the first error */
953		if (!err)
954			err = err__;
955
956		intel_context_put(ce[count]);
957	}
958
959	arg->result = err;
960}
961
962static int __igt_reset_engines(struct intel_gt *gt,
963			       const char *test_name,
964			       unsigned int flags)
965{
966	struct i915_gpu_error *global = &gt->i915->gpu_error;
967	struct intel_engine_cs *engine, *other;
968	struct active_engine *threads;
969	enum intel_engine_id id, tmp;
970	struct hang h;
971	int err = 0;
972
973	/* Check that issuing a reset on one engine does not interfere
974	 * with any other engine.
975	 */
976
977	if (!intel_has_reset_engine(gt))
978		return 0;
979
980	if (flags & TEST_ACTIVE) {
981		err = hang_init(&h, gt);
982		if (err)
983			return err;
984
985		if (flags & TEST_PRIORITY)
986			h.ctx->sched.priority = 1024;
987	}
988
989	threads = kmalloc_array(I915_NUM_ENGINES, sizeof(*threads), GFP_KERNEL);
990	if (!threads)
991		return -ENOMEM;
992
993	for_each_engine(engine, gt, id) {
994		unsigned long device = i915_reset_count(global);
995		unsigned long count = 0, reported;
996		bool using_guc = intel_engine_uses_guc(engine);
997		IGT_TIMEOUT(end_time);
998
999		if (flags & TEST_ACTIVE) {
1000			if (!intel_engine_can_store_dword(engine))
1001				continue;
1002		} else if (using_guc)
1003			continue;
1004
1005		if (!wait_for_idle(engine)) {
1006			pr_err("i915_reset_engine(%s:%s): failed to idle before reset\n",
1007			       engine->name, test_name);
1008			err = -EIO;
1009			break;
1010		}
1011
1012		memset(threads, 0, sizeof(*threads) * I915_NUM_ENGINES);
1013		for_each_engine(other, gt, tmp) {
1014			struct kthread_worker *worker;
1015
1016			threads[tmp].resets =
1017				i915_reset_engine_count(global, other);
1018
1019			if (other == engine && !(flags & TEST_SELF))
1020				continue;
1021
1022			if (other != engine && !(flags & TEST_OTHERS))
1023				continue;
1024
1025			threads[tmp].engine = other;
1026			threads[tmp].flags = flags;
1027
1028			worker = kthread_create_worker(0, "igt/%s",
1029						       other->name);
1030			if (IS_ERR(worker)) {
1031				err = PTR_ERR(worker);
1032				pr_err("[%s] Worker create failed: %d!\n",
1033				       engine->name, err);
1034				goto unwind;
1035			}
1036
1037			threads[tmp].worker = worker;
1038
1039			kthread_init_work(&threads[tmp].work, active_engine);
1040			kthread_queue_work(threads[tmp].worker,
1041					   &threads[tmp].work);
1042		}
1043
1044		st_engine_heartbeat_disable_no_pm(engine);
1045		GEM_BUG_ON(test_and_set_bit(I915_RESET_ENGINE + id,
1046					    &gt->reset.flags));
1047		do {
1048			struct i915_request *rq = NULL;
1049			struct intel_selftest_saved_policy saved;
1050			int err2;
1051
1052			err = intel_selftest_modify_policy(engine, &saved,
1053							   SELFTEST_SCHEDULER_MODIFY_FAST_RESET);
1054			if (err) {
1055				pr_err("[%s] Modify policy failed: %d!\n", engine->name, err);
1056				break;
1057			}
1058
1059			if (flags & TEST_ACTIVE) {
1060				rq = hang_create_request(&h, engine);
1061				if (IS_ERR(rq)) {
1062					err = PTR_ERR(rq);
1063					pr_err("[%s] Create hang request failed: %d!\n",
1064					       engine->name, err);
1065					goto restore;
1066				}
1067
1068				i915_request_get(rq);
1069				i915_request_add(rq);
1070
1071				if (!wait_until_running(&h, rq)) {
1072					struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1073
1074					pr_err("%s: Failed to start request %llx, at %x\n",
1075					       __func__, rq->fence.seqno, hws_seqno(&h, rq));
1076					intel_engine_dump(engine, &p,
1077							  "%s\n", engine->name);
1078
1079					i915_request_put(rq);
1080					err = -EIO;
1081					goto restore;
1082				}
1083			} else {
1084				intel_engine_pm_get(engine);
1085			}
1086
1087			if (!using_guc) {
1088				err = intel_engine_reset(engine, NULL);
1089				if (err) {
1090					pr_err("i915_reset_engine(%s:%s): failed, err=%d\n",
1091					       engine->name, test_name, err);
1092					goto restore;
1093				}
1094			}
1095
1096			if (rq) {
1097				/* Ensure the reset happens and kills the engine */
1098				err = intel_selftest_wait_for_rq(rq);
1099				if (err)
1100					pr_err("[%s] Wait for request %lld:%lld [0x%04X] failed: %d!\n",
1101					       engine->name, rq->fence.context,
1102					       rq->fence.seqno, rq->context->guc_id.id, err);
1103			}
1104
1105			count++;
1106
1107			if (rq) {
1108				if (rq->fence.error != -EIO) {
1109					pr_err("i915_reset_engine(%s:%s): failed to reset request %lld:%lld [0x%04X]\n",
1110					       engine->name, test_name,
1111					       rq->fence.context,
1112					       rq->fence.seqno, rq->context->guc_id.id);
1113					i915_request_put(rq);
1114
1115					GEM_TRACE_DUMP();
1116					intel_gt_set_wedged(gt);
1117					err = -EIO;
1118					goto restore;
1119				}
1120
1121				if (i915_request_wait(rq, 0, HZ / 5) < 0) {
1122					struct drm_printer p =
1123						drm_info_printer(gt->i915->drm.dev);
1124
1125					pr_err("i915_reset_engine(%s:%s):"
1126					       " failed to complete request %llx:%lld after reset\n",
1127					       engine->name, test_name,
1128					       rq->fence.context,
1129					       rq->fence.seqno);
1130					intel_engine_dump(engine, &p,
1131							  "%s\n", engine->name);
1132					i915_request_put(rq);
1133
1134					GEM_TRACE_DUMP();
1135					intel_gt_set_wedged(gt);
1136					err = -EIO;
1137					goto restore;
1138				}
1139
1140				i915_request_put(rq);
1141			}
1142
1143			if (!(flags & TEST_ACTIVE))
1144				intel_engine_pm_put(engine);
1145
1146			if (!(flags & TEST_SELF) && !wait_for_idle(engine)) {
1147				struct drm_printer p =
1148					drm_info_printer(gt->i915->drm.dev);
1149
1150				pr_err("i915_reset_engine(%s:%s):"
1151				       " failed to idle after reset\n",
1152				       engine->name, test_name);
1153				intel_engine_dump(engine, &p,
1154						  "%s\n", engine->name);
1155
1156				err = -EIO;
1157				goto restore;
1158			}
1159
1160restore:
1161			err2 = intel_selftest_restore_policy(engine, &saved);
1162			if (err2)
1163				pr_err("[%s] Restore policy failed: %d!\n", engine->name, err2);
1164			if (err == 0)
1165				err = err2;
1166			if (err)
1167				break;
1168		} while (time_before(jiffies, end_time));
1169		clear_and_wake_up_bit(I915_RESET_ENGINE + id, &gt->reset.flags);
1170		st_engine_heartbeat_enable_no_pm(engine);
1171
1172		pr_info("i915_reset_engine(%s:%s): %lu resets\n",
1173			engine->name, test_name, count);
1174
1175		/* GuC based resets are not logged per engine */
1176		if (!using_guc) {
1177			reported = i915_reset_engine_count(global, engine);
1178			reported -= threads[engine->id].resets;
1179			if (reported != count) {
1180				pr_err("i915_reset_engine(%s:%s): reset %lu times, but reported %lu\n",
1181				       engine->name, test_name, count, reported);
1182				if (!err)
1183					err = -EINVAL;
1184			}
1185		}
1186
1187unwind:
1188		for_each_engine(other, gt, tmp) {
1189			int ret;
1190
1191			if (!threads[tmp].worker)
1192				continue;
1193
1194			WRITE_ONCE(threads[tmp].stop, true);
1195			kthread_flush_work(&threads[tmp].work);
1196			ret = READ_ONCE(threads[tmp].result);
1197			if (ret) {
1198				pr_err("kthread for other engine %s failed, err=%d\n",
1199				       other->name, ret);
1200				if (!err)
1201					err = ret;
1202			}
1203
1204			kthread_destroy_worker(threads[tmp].worker);
1205
1206			/* GuC based resets are not logged per engine */
1207			if (!using_guc) {
1208				if (other->uabi_class != engine->uabi_class &&
1209				    threads[tmp].resets !=
1210				    i915_reset_engine_count(global, other)) {
1211					pr_err("Innocent engine %s was reset (count=%ld)\n",
1212					       other->name,
1213					       i915_reset_engine_count(global, other) -
1214					       threads[tmp].resets);
1215					if (!err)
1216						err = -EINVAL;
1217				}
1218			}
1219		}
1220
1221		if (device != i915_reset_count(global)) {
1222			pr_err("Global reset (count=%ld)!\n",
1223			       i915_reset_count(global) - device);
1224			if (!err)
1225				err = -EINVAL;
1226		}
1227
1228		if (err)
1229			break;
1230
1231		err = igt_flush_test(gt->i915);
1232		if (err) {
1233			pr_err("[%s] Flush failed: %d!\n", engine->name, err);
1234			break;
1235		}
1236	}
1237	kfree(threads);
1238
1239	if (intel_gt_is_wedged(gt))
1240		err = -EIO;
1241
1242	if (flags & TEST_ACTIVE)
1243		hang_fini(&h);
1244
1245	return err;
1246}
1247
1248static int igt_reset_engines(void *arg)
1249{
1250	static const struct {
1251		const char *name;
1252		unsigned int flags;
1253	} phases[] = {
1254		{ "idle", 0 },
1255		{ "active", TEST_ACTIVE },
1256		{ "others-idle", TEST_OTHERS },
1257		{ "others-active", TEST_OTHERS | TEST_ACTIVE },
1258		{
1259			"others-priority",
1260			TEST_OTHERS | TEST_ACTIVE | TEST_PRIORITY
1261		},
1262		{
1263			"self-priority",
1264			TEST_ACTIVE | TEST_PRIORITY | TEST_SELF,
1265		},
1266		{ }
1267	};
1268	struct intel_gt *gt = arg;
1269	typeof(*phases) *p;
1270	int err;
1271
1272	for (p = phases; p->name; p++) {
1273		if (p->flags & TEST_PRIORITY) {
1274			if (!(gt->i915->caps.scheduler & I915_SCHEDULER_CAP_PRIORITY))
1275				continue;
1276		}
1277
1278		err = __igt_reset_engines(arg, p->name, p->flags);
1279		if (err)
1280			return err;
1281	}
1282
1283	return 0;
1284}
1285
1286static u32 fake_hangcheck(struct intel_gt *gt, intel_engine_mask_t mask)
1287{
1288	u32 count = i915_reset_count(&gt->i915->gpu_error);
1289
1290	intel_gt_reset(gt, mask, NULL);
1291
1292	return count;
1293}
1294
1295static int igt_reset_wait(void *arg)
1296{
1297	struct intel_gt *gt = arg;
1298	struct i915_gpu_error *global = &gt->i915->gpu_error;
1299	struct intel_engine_cs *engine;
1300	struct i915_request *rq;
1301	unsigned int reset_count;
1302	struct hang h;
1303	long timeout;
1304	int err;
1305
1306	engine = intel_selftest_find_any_engine(gt);
1307
1308	if (!engine || !intel_engine_can_store_dword(engine))
1309		return 0;
1310
1311	/* Check that we detect a stuck waiter and issue a reset */
1312
1313	igt_global_reset_lock(gt);
1314
1315	err = hang_init(&h, gt);
1316	if (err) {
1317		pr_err("[%s] Hang init failed: %d!\n", engine->name, err);
1318		goto unlock;
1319	}
1320
1321	rq = hang_create_request(&h, engine);
1322	if (IS_ERR(rq)) {
1323		err = PTR_ERR(rq);
1324		pr_err("[%s] Create hang request failed: %d!\n", engine->name, err);
1325		goto fini;
1326	}
1327
1328	i915_request_get(rq);
1329	i915_request_add(rq);
1330
1331	if (!wait_until_running(&h, rq)) {
1332		struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1333
1334		pr_err("%s: Failed to start request %llx, at %x\n",
1335		       __func__, rq->fence.seqno, hws_seqno(&h, rq));
1336		intel_engine_dump(rq->engine, &p, "%s\n", rq->engine->name);
1337
1338		intel_gt_set_wedged(gt);
1339
1340		err = -EIO;
1341		goto out_rq;
1342	}
1343
1344	reset_count = fake_hangcheck(gt, ALL_ENGINES);
1345
1346	timeout = i915_request_wait(rq, 0, 10);
1347	if (timeout < 0) {
1348		pr_err("i915_request_wait failed on a stuck request: err=%ld\n",
1349		       timeout);
1350		err = timeout;
1351		goto out_rq;
1352	}
1353
1354	if (i915_reset_count(global) == reset_count) {
1355		pr_err("No GPU reset recorded!\n");
1356		err = -EINVAL;
1357		goto out_rq;
1358	}
1359
1360out_rq:
1361	i915_request_put(rq);
1362fini:
1363	hang_fini(&h);
1364unlock:
1365	igt_global_reset_unlock(gt);
1366
1367	if (intel_gt_is_wedged(gt))
1368		return -EIO;
1369
1370	return err;
1371}
1372
1373struct evict_vma {
1374	struct completion completion;
1375	struct i915_vma *vma;
1376};
1377
1378static int evict_vma(void *data)
1379{
1380	struct evict_vma *arg = data;
1381	struct i915_address_space *vm = arg->vma->vm;
1382	struct drm_mm_node evict = arg->vma->node;
1383	int err;
1384
1385	complete(&arg->completion);
1386
1387	mutex_lock(&vm->mutex);
1388	err = i915_gem_evict_for_node(vm, NULL, &evict, 0);
1389	mutex_unlock(&vm->mutex);
1390
1391	return err;
1392}
1393
1394static int evict_fence(void *data)
1395{
1396	struct evict_vma *arg = data;
1397	int err;
1398
1399	complete(&arg->completion);
1400
1401	/* Mark the fence register as dirty to force the mmio update. */
1402	err = i915_gem_object_set_tiling(arg->vma->obj, I915_TILING_Y, 512);
1403	if (err) {
1404		pr_err("Invalid Y-tiling settings; err:%d\n", err);
1405		return err;
1406	}
1407
1408	err = i915_vma_pin(arg->vma, 0, 0, PIN_GLOBAL | PIN_MAPPABLE);
1409	if (err) {
1410		pr_err("Unable to pin vma for Y-tiled fence; err:%d\n", err);
1411		return err;
1412	}
1413
1414	err = i915_vma_pin_fence(arg->vma);
1415	i915_vma_unpin(arg->vma);
1416	if (err) {
1417		pr_err("Unable to pin Y-tiled fence; err:%d\n", err);
1418		return err;
1419	}
1420
1421	i915_vma_unpin_fence(arg->vma);
1422
1423	return 0;
1424}
1425
1426static int __igt_reset_evict_vma(struct intel_gt *gt,
1427				 struct i915_address_space *vm,
1428				 int (*fn)(void *),
1429				 unsigned int flags)
1430{
1431	struct intel_engine_cs *engine;
1432	struct drm_i915_gem_object *obj;
1433	struct task_struct *tsk = NULL;
1434	struct i915_request *rq;
1435	struct evict_vma arg;
1436	struct hang h;
1437	unsigned int pin_flags;
1438	int err;
1439
1440	if (!gt->ggtt->num_fences && flags & EXEC_OBJECT_NEEDS_FENCE)
1441		return 0;
1442
1443	engine = intel_selftest_find_any_engine(gt);
1444
1445	if (!engine || !intel_engine_can_store_dword(engine))
1446		return 0;
1447
1448	/* Check that we can recover an unbind stuck on a hanging request */
1449
1450	err = hang_init(&h, gt);
1451	if (err) {
1452		pr_err("[%s] Hang init failed: %d!\n", engine->name, err);
1453		return err;
1454	}
1455
1456	obj = i915_gem_object_create_internal(gt->i915, SZ_1M);
1457	if (IS_ERR(obj)) {
1458		err = PTR_ERR(obj);
1459		pr_err("[%s] Create object failed: %d!\n", engine->name, err);
1460		goto fini;
1461	}
1462
1463	if (flags & EXEC_OBJECT_NEEDS_FENCE) {
1464		err = i915_gem_object_set_tiling(obj, I915_TILING_X, 512);
1465		if (err) {
1466			pr_err("Invalid X-tiling settings; err:%d\n", err);
1467			goto out_obj;
1468		}
1469	}
1470
1471	arg.vma = i915_vma_instance(obj, vm, NULL);
1472	if (IS_ERR(arg.vma)) {
1473		err = PTR_ERR(arg.vma);
1474		pr_err("[%s] VMA instance failed: %d!\n", engine->name, err);
1475		goto out_obj;
1476	}
1477
1478	rq = hang_create_request(&h, engine);
1479	if (IS_ERR(rq)) {
1480		err = PTR_ERR(rq);
1481		pr_err("[%s] Create hang request failed: %d!\n", engine->name, err);
1482		goto out_obj;
1483	}
1484
1485	pin_flags = i915_vma_is_ggtt(arg.vma) ? PIN_GLOBAL : PIN_USER;
1486
1487	if (flags & EXEC_OBJECT_NEEDS_FENCE)
1488		pin_flags |= PIN_MAPPABLE;
1489
1490	err = i915_vma_pin(arg.vma, 0, 0, pin_flags);
1491	if (err) {
1492		i915_request_add(rq);
1493		pr_err("[%s] VMA pin failed: %d!\n", engine->name, err);
1494		goto out_obj;
1495	}
1496
1497	if (flags & EXEC_OBJECT_NEEDS_FENCE) {
1498		err = i915_vma_pin_fence(arg.vma);
1499		if (err) {
1500			pr_err("Unable to pin X-tiled fence; err:%d\n", err);
1501			i915_vma_unpin(arg.vma);
1502			i915_request_add(rq);
1503			goto out_obj;
1504		}
1505	}
1506
1507	err = igt_vma_move_to_active_unlocked(arg.vma, rq, flags);
1508	if (err)
1509		pr_err("[%s] Move to active failed: %d!\n", engine->name, err);
1510
1511	if (flags & EXEC_OBJECT_NEEDS_FENCE)
1512		i915_vma_unpin_fence(arg.vma);
1513	i915_vma_unpin(arg.vma);
1514
1515	i915_request_get(rq);
1516	i915_request_add(rq);
1517	if (err)
1518		goto out_rq;
1519
1520	if (!wait_until_running(&h, rq)) {
1521		struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1522
1523		pr_err("%s: Failed to start request %llx, at %x\n",
1524		       __func__, rq->fence.seqno, hws_seqno(&h, rq));
1525		intel_engine_dump(rq->engine, &p, "%s\n", rq->engine->name);
1526
1527		intel_gt_set_wedged(gt);
1528		goto out_reset;
1529	}
1530
1531	init_completion(&arg.completion);
1532
1533	tsk = kthread_run(fn, &arg, "igt/evict_vma");
1534	if (IS_ERR(tsk)) {
1535		err = PTR_ERR(tsk);
1536		pr_err("[%s] Thread spawn failed: %d!\n", engine->name, err);
1537		tsk = NULL;
1538		goto out_reset;
1539	}
1540	get_task_struct(tsk);
1541
1542	wait_for_completion(&arg.completion);
1543
1544	if (wait_for(!list_empty(&rq->fence.cb_list), 10)) {
1545		struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1546
1547		pr_err("igt/evict_vma kthread did not wait\n");
1548		intel_engine_dump(rq->engine, &p, "%s\n", rq->engine->name);
1549
1550		intel_gt_set_wedged(gt);
1551		goto out_reset;
1552	}
1553
1554out_reset:
1555	igt_global_reset_lock(gt);
1556	fake_hangcheck(gt, rq->engine->mask);
1557	igt_global_reset_unlock(gt);
1558
1559	if (tsk) {
1560		struct intel_wedge_me w;
1561
1562		/* The reset, even indirectly, should take less than 10ms. */
1563		intel_wedge_on_timeout(&w, gt, HZ / 10 /* 100ms */)
1564			err = kthread_stop(tsk);
1565
1566		put_task_struct(tsk);
1567	}
1568
1569out_rq:
1570	i915_request_put(rq);
1571out_obj:
1572	i915_gem_object_put(obj);
1573fini:
1574	hang_fini(&h);
1575	if (intel_gt_is_wedged(gt))
1576		return -EIO;
1577
1578	return err;
1579}
1580
1581static int igt_reset_evict_ggtt(void *arg)
1582{
1583	struct intel_gt *gt = arg;
1584
1585	return __igt_reset_evict_vma(gt, &gt->ggtt->vm,
1586				     evict_vma, EXEC_OBJECT_WRITE);
1587}
1588
1589static int igt_reset_evict_ppgtt(void *arg)
1590{
1591	struct intel_gt *gt = arg;
1592	struct i915_ppgtt *ppgtt;
1593	int err;
1594
1595	/* aliasing == global gtt locking, covered above */
1596	if (INTEL_PPGTT(gt->i915) < INTEL_PPGTT_FULL)
1597		return 0;
1598
1599	ppgtt = i915_ppgtt_create(gt, 0);
1600	if (IS_ERR(ppgtt))
1601		return PTR_ERR(ppgtt);
1602
1603	err = __igt_reset_evict_vma(gt, &ppgtt->vm,
1604				    evict_vma, EXEC_OBJECT_WRITE);
1605	i915_vm_put(&ppgtt->vm);
1606
1607	return err;
1608}
1609
1610static int igt_reset_evict_fence(void *arg)
1611{
1612	struct intel_gt *gt = arg;
1613
1614	return __igt_reset_evict_vma(gt, &gt->ggtt->vm,
1615				     evict_fence, EXEC_OBJECT_NEEDS_FENCE);
1616}
1617
1618static int wait_for_others(struct intel_gt *gt,
1619			   struct intel_engine_cs *exclude)
1620{
1621	struct intel_engine_cs *engine;
1622	enum intel_engine_id id;
1623
1624	for_each_engine(engine, gt, id) {
1625		if (engine == exclude)
1626			continue;
1627
1628		if (!wait_for_idle(engine))
1629			return -EIO;
1630	}
1631
1632	return 0;
1633}
1634
1635static int igt_reset_queue(void *arg)
1636{
1637	struct intel_gt *gt = arg;
1638	struct i915_gpu_error *global = &gt->i915->gpu_error;
1639	struct intel_engine_cs *engine;
1640	enum intel_engine_id id;
1641	struct hang h;
1642	int err;
1643
1644	/* Check that we replay pending requests following a hang */
1645
1646	igt_global_reset_lock(gt);
1647
1648	err = hang_init(&h, gt);
1649	if (err)
1650		goto unlock;
1651
1652	for_each_engine(engine, gt, id) {
1653		struct intel_selftest_saved_policy saved;
1654		struct i915_request *prev;
1655		IGT_TIMEOUT(end_time);
1656		unsigned int count;
1657		bool using_guc = intel_engine_uses_guc(engine);
1658
1659		if (!intel_engine_can_store_dword(engine))
1660			continue;
1661
1662		if (using_guc) {
1663			err = intel_selftest_modify_policy(engine, &saved,
1664							   SELFTEST_SCHEDULER_MODIFY_NO_HANGCHECK);
1665			if (err) {
1666				pr_err("[%s] Modify policy failed: %d!\n", engine->name, err);
1667				goto fini;
1668			}
1669		}
1670
1671		prev = hang_create_request(&h, engine);
1672		if (IS_ERR(prev)) {
1673			err = PTR_ERR(prev);
1674			pr_err("[%s] Create 'prev' hang request failed: %d!\n", engine->name, err);
1675			goto restore;
1676		}
1677
1678		i915_request_get(prev);
1679		i915_request_add(prev);
1680
1681		count = 0;
1682		do {
1683			struct i915_request *rq;
1684			unsigned int reset_count;
1685
1686			rq = hang_create_request(&h, engine);
1687			if (IS_ERR(rq)) {
1688				err = PTR_ERR(rq);
1689				pr_err("[%s] Create hang request failed: %d!\n", engine->name, err);
1690				goto restore;
1691			}
1692
1693			i915_request_get(rq);
1694			i915_request_add(rq);
1695
1696			/*
1697			 * XXX We don't handle resetting the kernel context
1698			 * very well. If we trigger a device reset twice in
1699			 * quick succession while the kernel context is
1700			 * executing, we may end up skipping the breadcrumb.
1701			 * This is really only a problem for the selftest as
1702			 * normally there is a large interlude between resets
1703			 * (hangcheck), or we focus on resetting just one
1704			 * engine and so avoid repeatedly resetting innocents.
1705			 */
1706			err = wait_for_others(gt, engine);
1707			if (err) {
1708				pr_err("%s(%s): Failed to idle other inactive engines after device reset\n",
1709				       __func__, engine->name);
1710				i915_request_put(rq);
1711				i915_request_put(prev);
1712
1713				GEM_TRACE_DUMP();
1714				intel_gt_set_wedged(gt);
1715				goto restore;
1716			}
1717
1718			if (!wait_until_running(&h, prev)) {
1719				struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1720
1721				pr_err("%s(%s): Failed to start request %llx, at %x\n",
1722				       __func__, engine->name,
1723				       prev->fence.seqno, hws_seqno(&h, prev));
1724				intel_engine_dump(engine, &p,
1725						  "%s\n", engine->name);
1726
1727				i915_request_put(rq);
1728				i915_request_put(prev);
1729
1730				intel_gt_set_wedged(gt);
1731
1732				err = -EIO;
1733				goto restore;
1734			}
1735
1736			reset_count = fake_hangcheck(gt, BIT(id));
1737
1738			if (prev->fence.error != -EIO) {
1739				pr_err("GPU reset not recorded on hanging request [fence.error=%d]!\n",
1740				       prev->fence.error);
1741				i915_request_put(rq);
1742				i915_request_put(prev);
1743				err = -EINVAL;
1744				goto restore;
1745			}
1746
1747			if (rq->fence.error) {
1748				pr_err("Fence error status not zero [%d] after unrelated reset\n",
1749				       rq->fence.error);
1750				i915_request_put(rq);
1751				i915_request_put(prev);
1752				err = -EINVAL;
1753				goto restore;
1754			}
1755
1756			if (i915_reset_count(global) == reset_count) {
1757				pr_err("No GPU reset recorded!\n");
1758				i915_request_put(rq);
1759				i915_request_put(prev);
1760				err = -EINVAL;
1761				goto restore;
1762			}
1763
1764			i915_request_put(prev);
1765			prev = rq;
1766			count++;
1767		} while (time_before(jiffies, end_time));
1768		pr_info("%s: Completed %d queued resets\n",
1769			engine->name, count);
1770
1771		*h.batch = MI_BATCH_BUFFER_END;
1772		intel_gt_chipset_flush(engine->gt);
1773
1774		i915_request_put(prev);
1775
1776restore:
1777		if (using_guc) {
1778			int err2 = intel_selftest_restore_policy(engine, &saved);
1779
1780			if (err2)
1781				pr_err("%s:%d> [%s] Restore policy failed: %d!\n",
1782				       __func__, __LINE__, engine->name, err2);
1783			if (err == 0)
1784				err = err2;
1785		}
1786		if (err)
1787			goto fini;
1788
1789		err = igt_flush_test(gt->i915);
1790		if (err) {
1791			pr_err("[%s] Flush failed: %d!\n", engine->name, err);
1792			break;
1793		}
1794	}
1795
1796fini:
1797	hang_fini(&h);
1798unlock:
1799	igt_global_reset_unlock(gt);
1800
1801	if (intel_gt_is_wedged(gt))
1802		return -EIO;
1803
1804	return err;
1805}
1806
1807static int igt_handle_error(void *arg)
1808{
1809	struct intel_gt *gt = arg;
1810	struct i915_gpu_error *global = &gt->i915->gpu_error;
1811	struct intel_engine_cs *engine;
1812	struct hang h;
1813	struct i915_request *rq;
1814	struct i915_gpu_coredump *error;
1815	int err;
1816
1817	engine = intel_selftest_find_any_engine(gt);
1818
1819	/* Check that we can issue a global GPU and engine reset */
1820
1821	if (!intel_has_reset_engine(gt))
1822		return 0;
1823
1824	if (!engine || !intel_engine_can_store_dword(engine))
1825		return 0;
1826
1827	err = hang_init(&h, gt);
1828	if (err) {
1829		pr_err("[%s] Hang init failed: %d!\n", engine->name, err);
1830		return err;
1831	}
1832
1833	rq = hang_create_request(&h, engine);
1834	if (IS_ERR(rq)) {
1835		err = PTR_ERR(rq);
1836		pr_err("[%s] Create hang request failed: %d!\n", engine->name, err);
1837		goto err_fini;
1838	}
1839
1840	i915_request_get(rq);
1841	i915_request_add(rq);
1842
1843	if (!wait_until_running(&h, rq)) {
1844		struct drm_printer p = drm_info_printer(gt->i915->drm.dev);
1845
1846		pr_err("%s: Failed to start request %llx, at %x\n",
1847		       __func__, rq->fence.seqno, hws_seqno(&h, rq));
1848		intel_engine_dump(rq->engine, &p, "%s\n", rq->engine->name);
1849
1850		intel_gt_set_wedged(gt);
1851
1852		err = -EIO;
1853		goto err_request;
1854	}
1855
1856	/* Temporarily disable error capture */
1857	error = xchg(&global->first_error, (void *)-1);
1858
1859	intel_gt_handle_error(gt, engine->mask, 0, NULL);
1860
1861	xchg(&global->first_error, error);
1862
1863	if (rq->fence.error != -EIO) {
1864		pr_err("Guilty request not identified!\n");
1865		err = -EINVAL;
1866		goto err_request;
1867	}
1868
1869err_request:
1870	i915_request_put(rq);
1871err_fini:
1872	hang_fini(&h);
1873	return err;
1874}
1875
1876static int __igt_atomic_reset_engine(struct intel_engine_cs *engine,
1877				     const struct igt_atomic_section *p,
1878				     const char *mode)
1879{
1880	struct tasklet_struct * const t = &engine->sched_engine->tasklet;
1881	int err;
1882
1883	GEM_TRACE("i915_reset_engine(%s:%s) under %s\n",
1884		  engine->name, mode, p->name);
1885
1886	if (t->func)
1887		tasklet_disable(t);
1888	if (strcmp(p->name, "softirq"))
1889		local_bh_disable();
1890	p->critical_section_begin();
1891
1892	err = __intel_engine_reset_bh(engine, NULL);
1893
1894	p->critical_section_end();
1895	if (strcmp(p->name, "softirq"))
1896		local_bh_enable();
1897	if (t->func) {
1898		tasklet_enable(t);
1899		tasklet_hi_schedule(t);
1900	}
1901
1902	if (err)
1903		pr_err("i915_reset_engine(%s:%s) failed under %s\n",
1904		       engine->name, mode, p->name);
1905
1906	return err;
1907}
1908
1909static int igt_atomic_reset_engine(struct intel_engine_cs *engine,
1910				   const struct igt_atomic_section *p)
1911{
1912	struct i915_request *rq;
1913	struct hang h;
1914	int err;
1915
1916	err = __igt_atomic_reset_engine(engine, p, "idle");
1917	if (err)
1918		return err;
1919
1920	err = hang_init(&h, engine->gt);
1921	if (err) {
1922		pr_err("[%s] Hang init failed: %d!\n", engine->name, err);
1923		return err;
1924	}
1925
1926	rq = hang_create_request(&h, engine);
1927	if (IS_ERR(rq)) {
1928		err = PTR_ERR(rq);
1929		pr_err("[%s] Create hang request failed: %d!\n", engine->name, err);
1930		goto out;
1931	}
1932
1933	i915_request_get(rq);
1934	i915_request_add(rq);
1935
1936	if (wait_until_running(&h, rq)) {
1937		err = __igt_atomic_reset_engine(engine, p, "active");
1938	} else {
1939		pr_err("%s(%s): Failed to start request %llx, at %x\n",
1940		       __func__, engine->name,
1941		       rq->fence.seqno, hws_seqno(&h, rq));
1942		intel_gt_set_wedged(engine->gt);
1943		err = -EIO;
1944	}
1945
1946	if (err == 0) {
1947		struct intel_wedge_me w;
1948
1949		intel_wedge_on_timeout(&w, engine->gt, HZ / 20 /* 50ms */)
1950			i915_request_wait(rq, 0, MAX_SCHEDULE_TIMEOUT);
1951		if (intel_gt_is_wedged(engine->gt))
1952			err = -EIO;
1953	}
1954
1955	i915_request_put(rq);
1956out:
1957	hang_fini(&h);
1958	return err;
1959}
1960
1961static int igt_reset_engines_atomic(void *arg)
1962{
1963	struct intel_gt *gt = arg;
1964	const typeof(*igt_atomic_phases) *p;
1965	int err = 0;
1966
1967	/* Check that the engines resets are usable from atomic context */
1968
1969	if (!intel_has_reset_engine(gt))
1970		return 0;
1971
1972	if (intel_uc_uses_guc_submission(&gt->uc))
1973		return 0;
1974
1975	igt_global_reset_lock(gt);
1976
1977	/* Flush any requests before we get started and check basics */
1978	if (!igt_force_reset(gt))
1979		goto unlock;
1980
1981	for (p = igt_atomic_phases; p->name; p++) {
1982		struct intel_engine_cs *engine;
1983		enum intel_engine_id id;
1984
1985		for_each_engine(engine, gt, id) {
1986			err = igt_atomic_reset_engine(engine, p);
1987			if (err)
1988				goto out;
1989		}
1990	}
1991
1992out:
1993	/* As we poke around the guts, do a full reset before continuing. */
1994	igt_force_reset(gt);
1995unlock:
1996	igt_global_reset_unlock(gt);
1997
1998	return err;
1999}
2000
2001int intel_hangcheck_live_selftests(struct drm_i915_private *i915)
2002{
2003	static const struct i915_subtest tests[] = {
2004		SUBTEST(igt_hang_sanitycheck),
2005		SUBTEST(igt_reset_nop),
2006		SUBTEST(igt_reset_nop_engine),
2007		SUBTEST(igt_reset_idle_engine),
2008		SUBTEST(igt_reset_active_engine),
2009		SUBTEST(igt_reset_fail_engine),
2010		SUBTEST(igt_reset_engines),
2011		SUBTEST(igt_reset_engines_atomic),
2012		SUBTEST(igt_reset_queue),
2013		SUBTEST(igt_reset_wait),
2014		SUBTEST(igt_reset_evict_ggtt),
2015		SUBTEST(igt_reset_evict_ppgtt),
2016		SUBTEST(igt_reset_evict_fence),
2017		SUBTEST(igt_handle_error),
2018	};
2019	struct intel_gt *gt = to_gt(i915);
2020	intel_wakeref_t wakeref;
2021	int err;
2022
2023	if (!intel_has_gpu_reset(gt))
2024		return 0;
2025
2026	if (intel_gt_is_wedged(gt))
2027		return -EIO; /* we're long past hope of a successful reset */
2028
2029	wakeref = intel_runtime_pm_get(gt->uncore->rpm);
2030
2031	err = intel_gt_live_subtests(tests, gt);
2032
2033	intel_runtime_pm_put(gt->uncore->rpm, wakeref);
2034
2035	return err;
2036}
2037