Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   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}