Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * Copyright © 2016 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21 * IN THE SOFTWARE.
  22 *
  23 */
  24
  25#include <linux/prime_numbers.h>
  26#include <linux/pm_qos.h>
  27#include <linux/sort.h>
  28
  29#include "gem/i915_gem_pm.h"
  30#include "gem/selftests/mock_context.h"
  31
  32#include "gt/intel_engine_heartbeat.h"
  33#include "gt/intel_engine_pm.h"
  34#include "gt/intel_engine_user.h"
  35#include "gt/intel_gt.h"
  36#include "gt/intel_gt_requests.h"
  37#include "gt/selftest_engine_heartbeat.h"
  38
  39#include "i915_random.h"
  40#include "i915_selftest.h"
  41#include "igt_flush_test.h"
  42#include "igt_live_test.h"
  43#include "igt_spinner.h"
  44#include "lib_sw_fence.h"
  45
  46#include "mock_drm.h"
  47#include "mock_gem_device.h"
  48
  49static unsigned int num_uabi_engines(struct drm_i915_private *i915)
  50{
  51	struct intel_engine_cs *engine;
  52	unsigned int count;
  53
  54	count = 0;
  55	for_each_uabi_engine(engine, i915)
  56		count++;
  57
  58	return count;
  59}
  60
  61static struct intel_engine_cs *rcs0(struct drm_i915_private *i915)
  62{
  63	return intel_engine_lookup_user(i915, I915_ENGINE_CLASS_RENDER, 0);
  64}
  65
  66static int igt_add_request(void *arg)
  67{
  68	struct drm_i915_private *i915 = arg;
  69	struct i915_request *request;
  70
  71	/* Basic preliminary test to create a request and let it loose! */
  72
  73	request = mock_request(rcs0(i915)->kernel_context, HZ / 10);
  74	if (!request)
  75		return -ENOMEM;
  76
  77	i915_request_add(request);
  78
  79	return 0;
  80}
  81
  82static int igt_wait_request(void *arg)
  83{
  84	const long T = HZ / 4;
  85	struct drm_i915_private *i915 = arg;
  86	struct i915_request *request;
  87	int err = -EINVAL;
  88
  89	/* Submit a request, then wait upon it */
  90
  91	request = mock_request(rcs0(i915)->kernel_context, T);
  92	if (!request)
  93		return -ENOMEM;
  94
  95	i915_request_get(request);
  96
  97	if (i915_request_wait(request, 0, 0) != -ETIME) {
  98		pr_err("request wait (busy query) succeeded (expected timeout before submit!)\n");
  99		goto out_request;
 100	}
 101
 102	if (i915_request_wait(request, 0, T) != -ETIME) {
 103		pr_err("request wait succeeded (expected timeout before submit!)\n");
 104		goto out_request;
 105	}
 106
 107	if (i915_request_completed(request)) {
 108		pr_err("request completed before submit!!\n");
 109		goto out_request;
 110	}
 111
 112	i915_request_add(request);
 113
 114	if (i915_request_wait(request, 0, 0) != -ETIME) {
 115		pr_err("request wait (busy query) succeeded (expected timeout after submit!)\n");
 116		goto out_request;
 117	}
 118
 119	if (i915_request_completed(request)) {
 120		pr_err("request completed immediately!\n");
 121		goto out_request;
 122	}
 123
 124	if (i915_request_wait(request, 0, T / 2) != -ETIME) {
 125		pr_err("request wait succeeded (expected timeout!)\n");
 126		goto out_request;
 127	}
 128
 129	if (i915_request_wait(request, 0, T) == -ETIME) {
 130		pr_err("request wait timed out!\n");
 131		goto out_request;
 132	}
 133
 134	if (!i915_request_completed(request)) {
 135		pr_err("request not complete after waiting!\n");
 136		goto out_request;
 137	}
 138
 139	if (i915_request_wait(request, 0, T) == -ETIME) {
 140		pr_err("request wait timed out when already complete!\n");
 141		goto out_request;
 142	}
 143
 144	err = 0;
 145out_request:
 146	i915_request_put(request);
 147	mock_device_flush(i915);
 148	return err;
 149}
 150
 151static int igt_fence_wait(void *arg)
 152{
 153	const long T = HZ / 4;
 154	struct drm_i915_private *i915 = arg;
 155	struct i915_request *request;
 156	int err = -EINVAL;
 157
 158	/* Submit a request, treat it as a fence and wait upon it */
 159
 160	request = mock_request(rcs0(i915)->kernel_context, T);
 161	if (!request)
 162		return -ENOMEM;
 163
 164	if (dma_fence_wait_timeout(&request->fence, false, T) != -ETIME) {
 165		pr_err("fence wait success before submit (expected timeout)!\n");
 166		goto out;
 167	}
 168
 169	i915_request_add(request);
 170
 171	if (dma_fence_is_signaled(&request->fence)) {
 172		pr_err("fence signaled immediately!\n");
 173		goto out;
 174	}
 175
 176	if (dma_fence_wait_timeout(&request->fence, false, T / 2) != -ETIME) {
 177		pr_err("fence wait success after submit (expected timeout)!\n");
 178		goto out;
 179	}
 180
 181	if (dma_fence_wait_timeout(&request->fence, false, T) <= 0) {
 182		pr_err("fence wait timed out (expected success)!\n");
 183		goto out;
 184	}
 185
 186	if (!dma_fence_is_signaled(&request->fence)) {
 187		pr_err("fence unsignaled after waiting!\n");
 188		goto out;
 189	}
 190
 191	if (dma_fence_wait_timeout(&request->fence, false, T) <= 0) {
 192		pr_err("fence wait timed out when complete (expected success)!\n");
 193		goto out;
 194	}
 195
 196	err = 0;
 197out:
 198	mock_device_flush(i915);
 199	return err;
 200}
 201
 202static int igt_request_rewind(void *arg)
 203{
 204	struct drm_i915_private *i915 = arg;
 205	struct i915_request *request, *vip;
 206	struct i915_gem_context *ctx[2];
 207	struct intel_context *ce;
 208	int err = -EINVAL;
 209
 210	ctx[0] = mock_context(i915, "A");
 211
 212	ce = i915_gem_context_get_engine(ctx[0], RCS0);
 213	GEM_BUG_ON(IS_ERR(ce));
 214	request = mock_request(ce, 2 * HZ);
 215	intel_context_put(ce);
 216	if (!request) {
 217		err = -ENOMEM;
 218		goto err_context_0;
 219	}
 220
 221	i915_request_get(request);
 222	i915_request_add(request);
 223
 224	ctx[1] = mock_context(i915, "B");
 225
 226	ce = i915_gem_context_get_engine(ctx[1], RCS0);
 227	GEM_BUG_ON(IS_ERR(ce));
 228	vip = mock_request(ce, 0);
 229	intel_context_put(ce);
 230	if (!vip) {
 231		err = -ENOMEM;
 232		goto err_context_1;
 233	}
 234
 235	/* Simulate preemption by manual reordering */
 236	if (!mock_cancel_request(request)) {
 237		pr_err("failed to cancel request (already executed)!\n");
 238		i915_request_add(vip);
 239		goto err_context_1;
 240	}
 241	i915_request_get(vip);
 242	i915_request_add(vip);
 243	rcu_read_lock();
 244	request->engine->submit_request(request);
 245	rcu_read_unlock();
 246
 247
 248	if (i915_request_wait(vip, 0, HZ) == -ETIME) {
 249		pr_err("timed out waiting for high priority request\n");
 250		goto err;
 251	}
 252
 253	if (i915_request_completed(request)) {
 254		pr_err("low priority request already completed\n");
 255		goto err;
 256	}
 257
 258	err = 0;
 259err:
 260	i915_request_put(vip);
 261err_context_1:
 262	mock_context_close(ctx[1]);
 263	i915_request_put(request);
 264err_context_0:
 265	mock_context_close(ctx[0]);
 266	mock_device_flush(i915);
 267	return err;
 268}
 269
 270struct smoketest {
 271	struct intel_engine_cs *engine;
 272	struct i915_gem_context **contexts;
 273	atomic_long_t num_waits, num_fences;
 274	int ncontexts, max_batch;
 275	struct i915_request *(*request_alloc)(struct intel_context *ce);
 276};
 277
 278static struct i915_request *
 279__mock_request_alloc(struct intel_context *ce)
 280{
 281	return mock_request(ce, 0);
 282}
 283
 284static struct i915_request *
 285__live_request_alloc(struct intel_context *ce)
 286{
 287	return intel_context_create_request(ce);
 288}
 289
 290static int __igt_breadcrumbs_smoketest(void *arg)
 291{
 292	struct smoketest *t = arg;
 293	const unsigned int max_batch = min(t->ncontexts, t->max_batch) - 1;
 294	const unsigned int total = 4 * t->ncontexts + 1;
 295	unsigned int num_waits = 0, num_fences = 0;
 296	struct i915_request **requests;
 297	I915_RND_STATE(prng);
 298	unsigned int *order;
 299	int err = 0;
 300
 301	/*
 302	 * A very simple test to catch the most egregious of list handling bugs.
 303	 *
 304	 * At its heart, we simply create oodles of requests running across
 305	 * multiple kthreads and enable signaling on them, for the sole purpose
 306	 * of stressing our breadcrumb handling. The only inspection we do is
 307	 * that the fences were marked as signaled.
 308	 */
 309
 310	requests = kcalloc(total, sizeof(*requests), GFP_KERNEL);
 311	if (!requests)
 312		return -ENOMEM;
 313
 314	order = i915_random_order(total, &prng);
 315	if (!order) {
 316		err = -ENOMEM;
 317		goto out_requests;
 318	}
 319
 320	while (!kthread_should_stop()) {
 321		struct i915_sw_fence *submit, *wait;
 322		unsigned int n, count;
 323
 324		submit = heap_fence_create(GFP_KERNEL);
 325		if (!submit) {
 326			err = -ENOMEM;
 327			break;
 328		}
 329
 330		wait = heap_fence_create(GFP_KERNEL);
 331		if (!wait) {
 332			i915_sw_fence_commit(submit);
 333			heap_fence_put(submit);
 334			err = ENOMEM;
 335			break;
 336		}
 337
 338		i915_random_reorder(order, total, &prng);
 339		count = 1 + i915_prandom_u32_max_state(max_batch, &prng);
 340
 341		for (n = 0; n < count; n++) {
 342			struct i915_gem_context *ctx =
 343				t->contexts[order[n] % t->ncontexts];
 344			struct i915_request *rq;
 345			struct intel_context *ce;
 346
 347			ce = i915_gem_context_get_engine(ctx, t->engine->legacy_idx);
 348			GEM_BUG_ON(IS_ERR(ce));
 349			rq = t->request_alloc(ce);
 350			intel_context_put(ce);
 351			if (IS_ERR(rq)) {
 352				err = PTR_ERR(rq);
 353				count = n;
 354				break;
 355			}
 356
 357			err = i915_sw_fence_await_sw_fence_gfp(&rq->submit,
 358							       submit,
 359							       GFP_KERNEL);
 360
 361			requests[n] = i915_request_get(rq);
 362			i915_request_add(rq);
 363
 364			if (err >= 0)
 365				err = i915_sw_fence_await_dma_fence(wait,
 366								    &rq->fence,
 367								    0,
 368								    GFP_KERNEL);
 369
 370			if (err < 0) {
 371				i915_request_put(rq);
 372				count = n;
 373				break;
 374			}
 375		}
 376
 377		i915_sw_fence_commit(submit);
 378		i915_sw_fence_commit(wait);
 379
 380		if (!wait_event_timeout(wait->wait,
 381					i915_sw_fence_done(wait),
 382					5 * HZ)) {
 383			struct i915_request *rq = requests[count - 1];
 384
 385			pr_err("waiting for %d/%d fences (last %llx:%lld) on %s timed out!\n",
 386			       atomic_read(&wait->pending), count,
 387			       rq->fence.context, rq->fence.seqno,
 388			       t->engine->name);
 389			GEM_TRACE_DUMP();
 390
 391			intel_gt_set_wedged(t->engine->gt);
 392			GEM_BUG_ON(!i915_request_completed(rq));
 393			i915_sw_fence_wait(wait);
 394			err = -EIO;
 395		}
 396
 397		for (n = 0; n < count; n++) {
 398			struct i915_request *rq = requests[n];
 399
 400			if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
 401				      &rq->fence.flags)) {
 402				pr_err("%llu:%llu was not signaled!\n",
 403				       rq->fence.context, rq->fence.seqno);
 404				err = -EINVAL;
 405			}
 406
 407			i915_request_put(rq);
 408		}
 409
 410		heap_fence_put(wait);
 411		heap_fence_put(submit);
 412
 413		if (err < 0)
 414			break;
 415
 416		num_fences += count;
 417		num_waits++;
 418
 419		cond_resched();
 420	}
 421
 422	atomic_long_add(num_fences, &t->num_fences);
 423	atomic_long_add(num_waits, &t->num_waits);
 424
 425	kfree(order);
 426out_requests:
 427	kfree(requests);
 428	return err;
 429}
 430
 431static int mock_breadcrumbs_smoketest(void *arg)
 432{
 433	struct drm_i915_private *i915 = arg;
 434	struct smoketest t = {
 435		.engine = rcs0(i915),
 436		.ncontexts = 1024,
 437		.max_batch = 1024,
 438		.request_alloc = __mock_request_alloc
 439	};
 440	unsigned int ncpus = num_online_cpus();
 441	struct task_struct **threads;
 442	unsigned int n;
 443	int ret = 0;
 444
 445	/*
 446	 * Smoketest our breadcrumb/signal handling for requests across multiple
 447	 * threads. A very simple test to only catch the most egregious of bugs.
 448	 * See __igt_breadcrumbs_smoketest();
 449	 */
 450
 451	threads = kcalloc(ncpus, sizeof(*threads), GFP_KERNEL);
 452	if (!threads)
 453		return -ENOMEM;
 454
 455	t.contexts = kcalloc(t.ncontexts, sizeof(*t.contexts), GFP_KERNEL);
 456	if (!t.contexts) {
 457		ret = -ENOMEM;
 458		goto out_threads;
 459	}
 460
 461	for (n = 0; n < t.ncontexts; n++) {
 462		t.contexts[n] = mock_context(t.engine->i915, "mock");
 463		if (!t.contexts[n]) {
 464			ret = -ENOMEM;
 465			goto out_contexts;
 466		}
 467	}
 468
 469	for (n = 0; n < ncpus; n++) {
 470		threads[n] = kthread_run(__igt_breadcrumbs_smoketest,
 471					 &t, "igt/%d", n);
 472		if (IS_ERR(threads[n])) {
 473			ret = PTR_ERR(threads[n]);
 474			ncpus = n;
 475			break;
 476		}
 477
 478		get_task_struct(threads[n]);
 479	}
 480
 481	yield(); /* start all threads before we begin */
 482	msleep(jiffies_to_msecs(i915_selftest.timeout_jiffies));
 483
 484	for (n = 0; n < ncpus; n++) {
 485		int err;
 486
 487		err = kthread_stop(threads[n]);
 488		if (err < 0 && !ret)
 489			ret = err;
 490
 491		put_task_struct(threads[n]);
 492	}
 493	pr_info("Completed %lu waits for %lu fence across %d cpus\n",
 494		atomic_long_read(&t.num_waits),
 495		atomic_long_read(&t.num_fences),
 496		ncpus);
 497
 498out_contexts:
 499	for (n = 0; n < t.ncontexts; n++) {
 500		if (!t.contexts[n])
 501			break;
 502		mock_context_close(t.contexts[n]);
 503	}
 504	kfree(t.contexts);
 505out_threads:
 506	kfree(threads);
 507	return ret;
 508}
 509
 510int i915_request_mock_selftests(void)
 511{
 512	static const struct i915_subtest tests[] = {
 513		SUBTEST(igt_add_request),
 514		SUBTEST(igt_wait_request),
 515		SUBTEST(igt_fence_wait),
 516		SUBTEST(igt_request_rewind),
 517		SUBTEST(mock_breadcrumbs_smoketest),
 518	};
 519	struct drm_i915_private *i915;
 520	intel_wakeref_t wakeref;
 521	int err = 0;
 522
 523	i915 = mock_gem_device();
 524	if (!i915)
 525		return -ENOMEM;
 526
 527	with_intel_runtime_pm(&i915->runtime_pm, wakeref)
 528		err = i915_subtests(tests, i915);
 529
 530	drm_dev_put(&i915->drm);
 531
 532	return err;
 533}
 534
 535static int live_nop_request(void *arg)
 536{
 537	struct drm_i915_private *i915 = arg;
 538	struct intel_engine_cs *engine;
 539	struct igt_live_test t;
 540	int err = -ENODEV;
 541
 542	/*
 543	 * Submit various sized batches of empty requests, to each engine
 544	 * (individually), and wait for the batch to complete. We can check
 545	 * the overhead of submitting requests to the hardware.
 546	 */
 547
 548	for_each_uabi_engine(engine, i915) {
 549		unsigned long n, prime;
 550		IGT_TIMEOUT(end_time);
 551		ktime_t times[2] = {};
 552
 553		err = igt_live_test_begin(&t, i915, __func__, engine->name);
 554		if (err)
 555			return err;
 556
 557		intel_engine_pm_get(engine);
 558		for_each_prime_number_from(prime, 1, 8192) {
 559			struct i915_request *request = NULL;
 560
 561			times[1] = ktime_get_raw();
 562
 563			for (n = 0; n < prime; n++) {
 564				i915_request_put(request);
 565				request = i915_request_create(engine->kernel_context);
 566				if (IS_ERR(request))
 567					return PTR_ERR(request);
 568
 569				/*
 570				 * This space is left intentionally blank.
 571				 *
 572				 * We do not actually want to perform any
 573				 * action with this request, we just want
 574				 * to measure the latency in allocation
 575				 * and submission of our breadcrumbs -
 576				 * ensuring that the bare request is sufficient
 577				 * for the system to work (i.e. proper HEAD
 578				 * tracking of the rings, interrupt handling,
 579				 * etc). It also gives us the lowest bounds
 580				 * for latency.
 581				 */
 582
 583				i915_request_get(request);
 584				i915_request_add(request);
 585			}
 586			i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
 587			i915_request_put(request);
 588
 589			times[1] = ktime_sub(ktime_get_raw(), times[1]);
 590			if (prime == 1)
 591				times[0] = times[1];
 592
 593			if (__igt_timeout(end_time, NULL))
 594				break;
 595		}
 596		intel_engine_pm_put(engine);
 597
 598		err = igt_live_test_end(&t);
 599		if (err)
 600			return err;
 601
 602		pr_info("Request latencies on %s: 1 = %lluns, %lu = %lluns\n",
 603			engine->name,
 604			ktime_to_ns(times[0]),
 605			prime, div64_u64(ktime_to_ns(times[1]), prime));
 606	}
 607
 608	return err;
 609}
 610
 611static struct i915_vma *empty_batch(struct drm_i915_private *i915)
 612{
 613	struct drm_i915_gem_object *obj;
 614	struct i915_vma *vma;
 615	u32 *cmd;
 616	int err;
 617
 618	obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
 619	if (IS_ERR(obj))
 620		return ERR_CAST(obj);
 621
 622	cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
 623	if (IS_ERR(cmd)) {
 624		err = PTR_ERR(cmd);
 625		goto err;
 626	}
 627
 628	*cmd = MI_BATCH_BUFFER_END;
 629
 630	__i915_gem_object_flush_map(obj, 0, 64);
 631	i915_gem_object_unpin_map(obj);
 632
 633	intel_gt_chipset_flush(&i915->gt);
 634
 635	vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
 636	if (IS_ERR(vma)) {
 637		err = PTR_ERR(vma);
 638		goto err;
 639	}
 640
 641	err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_GLOBAL);
 642	if (err)
 643		goto err;
 644
 645	/* Force the wait wait now to avoid including it in the benchmark */
 646	err = i915_vma_sync(vma);
 647	if (err)
 648		goto err_pin;
 649
 650	return vma;
 651
 652err_pin:
 653	i915_vma_unpin(vma);
 654err:
 655	i915_gem_object_put(obj);
 656	return ERR_PTR(err);
 657}
 658
 659static struct i915_request *
 660empty_request(struct intel_engine_cs *engine,
 661	      struct i915_vma *batch)
 662{
 663	struct i915_request *request;
 664	int err;
 665
 666	request = i915_request_create(engine->kernel_context);
 667	if (IS_ERR(request))
 668		return request;
 669
 670	err = engine->emit_bb_start(request,
 671				    batch->node.start,
 672				    batch->node.size,
 673				    I915_DISPATCH_SECURE);
 674	if (err)
 675		goto out_request;
 676
 677	i915_request_get(request);
 678out_request:
 679	i915_request_add(request);
 680	return err ? ERR_PTR(err) : request;
 681}
 682
 683static int live_empty_request(void *arg)
 684{
 685	struct drm_i915_private *i915 = arg;
 686	struct intel_engine_cs *engine;
 687	struct igt_live_test t;
 688	struct i915_vma *batch;
 689	int err = 0;
 690
 691	/*
 692	 * Submit various sized batches of empty requests, to each engine
 693	 * (individually), and wait for the batch to complete. We can check
 694	 * the overhead of submitting requests to the hardware.
 695	 */
 696
 697	batch = empty_batch(i915);
 698	if (IS_ERR(batch))
 699		return PTR_ERR(batch);
 700
 701	for_each_uabi_engine(engine, i915) {
 702		IGT_TIMEOUT(end_time);
 703		struct i915_request *request;
 704		unsigned long n, prime;
 705		ktime_t times[2] = {};
 706
 707		err = igt_live_test_begin(&t, i915, __func__, engine->name);
 708		if (err)
 709			goto out_batch;
 710
 711		intel_engine_pm_get(engine);
 712
 713		/* Warmup / preload */
 714		request = empty_request(engine, batch);
 715		if (IS_ERR(request)) {
 716			err = PTR_ERR(request);
 717			intel_engine_pm_put(engine);
 718			goto out_batch;
 719		}
 720		i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
 721
 722		for_each_prime_number_from(prime, 1, 8192) {
 723			times[1] = ktime_get_raw();
 724
 725			for (n = 0; n < prime; n++) {
 726				i915_request_put(request);
 727				request = empty_request(engine, batch);
 728				if (IS_ERR(request)) {
 729					err = PTR_ERR(request);
 730					intel_engine_pm_put(engine);
 731					goto out_batch;
 732				}
 733			}
 734			i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
 735
 736			times[1] = ktime_sub(ktime_get_raw(), times[1]);
 737			if (prime == 1)
 738				times[0] = times[1];
 739
 740			if (__igt_timeout(end_time, NULL))
 741				break;
 742		}
 743		i915_request_put(request);
 744		intel_engine_pm_put(engine);
 745
 746		err = igt_live_test_end(&t);
 747		if (err)
 748			goto out_batch;
 749
 750		pr_info("Batch latencies on %s: 1 = %lluns, %lu = %lluns\n",
 751			engine->name,
 752			ktime_to_ns(times[0]),
 753			prime, div64_u64(ktime_to_ns(times[1]), prime));
 754	}
 755
 756out_batch:
 757	i915_vma_unpin(batch);
 758	i915_vma_put(batch);
 759	return err;
 760}
 761
 762static struct i915_vma *recursive_batch(struct drm_i915_private *i915)
 763{
 764	struct drm_i915_gem_object *obj;
 765	const int gen = INTEL_GEN(i915);
 766	struct i915_vma *vma;
 767	u32 *cmd;
 768	int err;
 769
 770	obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
 771	if (IS_ERR(obj))
 772		return ERR_CAST(obj);
 773
 774	vma = i915_vma_instance(obj, i915->gt.vm, NULL);
 775	if (IS_ERR(vma)) {
 776		err = PTR_ERR(vma);
 777		goto err;
 778	}
 779
 780	err = i915_vma_pin(vma, 0, 0, PIN_USER);
 781	if (err)
 782		goto err;
 783
 784	cmd = i915_gem_object_pin_map(obj, I915_MAP_WC);
 785	if (IS_ERR(cmd)) {
 786		err = PTR_ERR(cmd);
 787		goto err;
 788	}
 789
 790	if (gen >= 8) {
 791		*cmd++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
 792		*cmd++ = lower_32_bits(vma->node.start);
 793		*cmd++ = upper_32_bits(vma->node.start);
 794	} else if (gen >= 6) {
 795		*cmd++ = MI_BATCH_BUFFER_START | 1 << 8;
 796		*cmd++ = lower_32_bits(vma->node.start);
 797	} else {
 798		*cmd++ = MI_BATCH_BUFFER_START | MI_BATCH_GTT;
 799		*cmd++ = lower_32_bits(vma->node.start);
 800	}
 801	*cmd++ = MI_BATCH_BUFFER_END; /* terminate early in case of error */
 802
 803	__i915_gem_object_flush_map(obj, 0, 64);
 804	i915_gem_object_unpin_map(obj);
 805
 806	intel_gt_chipset_flush(&i915->gt);
 807
 808	return vma;
 809
 810err:
 811	i915_gem_object_put(obj);
 812	return ERR_PTR(err);
 813}
 814
 815static int recursive_batch_resolve(struct i915_vma *batch)
 816{
 817	u32 *cmd;
 818
 819	cmd = i915_gem_object_pin_map(batch->obj, I915_MAP_WC);
 820	if (IS_ERR(cmd))
 821		return PTR_ERR(cmd);
 822
 823	*cmd = MI_BATCH_BUFFER_END;
 824
 825	__i915_gem_object_flush_map(batch->obj, 0, sizeof(*cmd));
 826	i915_gem_object_unpin_map(batch->obj);
 827
 828	intel_gt_chipset_flush(batch->vm->gt);
 829
 830	return 0;
 831}
 832
 833static int live_all_engines(void *arg)
 834{
 835	struct drm_i915_private *i915 = arg;
 836	const unsigned int nengines = num_uabi_engines(i915);
 837	struct intel_engine_cs *engine;
 838	struct i915_request **request;
 839	struct igt_live_test t;
 840	struct i915_vma *batch;
 841	unsigned int idx;
 842	int err;
 843
 844	/*
 845	 * Check we can submit requests to all engines simultaneously. We
 846	 * send a recursive batch to each engine - checking that we don't
 847	 * block doing so, and that they don't complete too soon.
 848	 */
 849
 850	request = kcalloc(nengines, sizeof(*request), GFP_KERNEL);
 851	if (!request)
 852		return -ENOMEM;
 853
 854	err = igt_live_test_begin(&t, i915, __func__, "");
 855	if (err)
 856		goto out_free;
 857
 858	batch = recursive_batch(i915);
 859	if (IS_ERR(batch)) {
 860		err = PTR_ERR(batch);
 861		pr_err("%s: Unable to create batch, err=%d\n", __func__, err);
 862		goto out_free;
 863	}
 864
 865	idx = 0;
 866	for_each_uabi_engine(engine, i915) {
 867		request[idx] = intel_engine_create_kernel_request(engine);
 868		if (IS_ERR(request[idx])) {
 869			err = PTR_ERR(request[idx]);
 870			pr_err("%s: Request allocation failed with err=%d\n",
 871			       __func__, err);
 872			goto out_request;
 873		}
 874
 875		i915_vma_lock(batch);
 876		err = i915_request_await_object(request[idx], batch->obj, 0);
 877		if (err == 0)
 878			err = i915_vma_move_to_active(batch, request[idx], 0);
 879		i915_vma_unlock(batch);
 880		GEM_BUG_ON(err);
 881
 882		err = engine->emit_bb_start(request[idx],
 883					    batch->node.start,
 884					    batch->node.size,
 885					    0);
 886		GEM_BUG_ON(err);
 887		request[idx]->batch = batch;
 888
 889		i915_request_get(request[idx]);
 890		i915_request_add(request[idx]);
 891		idx++;
 892	}
 893
 894	idx = 0;
 895	for_each_uabi_engine(engine, i915) {
 896		if (i915_request_completed(request[idx])) {
 897			pr_err("%s(%s): request completed too early!\n",
 898			       __func__, engine->name);
 899			err = -EINVAL;
 900			goto out_request;
 901		}
 902		idx++;
 903	}
 904
 905	err = recursive_batch_resolve(batch);
 906	if (err) {
 907		pr_err("%s: failed to resolve batch, err=%d\n", __func__, err);
 908		goto out_request;
 909	}
 910
 911	idx = 0;
 912	for_each_uabi_engine(engine, i915) {
 913		long timeout;
 914
 915		timeout = i915_request_wait(request[idx], 0,
 916					    MAX_SCHEDULE_TIMEOUT);
 917		if (timeout < 0) {
 918			err = timeout;
 919			pr_err("%s: error waiting for request on %s, err=%d\n",
 920			       __func__, engine->name, err);
 921			goto out_request;
 922		}
 923
 924		GEM_BUG_ON(!i915_request_completed(request[idx]));
 925		i915_request_put(request[idx]);
 926		request[idx] = NULL;
 927		idx++;
 928	}
 929
 930	err = igt_live_test_end(&t);
 931
 932out_request:
 933	idx = 0;
 934	for_each_uabi_engine(engine, i915) {
 935		if (request[idx])
 936			i915_request_put(request[idx]);
 937		idx++;
 938	}
 939	i915_vma_unpin(batch);
 940	i915_vma_put(batch);
 941out_free:
 942	kfree(request);
 943	return err;
 944}
 945
 946static int live_sequential_engines(void *arg)
 947{
 948	struct drm_i915_private *i915 = arg;
 949	const unsigned int nengines = num_uabi_engines(i915);
 950	struct i915_request **request;
 951	struct i915_request *prev = NULL;
 952	struct intel_engine_cs *engine;
 953	struct igt_live_test t;
 954	unsigned int idx;
 955	int err;
 956
 957	/*
 958	 * Check we can submit requests to all engines sequentially, such
 959	 * that each successive request waits for the earlier ones. This
 960	 * tests that we don't execute requests out of order, even though
 961	 * they are running on independent engines.
 962	 */
 963
 964	request = kcalloc(nengines, sizeof(*request), GFP_KERNEL);
 965	if (!request)
 966		return -ENOMEM;
 967
 968	err = igt_live_test_begin(&t, i915, __func__, "");
 969	if (err)
 970		goto out_free;
 971
 972	idx = 0;
 973	for_each_uabi_engine(engine, i915) {
 974		struct i915_vma *batch;
 975
 976		batch = recursive_batch(i915);
 977		if (IS_ERR(batch)) {
 978			err = PTR_ERR(batch);
 979			pr_err("%s: Unable to create batch for %s, err=%d\n",
 980			       __func__, engine->name, err);
 981			goto out_free;
 982		}
 983
 984		request[idx] = intel_engine_create_kernel_request(engine);
 985		if (IS_ERR(request[idx])) {
 986			err = PTR_ERR(request[idx]);
 987			pr_err("%s: Request allocation failed for %s with err=%d\n",
 988			       __func__, engine->name, err);
 989			goto out_request;
 990		}
 991
 992		if (prev) {
 993			err = i915_request_await_dma_fence(request[idx],
 994							   &prev->fence);
 995			if (err) {
 996				i915_request_add(request[idx]);
 997				pr_err("%s: Request await failed for %s with err=%d\n",
 998				       __func__, engine->name, err);
 999				goto out_request;
1000			}
1001		}
1002
1003		i915_vma_lock(batch);
1004		err = i915_request_await_object(request[idx],
1005						batch->obj, false);
1006		if (err == 0)
1007			err = i915_vma_move_to_active(batch, request[idx], 0);
1008		i915_vma_unlock(batch);
1009		GEM_BUG_ON(err);
1010
1011		err = engine->emit_bb_start(request[idx],
1012					    batch->node.start,
1013					    batch->node.size,
1014					    0);
1015		GEM_BUG_ON(err);
1016		request[idx]->batch = batch;
1017
1018		i915_request_get(request[idx]);
1019		i915_request_add(request[idx]);
1020
1021		prev = request[idx];
1022		idx++;
1023	}
1024
1025	idx = 0;
1026	for_each_uabi_engine(engine, i915) {
1027		long timeout;
1028
1029		if (i915_request_completed(request[idx])) {
1030			pr_err("%s(%s): request completed too early!\n",
1031			       __func__, engine->name);
1032			err = -EINVAL;
1033			goto out_request;
1034		}
1035
1036		err = recursive_batch_resolve(request[idx]->batch);
1037		if (err) {
1038			pr_err("%s: failed to resolve batch, err=%d\n",
1039			       __func__, err);
1040			goto out_request;
1041		}
1042
1043		timeout = i915_request_wait(request[idx], 0,
1044					    MAX_SCHEDULE_TIMEOUT);
1045		if (timeout < 0) {
1046			err = timeout;
1047			pr_err("%s: error waiting for request on %s, err=%d\n",
1048			       __func__, engine->name, err);
1049			goto out_request;
1050		}
1051
1052		GEM_BUG_ON(!i915_request_completed(request[idx]));
1053		idx++;
1054	}
1055
1056	err = igt_live_test_end(&t);
1057
1058out_request:
1059	idx = 0;
1060	for_each_uabi_engine(engine, i915) {
1061		u32 *cmd;
1062
1063		if (!request[idx])
1064			break;
1065
1066		cmd = i915_gem_object_pin_map(request[idx]->batch->obj,
1067					      I915_MAP_WC);
1068		if (!IS_ERR(cmd)) {
1069			*cmd = MI_BATCH_BUFFER_END;
1070
1071			__i915_gem_object_flush_map(request[idx]->batch->obj,
1072						    0, sizeof(*cmd));
1073			i915_gem_object_unpin_map(request[idx]->batch->obj);
1074
1075			intel_gt_chipset_flush(engine->gt);
1076		}
1077
1078		i915_vma_put(request[idx]->batch);
1079		i915_request_put(request[idx]);
1080		idx++;
1081	}
1082out_free:
1083	kfree(request);
1084	return err;
1085}
1086
1087static int __live_parallel_engine1(void *arg)
1088{
1089	struct intel_engine_cs *engine = arg;
1090	IGT_TIMEOUT(end_time);
1091	unsigned long count;
1092	int err = 0;
1093
1094	count = 0;
1095	intel_engine_pm_get(engine);
1096	do {
1097		struct i915_request *rq;
1098
1099		rq = i915_request_create(engine->kernel_context);
1100		if (IS_ERR(rq)) {
1101			err = PTR_ERR(rq);
1102			break;
1103		}
1104
1105		i915_request_get(rq);
1106		i915_request_add(rq);
1107
1108		err = 0;
1109		if (i915_request_wait(rq, 0, HZ / 5) < 0)
1110			err = -ETIME;
1111		i915_request_put(rq);
1112		if (err)
1113			break;
1114
1115		count++;
1116	} while (!__igt_timeout(end_time, NULL));
1117	intel_engine_pm_put(engine);
1118
1119	pr_info("%s: %lu request + sync\n", engine->name, count);
1120	return err;
1121}
1122
1123static int __live_parallel_engineN(void *arg)
1124{
1125	struct intel_engine_cs *engine = arg;
1126	IGT_TIMEOUT(end_time);
1127	unsigned long count;
1128	int err = 0;
1129
1130	count = 0;
1131	intel_engine_pm_get(engine);
1132	do {
1133		struct i915_request *rq;
1134
1135		rq = i915_request_create(engine->kernel_context);
1136		if (IS_ERR(rq)) {
1137			err = PTR_ERR(rq);
1138			break;
1139		}
1140
1141		i915_request_add(rq);
1142		count++;
1143	} while (!__igt_timeout(end_time, NULL));
1144	intel_engine_pm_put(engine);
1145
1146	pr_info("%s: %lu requests\n", engine->name, count);
1147	return err;
1148}
1149
1150static bool wake_all(struct drm_i915_private *i915)
1151{
1152	if (atomic_dec_and_test(&i915->selftest.counter)) {
1153		wake_up_var(&i915->selftest.counter);
1154		return true;
1155	}
1156
1157	return false;
1158}
1159
1160static int wait_for_all(struct drm_i915_private *i915)
1161{
1162	if (wake_all(i915))
1163		return 0;
1164
1165	if (wait_var_event_timeout(&i915->selftest.counter,
1166				   !atomic_read(&i915->selftest.counter),
1167				   i915_selftest.timeout_jiffies))
1168		return 0;
1169
1170	return -ETIME;
1171}
1172
1173static int __live_parallel_spin(void *arg)
1174{
1175	struct intel_engine_cs *engine = arg;
1176	struct igt_spinner spin;
1177	struct i915_request *rq;
1178	int err = 0;
1179
1180	/*
1181	 * Create a spinner running for eternity on each engine. If a second
1182	 * spinner is incorrectly placed on the same engine, it will not be
1183	 * able to start in time.
1184	 */
1185
1186	if (igt_spinner_init(&spin, engine->gt)) {
1187		wake_all(engine->i915);
1188		return -ENOMEM;
1189	}
1190
1191	intel_engine_pm_get(engine);
1192	rq = igt_spinner_create_request(&spin,
1193					engine->kernel_context,
1194					MI_NOOP); /* no preemption */
1195	intel_engine_pm_put(engine);
1196	if (IS_ERR(rq)) {
1197		err = PTR_ERR(rq);
1198		if (err == -ENODEV)
1199			err = 0;
1200		wake_all(engine->i915);
1201		goto out_spin;
1202	}
1203
1204	i915_request_get(rq);
1205	i915_request_add(rq);
1206	if (igt_wait_for_spinner(&spin, rq)) {
1207		/* Occupy this engine for the whole test */
1208		err = wait_for_all(engine->i915);
1209	} else {
1210		pr_err("Failed to start spinner on %s\n", engine->name);
1211		err = -EINVAL;
1212	}
1213	igt_spinner_end(&spin);
1214
1215	if (err == 0 && i915_request_wait(rq, 0, HZ / 5) < 0)
1216		err = -EIO;
1217	i915_request_put(rq);
1218
1219out_spin:
1220	igt_spinner_fini(&spin);
1221	return err;
1222}
1223
1224static int live_parallel_engines(void *arg)
1225{
1226	struct drm_i915_private *i915 = arg;
1227	static int (* const func[])(void *arg) = {
1228		__live_parallel_engine1,
1229		__live_parallel_engineN,
1230		__live_parallel_spin,
1231		NULL,
1232	};
1233	const unsigned int nengines = num_uabi_engines(i915);
1234	struct intel_engine_cs *engine;
1235	int (* const *fn)(void *arg);
1236	struct task_struct **tsk;
1237	int err = 0;
1238
1239	/*
1240	 * Check we can submit requests to all engines concurrently. This
1241	 * tests that we load up the system maximally.
1242	 */
1243
1244	tsk = kcalloc(nengines, sizeof(*tsk), GFP_KERNEL);
1245	if (!tsk)
1246		return -ENOMEM;
1247
1248	for (fn = func; !err && *fn; fn++) {
1249		char name[KSYM_NAME_LEN];
1250		struct igt_live_test t;
1251		unsigned int idx;
1252
1253		snprintf(name, sizeof(name), "%ps", *fn);
1254		err = igt_live_test_begin(&t, i915, __func__, name);
1255		if (err)
1256			break;
1257
1258		atomic_set(&i915->selftest.counter, nengines);
1259
1260		idx = 0;
1261		for_each_uabi_engine(engine, i915) {
1262			tsk[idx] = kthread_run(*fn, engine,
1263					       "igt/parallel:%s",
1264					       engine->name);
1265			if (IS_ERR(tsk[idx])) {
1266				err = PTR_ERR(tsk[idx]);
1267				break;
1268			}
1269			get_task_struct(tsk[idx++]);
1270		}
1271
1272		yield(); /* start all threads before we kthread_stop() */
1273
1274		idx = 0;
1275		for_each_uabi_engine(engine, i915) {
1276			int status;
1277
1278			if (IS_ERR(tsk[idx]))
1279				break;
1280
1281			status = kthread_stop(tsk[idx]);
1282			if (status && !err)
1283				err = status;
1284
1285			put_task_struct(tsk[idx++]);
1286		}
1287
1288		if (igt_live_test_end(&t))
1289			err = -EIO;
1290	}
1291
1292	kfree(tsk);
1293	return err;
1294}
1295
1296static int
1297max_batches(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
1298{
1299	struct i915_request *rq;
1300	int ret;
1301
1302	/*
1303	 * Before execlists, all contexts share the same ringbuffer. With
1304	 * execlists, each context/engine has a separate ringbuffer and
1305	 * for the purposes of this test, inexhaustible.
1306	 *
1307	 * For the global ringbuffer though, we have to be very careful
1308	 * that we do not wrap while preventing the execution of requests
1309	 * with a unsignaled fence.
1310	 */
1311	if (HAS_EXECLISTS(ctx->i915))
1312		return INT_MAX;
1313
1314	rq = igt_request_alloc(ctx, engine);
1315	if (IS_ERR(rq)) {
1316		ret = PTR_ERR(rq);
1317	} else {
1318		int sz;
1319
1320		ret = rq->ring->size - rq->reserved_space;
1321		i915_request_add(rq);
1322
1323		sz = rq->ring->emit - rq->head;
1324		if (sz < 0)
1325			sz += rq->ring->size;
1326		ret /= sz;
1327		ret /= 2; /* leave half spare, in case of emergency! */
1328	}
1329
1330	return ret;
1331}
1332
1333static int live_breadcrumbs_smoketest(void *arg)
1334{
1335	struct drm_i915_private *i915 = arg;
1336	const unsigned int nengines = num_uabi_engines(i915);
1337	const unsigned int ncpus = num_online_cpus();
1338	unsigned long num_waits, num_fences;
1339	struct intel_engine_cs *engine;
1340	struct task_struct **threads;
1341	struct igt_live_test live;
1342	intel_wakeref_t wakeref;
1343	struct smoketest *smoke;
1344	unsigned int n, idx;
1345	struct file *file;
1346	int ret = 0;
1347
1348	/*
1349	 * Smoketest our breadcrumb/signal handling for requests across multiple
1350	 * threads. A very simple test to only catch the most egregious of bugs.
1351	 * See __igt_breadcrumbs_smoketest();
1352	 *
1353	 * On real hardware this time.
1354	 */
1355
1356	wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1357
1358	file = mock_file(i915);
1359	if (IS_ERR(file)) {
1360		ret = PTR_ERR(file);
1361		goto out_rpm;
1362	}
1363
1364	smoke = kcalloc(nengines, sizeof(*smoke), GFP_KERNEL);
1365	if (!smoke) {
1366		ret = -ENOMEM;
1367		goto out_file;
1368	}
1369
1370	threads = kcalloc(ncpus * nengines, sizeof(*threads), GFP_KERNEL);
1371	if (!threads) {
1372		ret = -ENOMEM;
1373		goto out_smoke;
1374	}
1375
1376	smoke[0].request_alloc = __live_request_alloc;
1377	smoke[0].ncontexts = 64;
1378	smoke[0].contexts = kcalloc(smoke[0].ncontexts,
1379				    sizeof(*smoke[0].contexts),
1380				    GFP_KERNEL);
1381	if (!smoke[0].contexts) {
1382		ret = -ENOMEM;
1383		goto out_threads;
1384	}
1385
1386	for (n = 0; n < smoke[0].ncontexts; n++) {
1387		smoke[0].contexts[n] = live_context(i915, file);
1388		if (!smoke[0].contexts[n]) {
1389			ret = -ENOMEM;
1390			goto out_contexts;
1391		}
1392	}
1393
1394	ret = igt_live_test_begin(&live, i915, __func__, "");
1395	if (ret)
1396		goto out_contexts;
1397
1398	idx = 0;
1399	for_each_uabi_engine(engine, i915) {
1400		smoke[idx] = smoke[0];
1401		smoke[idx].engine = engine;
1402		smoke[idx].max_batch =
1403			max_batches(smoke[0].contexts[0], engine);
1404		if (smoke[idx].max_batch < 0) {
1405			ret = smoke[idx].max_batch;
1406			goto out_flush;
1407		}
1408		/* One ring interleaved between requests from all cpus */
1409		smoke[idx].max_batch /= num_online_cpus() + 1;
1410		pr_debug("Limiting batches to %d requests on %s\n",
1411			 smoke[idx].max_batch, engine->name);
1412
1413		for (n = 0; n < ncpus; n++) {
1414			struct task_struct *tsk;
1415
1416			tsk = kthread_run(__igt_breadcrumbs_smoketest,
1417					  &smoke[idx], "igt/%d.%d", idx, n);
1418			if (IS_ERR(tsk)) {
1419				ret = PTR_ERR(tsk);
1420				goto out_flush;
1421			}
1422
1423			get_task_struct(tsk);
1424			threads[idx * ncpus + n] = tsk;
1425		}
1426
1427		idx++;
1428	}
1429
1430	yield(); /* start all threads before we begin */
1431	msleep(jiffies_to_msecs(i915_selftest.timeout_jiffies));
1432
1433out_flush:
1434	idx = 0;
1435	num_waits = 0;
1436	num_fences = 0;
1437	for_each_uabi_engine(engine, i915) {
1438		for (n = 0; n < ncpus; n++) {
1439			struct task_struct *tsk = threads[idx * ncpus + n];
1440			int err;
1441
1442			if (!tsk)
1443				continue;
1444
1445			err = kthread_stop(tsk);
1446			if (err < 0 && !ret)
1447				ret = err;
1448
1449			put_task_struct(tsk);
1450		}
1451
1452		num_waits += atomic_long_read(&smoke[idx].num_waits);
1453		num_fences += atomic_long_read(&smoke[idx].num_fences);
1454		idx++;
1455	}
1456	pr_info("Completed %lu waits for %lu fences across %d engines and %d cpus\n",
1457		num_waits, num_fences, idx, ncpus);
1458
1459	ret = igt_live_test_end(&live) ?: ret;
1460out_contexts:
1461	kfree(smoke[0].contexts);
1462out_threads:
1463	kfree(threads);
1464out_smoke:
1465	kfree(smoke);
1466out_file:
1467	fput(file);
1468out_rpm:
1469	intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1470
1471	return ret;
1472}
1473
1474int i915_request_live_selftests(struct drm_i915_private *i915)
1475{
1476	static const struct i915_subtest tests[] = {
1477		SUBTEST(live_nop_request),
1478		SUBTEST(live_all_engines),
1479		SUBTEST(live_sequential_engines),
1480		SUBTEST(live_parallel_engines),
1481		SUBTEST(live_empty_request),
1482		SUBTEST(live_breadcrumbs_smoketest),
1483	};
1484
1485	if (intel_gt_is_wedged(&i915->gt))
1486		return 0;
1487
1488	return i915_subtests(tests, i915);
1489}
1490
1491static int switch_to_kernel_sync(struct intel_context *ce, int err)
1492{
1493	struct i915_request *rq;
1494	struct dma_fence *fence;
1495
1496	rq = intel_engine_create_kernel_request(ce->engine);
1497	if (IS_ERR(rq))
1498		return PTR_ERR(rq);
1499
1500	fence = i915_active_fence_get(&ce->timeline->last_request);
1501	if (fence) {
1502		i915_request_await_dma_fence(rq, fence);
1503		dma_fence_put(fence);
1504	}
1505
1506	rq = i915_request_get(rq);
1507	i915_request_add(rq);
1508	if (i915_request_wait(rq, 0, HZ / 2) < 0 && !err)
1509		err = -ETIME;
1510	i915_request_put(rq);
1511
1512	while (!err && !intel_engine_is_idle(ce->engine))
1513		intel_engine_flush_submission(ce->engine);
1514
1515	return err;
1516}
1517
1518struct perf_stats {
1519	struct intel_engine_cs *engine;
1520	unsigned long count;
1521	ktime_t time;
1522	ktime_t busy;
1523	u64 runtime;
1524};
1525
1526struct perf_series {
1527	struct drm_i915_private *i915;
1528	unsigned int nengines;
1529	struct intel_context *ce[];
1530};
1531
1532static int cmp_u32(const void *A, const void *B)
1533{
1534	const u32 *a = A, *b = B;
1535
1536	return *a - *b;
1537}
1538
1539static u32 trifilter(u32 *a)
1540{
1541	u64 sum;
1542
1543#define TF_COUNT 5
1544	sort(a, TF_COUNT, sizeof(*a), cmp_u32, NULL);
1545
1546	sum = mul_u32_u32(a[2], 2);
1547	sum += a[1];
1548	sum += a[3];
1549
1550	GEM_BUG_ON(sum > U32_MAX);
1551	return sum;
1552#define TF_BIAS 2
1553}
1554
1555static u64 cycles_to_ns(struct intel_engine_cs *engine, u32 cycles)
1556{
1557	u64 ns = i915_cs_timestamp_ticks_to_ns(engine->i915, cycles);
1558
1559	return DIV_ROUND_CLOSEST(ns, 1 << TF_BIAS);
1560}
1561
1562static u32 *emit_timestamp_store(u32 *cs, struct intel_context *ce, u32 offset)
1563{
1564	*cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
1565	*cs++ = i915_mmio_reg_offset(RING_TIMESTAMP((ce->engine->mmio_base)));
1566	*cs++ = offset;
1567	*cs++ = 0;
1568
1569	return cs;
1570}
1571
1572static u32 *emit_store_dw(u32 *cs, u32 offset, u32 value)
1573{
1574	*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
1575	*cs++ = offset;
1576	*cs++ = 0;
1577	*cs++ = value;
1578
1579	return cs;
1580}
1581
1582static u32 *emit_semaphore_poll(u32 *cs, u32 mode, u32 value, u32 offset)
1583{
1584	*cs++ = MI_SEMAPHORE_WAIT |
1585		MI_SEMAPHORE_GLOBAL_GTT |
1586		MI_SEMAPHORE_POLL |
1587		mode;
1588	*cs++ = value;
1589	*cs++ = offset;
1590	*cs++ = 0;
1591
1592	return cs;
1593}
1594
1595static u32 *emit_semaphore_poll_until(u32 *cs, u32 offset, u32 value)
1596{
1597	return emit_semaphore_poll(cs, MI_SEMAPHORE_SAD_EQ_SDD, value, offset);
1598}
1599
1600static void semaphore_set(u32 *sema, u32 value)
1601{
1602	WRITE_ONCE(*sema, value);
1603	wmb(); /* flush the update to the cache, and beyond */
1604}
1605
1606static u32 *hwsp_scratch(const struct intel_context *ce)
1607{
1608	return memset32(ce->engine->status_page.addr + 1000, 0, 21);
1609}
1610
1611static u32 hwsp_offset(const struct intel_context *ce, u32 *dw)
1612{
1613	return (i915_ggtt_offset(ce->engine->status_page.vma) +
1614		offset_in_page(dw));
1615}
1616
1617static int measure_semaphore_response(struct intel_context *ce)
1618{
1619	u32 *sema = hwsp_scratch(ce);
1620	const u32 offset = hwsp_offset(ce, sema);
1621	u32 elapsed[TF_COUNT], cycles;
1622	struct i915_request *rq;
1623	u32 *cs;
1624	int err;
1625	int i;
1626
1627	/*
1628	 * Measure how many cycles it takes for the HW to detect the change
1629	 * in a semaphore value.
1630	 *
1631	 *    A: read CS_TIMESTAMP from CPU
1632	 *    poke semaphore
1633	 *    B: read CS_TIMESTAMP on GPU
1634	 *
1635	 * Semaphore latency: B - A
1636	 */
1637
1638	semaphore_set(sema, -1);
1639
1640	rq = i915_request_create(ce);
1641	if (IS_ERR(rq))
1642		return PTR_ERR(rq);
1643
1644	cs = intel_ring_begin(rq, 4 + 12 * ARRAY_SIZE(elapsed));
1645	if (IS_ERR(cs)) {
1646		i915_request_add(rq);
1647		err = PTR_ERR(cs);
1648		goto err;
1649	}
1650
1651	cs = emit_store_dw(cs, offset, 0);
1652	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
1653		cs = emit_semaphore_poll_until(cs, offset, i);
1654		cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
1655		cs = emit_store_dw(cs, offset, 0);
1656	}
1657
1658	intel_ring_advance(rq, cs);
1659	i915_request_add(rq);
1660
1661	if (wait_for(READ_ONCE(*sema) == 0, 50)) {
1662		err = -EIO;
1663		goto err;
1664	}
1665
1666	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
1667		preempt_disable();
1668		cycles = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
1669		semaphore_set(sema, i);
1670		preempt_enable();
1671
1672		if (wait_for(READ_ONCE(*sema) == 0, 50)) {
1673			err = -EIO;
1674			goto err;
1675		}
1676
1677		elapsed[i - 1] = sema[i] - cycles;
1678	}
1679
1680	cycles = trifilter(elapsed);
1681	pr_info("%s: semaphore response %d cycles, %lluns\n",
1682		ce->engine->name, cycles >> TF_BIAS,
1683		cycles_to_ns(ce->engine, cycles));
1684
1685	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
1686
1687err:
1688	intel_gt_set_wedged(ce->engine->gt);
1689	return err;
1690}
1691
1692static int measure_idle_dispatch(struct intel_context *ce)
1693{
1694	u32 *sema = hwsp_scratch(ce);
1695	const u32 offset = hwsp_offset(ce, sema);
1696	u32 elapsed[TF_COUNT], cycles;
1697	u32 *cs;
1698	int err;
1699	int i;
1700
1701	/*
1702	 * Measure how long it takes for us to submit a request while the
1703	 * engine is idle, but is resting in our context.
1704	 *
1705	 *    A: read CS_TIMESTAMP from CPU
1706	 *    submit request
1707	 *    B: read CS_TIMESTAMP on GPU
1708	 *
1709	 * Submission latency: B - A
1710	 */
1711
1712	for (i = 0; i < ARRAY_SIZE(elapsed); i++) {
1713		struct i915_request *rq;
1714
1715		err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
1716		if (err)
1717			return err;
1718
1719		rq = i915_request_create(ce);
1720		if (IS_ERR(rq)) {
1721			err = PTR_ERR(rq);
1722			goto err;
1723		}
1724
1725		cs = intel_ring_begin(rq, 4);
1726		if (IS_ERR(cs)) {
1727			i915_request_add(rq);
1728			err = PTR_ERR(cs);
1729			goto err;
1730		}
1731
1732		cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
1733
1734		intel_ring_advance(rq, cs);
1735
1736		preempt_disable();
1737		local_bh_disable();
1738		elapsed[i] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
1739		i915_request_add(rq);
1740		local_bh_enable();
1741		preempt_enable();
1742	}
1743
1744	err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
1745	if (err)
1746		goto err;
1747
1748	for (i = 0; i < ARRAY_SIZE(elapsed); i++)
1749		elapsed[i] = sema[i] - elapsed[i];
1750
1751	cycles = trifilter(elapsed);
1752	pr_info("%s: idle dispatch latency %d cycles, %lluns\n",
1753		ce->engine->name, cycles >> TF_BIAS,
1754		cycles_to_ns(ce->engine, cycles));
1755
1756	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
1757
1758err:
1759	intel_gt_set_wedged(ce->engine->gt);
1760	return err;
1761}
1762
1763static int measure_busy_dispatch(struct intel_context *ce)
1764{
1765	u32 *sema = hwsp_scratch(ce);
1766	const u32 offset = hwsp_offset(ce, sema);
1767	u32 elapsed[TF_COUNT + 1], cycles;
1768	u32 *cs;
1769	int err;
1770	int i;
1771
1772	/*
1773	 * Measure how long it takes for us to submit a request while the
1774	 * engine is busy, polling on a semaphore in our context. With
1775	 * direct submission, this will include the cost of a lite restore.
1776	 *
1777	 *    A: read CS_TIMESTAMP from CPU
1778	 *    submit request
1779	 *    B: read CS_TIMESTAMP on GPU
1780	 *
1781	 * Submission latency: B - A
1782	 */
1783
1784	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
1785		struct i915_request *rq;
1786
1787		rq = i915_request_create(ce);
1788		if (IS_ERR(rq)) {
1789			err = PTR_ERR(rq);
1790			goto err;
1791		}
1792
1793		cs = intel_ring_begin(rq, 12);
1794		if (IS_ERR(cs)) {
1795			i915_request_add(rq);
1796			err = PTR_ERR(cs);
1797			goto err;
1798		}
1799
1800		cs = emit_store_dw(cs, offset + i * sizeof(u32), -1);
1801		cs = emit_semaphore_poll_until(cs, offset, i);
1802		cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
1803
1804		intel_ring_advance(rq, cs);
1805
1806		if (i > 1 && wait_for(READ_ONCE(sema[i - 1]), 500)) {
1807			err = -EIO;
1808			goto err;
1809		}
1810
1811		preempt_disable();
1812		local_bh_disable();
1813		elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
1814		i915_request_add(rq);
1815		local_bh_enable();
1816		semaphore_set(sema, i - 1);
1817		preempt_enable();
1818	}
1819
1820	wait_for(READ_ONCE(sema[i - 1]), 500);
1821	semaphore_set(sema, i - 1);
1822
1823	for (i = 1; i <= TF_COUNT; i++) {
1824		GEM_BUG_ON(sema[i] == -1);
1825		elapsed[i - 1] = sema[i] - elapsed[i];
1826	}
1827
1828	cycles = trifilter(elapsed);
1829	pr_info("%s: busy dispatch latency %d cycles, %lluns\n",
1830		ce->engine->name, cycles >> TF_BIAS,
1831		cycles_to_ns(ce->engine, cycles));
1832
1833	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
1834
1835err:
1836	intel_gt_set_wedged(ce->engine->gt);
1837	return err;
1838}
1839
1840static int plug(struct intel_engine_cs *engine, u32 *sema, u32 mode, int value)
1841{
1842	const u32 offset =
1843		i915_ggtt_offset(engine->status_page.vma) +
1844		offset_in_page(sema);
1845	struct i915_request *rq;
1846	u32 *cs;
1847
1848	rq = i915_request_create(engine->kernel_context);
1849	if (IS_ERR(rq))
1850		return PTR_ERR(rq);
1851
1852	cs = intel_ring_begin(rq, 4);
1853	if (IS_ERR(cs)) {
1854		i915_request_add(rq);
1855		return PTR_ERR(cs);
1856	}
1857
1858	cs = emit_semaphore_poll(cs, mode, value, offset);
1859
1860	intel_ring_advance(rq, cs);
1861	i915_request_add(rq);
1862
1863	return 0;
1864}
1865
1866static int measure_inter_request(struct intel_context *ce)
1867{
1868	u32 *sema = hwsp_scratch(ce);
1869	const u32 offset = hwsp_offset(ce, sema);
1870	u32 elapsed[TF_COUNT + 1], cycles;
1871	struct i915_sw_fence *submit;
1872	int i, err;
1873
1874	/*
1875	 * Measure how long it takes to advance from one request into the
1876	 * next. Between each request we flush the GPU caches to memory,
1877	 * update the breadcrumbs, and then invalidate those caches.
1878	 * We queue up all the requests to be submitted in one batch so
1879	 * it should be one set of contiguous measurements.
1880	 *
1881	 *    A: read CS_TIMESTAMP on GPU
1882	 *    advance request
1883	 *    B: read CS_TIMESTAMP on GPU
1884	 *
1885	 * Request latency: B - A
1886	 */
1887
1888	err = plug(ce->engine, sema, MI_SEMAPHORE_SAD_NEQ_SDD, 0);
1889	if (err)
1890		return err;
1891
1892	submit = heap_fence_create(GFP_KERNEL);
1893	if (!submit) {
1894		semaphore_set(sema, 1);
1895		return -ENOMEM;
1896	}
1897
1898	intel_engine_flush_submission(ce->engine);
1899	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
1900		struct i915_request *rq;
1901		u32 *cs;
1902
1903		rq = i915_request_create(ce);
1904		if (IS_ERR(rq)) {
1905			err = PTR_ERR(rq);
1906			goto err_submit;
1907		}
1908
1909		err = i915_sw_fence_await_sw_fence_gfp(&rq->submit,
1910						       submit,
1911						       GFP_KERNEL);
1912		if (err < 0) {
1913			i915_request_add(rq);
1914			goto err_submit;
1915		}
1916
1917		cs = intel_ring_begin(rq, 4);
1918		if (IS_ERR(cs)) {
1919			i915_request_add(rq);
1920			err = PTR_ERR(cs);
1921			goto err_submit;
1922		}
1923
1924		cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
1925
1926		intel_ring_advance(rq, cs);
1927		i915_request_add(rq);
1928	}
1929	local_bh_disable();
1930	i915_sw_fence_commit(submit);
1931	local_bh_enable();
1932	intel_engine_flush_submission(ce->engine);
1933	heap_fence_put(submit);
1934
1935	semaphore_set(sema, 1);
1936	err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
1937	if (err)
1938		goto err;
1939
1940	for (i = 1; i <= TF_COUNT; i++)
1941		elapsed[i - 1] = sema[i + 1] - sema[i];
1942
1943	cycles = trifilter(elapsed);
1944	pr_info("%s: inter-request latency %d cycles, %lluns\n",
1945		ce->engine->name, cycles >> TF_BIAS,
1946		cycles_to_ns(ce->engine, cycles));
1947
1948	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
1949
1950err_submit:
1951	i915_sw_fence_commit(submit);
1952	heap_fence_put(submit);
1953	semaphore_set(sema, 1);
1954err:
1955	intel_gt_set_wedged(ce->engine->gt);
1956	return err;
1957}
1958
1959static int measure_context_switch(struct intel_context *ce)
1960{
1961	u32 *sema = hwsp_scratch(ce);
1962	const u32 offset = hwsp_offset(ce, sema);
1963	struct i915_request *fence = NULL;
1964	u32 elapsed[TF_COUNT + 1], cycles;
1965	int i, j, err;
1966	u32 *cs;
1967
1968	/*
1969	 * Measure how long it takes to advance from one request in one
1970	 * context to a request in another context. This allows us to
1971	 * measure how long the context save/restore take, along with all
1972	 * the inter-context setup we require.
1973	 *
1974	 *    A: read CS_TIMESTAMP on GPU
1975	 *    switch context
1976	 *    B: read CS_TIMESTAMP on GPU
1977	 *
1978	 * Context switch latency: B - A
1979	 */
1980
1981	err = plug(ce->engine, sema, MI_SEMAPHORE_SAD_NEQ_SDD, 0);
1982	if (err)
1983		return err;
1984
1985	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
1986		struct intel_context *arr[] = {
1987			ce, ce->engine->kernel_context
1988		};
1989		u32 addr = offset + ARRAY_SIZE(arr) * i * sizeof(u32);
1990
1991		for (j = 0; j < ARRAY_SIZE(arr); j++) {
1992			struct i915_request *rq;
1993
1994			rq = i915_request_create(arr[j]);
1995			if (IS_ERR(rq)) {
1996				err = PTR_ERR(rq);
1997				goto err_fence;
1998			}
1999
2000			if (fence) {
2001				err = i915_request_await_dma_fence(rq,
2002								   &fence->fence);
2003				if (err) {
2004					i915_request_add(rq);
2005					goto err_fence;
2006				}
2007			}
2008
2009			cs = intel_ring_begin(rq, 4);
2010			if (IS_ERR(cs)) {
2011				i915_request_add(rq);
2012				err = PTR_ERR(cs);
2013				goto err_fence;
2014			}
2015
2016			cs = emit_timestamp_store(cs, ce, addr);
2017			addr += sizeof(u32);
2018
2019			intel_ring_advance(rq, cs);
2020
2021			i915_request_put(fence);
2022			fence = i915_request_get(rq);
2023
2024			i915_request_add(rq);
2025		}
2026	}
2027	i915_request_put(fence);
2028	intel_engine_flush_submission(ce->engine);
2029
2030	semaphore_set(sema, 1);
2031	err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
2032	if (err)
2033		goto err;
2034
2035	for (i = 1; i <= TF_COUNT; i++)
2036		elapsed[i - 1] = sema[2 * i + 2] - sema[2 * i + 1];
2037
2038	cycles = trifilter(elapsed);
2039	pr_info("%s: context switch latency %d cycles, %lluns\n",
2040		ce->engine->name, cycles >> TF_BIAS,
2041		cycles_to_ns(ce->engine, cycles));
2042
2043	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
2044
2045err_fence:
2046	i915_request_put(fence);
2047	semaphore_set(sema, 1);
2048err:
2049	intel_gt_set_wedged(ce->engine->gt);
2050	return err;
2051}
2052
2053static int measure_preemption(struct intel_context *ce)
2054{
2055	u32 *sema = hwsp_scratch(ce);
2056	const u32 offset = hwsp_offset(ce, sema);
2057	u32 elapsed[TF_COUNT], cycles;
2058	u32 *cs;
2059	int err;
2060	int i;
2061
2062	/*
2063	 * We measure two latencies while triggering preemption. The first
2064	 * latency is how long it takes for us to submit a preempting request.
2065	 * The second latency is how it takes for us to return from the
2066	 * preemption back to the original context.
2067	 *
2068	 *    A: read CS_TIMESTAMP from CPU
2069	 *    submit preemption
2070	 *    B: read CS_TIMESTAMP on GPU (in preempting context)
2071	 *    context switch
2072	 *    C: read CS_TIMESTAMP on GPU (in original context)
2073	 *
2074	 * Preemption dispatch latency: B - A
2075	 * Preemption switch latency: C - B
2076	 */
2077
2078	if (!intel_engine_has_preemption(ce->engine))
2079		return 0;
2080
2081	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
2082		u32 addr = offset + 2 * i * sizeof(u32);
2083		struct i915_request *rq;
2084
2085		rq = i915_request_create(ce);
2086		if (IS_ERR(rq)) {
2087			err = PTR_ERR(rq);
2088			goto err;
2089		}
2090
2091		cs = intel_ring_begin(rq, 12);
2092		if (IS_ERR(cs)) {
2093			i915_request_add(rq);
2094			err = PTR_ERR(cs);
2095			goto err;
2096		}
2097
2098		cs = emit_store_dw(cs, addr, -1);
2099		cs = emit_semaphore_poll_until(cs, offset, i);
2100		cs = emit_timestamp_store(cs, ce, addr + sizeof(u32));
2101
2102		intel_ring_advance(rq, cs);
2103		i915_request_add(rq);
2104
2105		if (wait_for(READ_ONCE(sema[2 * i]) == -1, 500)) {
2106			err = -EIO;
2107			goto err;
2108		}
2109
2110		rq = i915_request_create(ce->engine->kernel_context);
2111		if (IS_ERR(rq)) {
2112			err = PTR_ERR(rq);
2113			goto err;
2114		}
2115
2116		cs = intel_ring_begin(rq, 8);
2117		if (IS_ERR(cs)) {
2118			i915_request_add(rq);
2119			err = PTR_ERR(cs);
2120			goto err;
2121		}
2122
2123		cs = emit_timestamp_store(cs, ce, addr);
2124		cs = emit_store_dw(cs, offset, i);
2125
2126		intel_ring_advance(rq, cs);
2127		rq->sched.attr.priority = I915_PRIORITY_BARRIER;
2128
2129		elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
2130		i915_request_add(rq);
2131	}
2132
2133	if (wait_for(READ_ONCE(sema[2 * i - 2]) != -1, 500)) {
2134		err = -EIO;
2135		goto err;
2136	}
2137
2138	for (i = 1; i <= TF_COUNT; i++)
2139		elapsed[i - 1] = sema[2 * i + 0] - elapsed[i - 1];
2140
2141	cycles = trifilter(elapsed);
2142	pr_info("%s: preemption dispatch latency %d cycles, %lluns\n",
2143		ce->engine->name, cycles >> TF_BIAS,
2144		cycles_to_ns(ce->engine, cycles));
2145
2146	for (i = 1; i <= TF_COUNT; i++)
2147		elapsed[i - 1] = sema[2 * i + 1] - sema[2 * i + 0];
2148
2149	cycles = trifilter(elapsed);
2150	pr_info("%s: preemption switch latency %d cycles, %lluns\n",
2151		ce->engine->name, cycles >> TF_BIAS,
2152		cycles_to_ns(ce->engine, cycles));
2153
2154	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
2155
2156err:
2157	intel_gt_set_wedged(ce->engine->gt);
2158	return err;
2159}
2160
2161struct signal_cb {
2162	struct dma_fence_cb base;
2163	bool seen;
2164};
2165
2166static void signal_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
2167{
2168	struct signal_cb *s = container_of(cb, typeof(*s), base);
2169
2170	smp_store_mb(s->seen, true); /* be safe, be strong */
2171}
2172
2173static int measure_completion(struct intel_context *ce)
2174{
2175	u32 *sema = hwsp_scratch(ce);
2176	const u32 offset = hwsp_offset(ce, sema);
2177	u32 elapsed[TF_COUNT], cycles;
2178	u32 *cs;
2179	int err;
2180	int i;
2181
2182	/*
2183	 * Measure how long it takes for the signal (interrupt) to be
2184	 * sent from the GPU to be processed by the CPU.
2185	 *
2186	 *    A: read CS_TIMESTAMP on GPU
2187	 *    signal
2188	 *    B: read CS_TIMESTAMP from CPU
2189	 *
2190	 * Completion latency: B - A
2191	 */
2192
2193	for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
2194		struct signal_cb cb = { .seen = false };
2195		struct i915_request *rq;
2196
2197		rq = i915_request_create(ce);
2198		if (IS_ERR(rq)) {
2199			err = PTR_ERR(rq);
2200			goto err;
2201		}
2202
2203		cs = intel_ring_begin(rq, 12);
2204		if (IS_ERR(cs)) {
2205			i915_request_add(rq);
2206			err = PTR_ERR(cs);
2207			goto err;
2208		}
2209
2210		cs = emit_store_dw(cs, offset + i * sizeof(u32), -1);
2211		cs = emit_semaphore_poll_until(cs, offset, i);
2212		cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
2213
2214		intel_ring_advance(rq, cs);
2215
2216		dma_fence_add_callback(&rq->fence, &cb.base, signal_cb);
2217
2218		local_bh_disable();
2219		i915_request_add(rq);
2220		local_bh_enable();
2221
2222		if (wait_for(READ_ONCE(sema[i]) == -1, 50)) {
2223			err = -EIO;
2224			goto err;
2225		}
2226
2227		preempt_disable();
2228		semaphore_set(sema, i);
2229		while (!READ_ONCE(cb.seen))
2230			cpu_relax();
2231
2232		elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
2233		preempt_enable();
2234	}
2235
2236	err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
2237	if (err)
2238		goto err;
2239
2240	for (i = 0; i < ARRAY_SIZE(elapsed); i++) {
2241		GEM_BUG_ON(sema[i + 1] == -1);
2242		elapsed[i] = elapsed[i] - sema[i + 1];
2243	}
2244
2245	cycles = trifilter(elapsed);
2246	pr_info("%s: completion latency %d cycles, %lluns\n",
2247		ce->engine->name, cycles >> TF_BIAS,
2248		cycles_to_ns(ce->engine, cycles));
2249
2250	return intel_gt_wait_for_idle(ce->engine->gt, HZ);
2251
2252err:
2253	intel_gt_set_wedged(ce->engine->gt);
2254	return err;
2255}
2256
2257static void rps_pin(struct intel_gt *gt)
2258{
2259	/* Pin the frequency to max */
2260	atomic_inc(&gt->rps.num_waiters);
2261	intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
2262
2263	mutex_lock(&gt->rps.lock);
2264	intel_rps_set(&gt->rps, gt->rps.max_freq);
2265	mutex_unlock(&gt->rps.lock);
2266}
2267
2268static void rps_unpin(struct intel_gt *gt)
2269{
2270	intel_uncore_forcewake_put(gt->uncore, FORCEWAKE_ALL);
2271	atomic_dec(&gt->rps.num_waiters);
2272}
2273
2274static int perf_request_latency(void *arg)
2275{
2276	struct drm_i915_private *i915 = arg;
2277	struct intel_engine_cs *engine;
2278	struct pm_qos_request qos;
2279	int err = 0;
2280
2281	if (INTEL_GEN(i915) < 8) /* per-engine CS timestamp, semaphores */
2282		return 0;
2283
2284	cpu_latency_qos_add_request(&qos, 0); /* disable cstates */
2285
2286	for_each_uabi_engine(engine, i915) {
2287		struct intel_context *ce;
2288
2289		ce = intel_context_create(engine);
2290		if (IS_ERR(ce))
2291			goto out;
2292
2293		err = intel_context_pin(ce);
2294		if (err) {
2295			intel_context_put(ce);
2296			goto out;
2297		}
2298
2299		st_engine_heartbeat_disable(engine);
2300		rps_pin(engine->gt);
2301
2302		if (err == 0)
2303			err = measure_semaphore_response(ce);
2304		if (err == 0)
2305			err = measure_idle_dispatch(ce);
2306		if (err == 0)
2307			err = measure_busy_dispatch(ce);
2308		if (err == 0)
2309			err = measure_inter_request(ce);
2310		if (err == 0)
2311			err = measure_context_switch(ce);
2312		if (err == 0)
2313			err = measure_preemption(ce);
2314		if (err == 0)
2315			err = measure_completion(ce);
2316
2317		rps_unpin(engine->gt);
2318		st_engine_heartbeat_enable(engine);
2319
2320		intel_context_unpin(ce);
2321		intel_context_put(ce);
2322		if (err)
2323			goto out;
2324	}
2325
2326out:
2327	if (igt_flush_test(i915))
2328		err = -EIO;
2329
2330	cpu_latency_qos_remove_request(&qos);
2331	return err;
2332}
2333
2334static int s_sync0(void *arg)
2335{
2336	struct perf_series *ps = arg;
2337	IGT_TIMEOUT(end_time);
2338	unsigned int idx = 0;
2339	int err = 0;
2340
2341	GEM_BUG_ON(!ps->nengines);
2342	do {
2343		struct i915_request *rq;
2344
2345		rq = i915_request_create(ps->ce[idx]);
2346		if (IS_ERR(rq)) {
2347			err = PTR_ERR(rq);
2348			break;
2349		}
2350
2351		i915_request_get(rq);
2352		i915_request_add(rq);
2353
2354		if (i915_request_wait(rq, 0, HZ / 5) < 0)
2355			err = -ETIME;
2356		i915_request_put(rq);
2357		if (err)
2358			break;
2359
2360		if (++idx == ps->nengines)
2361			idx = 0;
2362	} while (!__igt_timeout(end_time, NULL));
2363
2364	return err;
2365}
2366
2367static int s_sync1(void *arg)
2368{
2369	struct perf_series *ps = arg;
2370	struct i915_request *prev = NULL;
2371	IGT_TIMEOUT(end_time);
2372	unsigned int idx = 0;
2373	int err = 0;
2374
2375	GEM_BUG_ON(!ps->nengines);
2376	do {
2377		struct i915_request *rq;
2378
2379		rq = i915_request_create(ps->ce[idx]);
2380		if (IS_ERR(rq)) {
2381			err = PTR_ERR(rq);
2382			break;
2383		}
2384
2385		i915_request_get(rq);
2386		i915_request_add(rq);
2387
2388		if (prev && i915_request_wait(prev, 0, HZ / 5) < 0)
2389			err = -ETIME;
2390		i915_request_put(prev);
2391		prev = rq;
2392		if (err)
2393			break;
2394
2395		if (++idx == ps->nengines)
2396			idx = 0;
2397	} while (!__igt_timeout(end_time, NULL));
2398	i915_request_put(prev);
2399
2400	return err;
2401}
2402
2403static int s_many(void *arg)
2404{
2405	struct perf_series *ps = arg;
2406	IGT_TIMEOUT(end_time);
2407	unsigned int idx = 0;
2408
2409	GEM_BUG_ON(!ps->nengines);
2410	do {
2411		struct i915_request *rq;
2412
2413		rq = i915_request_create(ps->ce[idx]);
2414		if (IS_ERR(rq))
2415			return PTR_ERR(rq);
2416
2417		i915_request_add(rq);
2418
2419		if (++idx == ps->nengines)
2420			idx = 0;
2421	} while (!__igt_timeout(end_time, NULL));
2422
2423	return 0;
2424}
2425
2426static int perf_series_engines(void *arg)
2427{
2428	struct drm_i915_private *i915 = arg;
2429	static int (* const func[])(void *arg) = {
2430		s_sync0,
2431		s_sync1,
2432		s_many,
2433		NULL,
2434	};
2435	const unsigned int nengines = num_uabi_engines(i915);
2436	struct intel_engine_cs *engine;
2437	int (* const *fn)(void *arg);
2438	struct pm_qos_request qos;
2439	struct perf_stats *stats;
2440	struct perf_series *ps;
2441	unsigned int idx;
2442	int err = 0;
2443
2444	stats = kcalloc(nengines, sizeof(*stats), GFP_KERNEL);
2445	if (!stats)
2446		return -ENOMEM;
2447
2448	ps = kzalloc(struct_size(ps, ce, nengines), GFP_KERNEL);
2449	if (!ps) {
2450		kfree(stats);
2451		return -ENOMEM;
2452	}
2453
2454	cpu_latency_qos_add_request(&qos, 0); /* disable cstates */
2455
2456	ps->i915 = i915;
2457	ps->nengines = nengines;
2458
2459	idx = 0;
2460	for_each_uabi_engine(engine, i915) {
2461		struct intel_context *ce;
2462
2463		ce = intel_context_create(engine);
2464		if (IS_ERR(ce))
2465			goto out;
2466
2467		err = intel_context_pin(ce);
2468		if (err) {
2469			intel_context_put(ce);
2470			goto out;
2471		}
2472
2473		ps->ce[idx++] = ce;
2474	}
2475	GEM_BUG_ON(idx != ps->nengines);
2476
2477	for (fn = func; *fn && !err; fn++) {
2478		char name[KSYM_NAME_LEN];
2479		struct igt_live_test t;
2480
2481		snprintf(name, sizeof(name), "%ps", *fn);
2482		err = igt_live_test_begin(&t, i915, __func__, name);
2483		if (err)
2484			break;
2485
2486		for (idx = 0; idx < nengines; idx++) {
2487			struct perf_stats *p =
2488				memset(&stats[idx], 0, sizeof(stats[idx]));
2489			struct intel_context *ce = ps->ce[idx];
2490
2491			p->engine = ps->ce[idx]->engine;
2492			intel_engine_pm_get(p->engine);
2493
2494			if (intel_engine_supports_stats(p->engine))
2495				p->busy = intel_engine_get_busy_time(p->engine,
2496								     &p->time) + 1;
2497			else
2498				p->time = ktime_get();
2499			p->runtime = -intel_context_get_total_runtime_ns(ce);
2500		}
2501
2502		err = (*fn)(ps);
2503		if (igt_live_test_end(&t))
2504			err = -EIO;
2505
2506		for (idx = 0; idx < nengines; idx++) {
2507			struct perf_stats *p = &stats[idx];
2508			struct intel_context *ce = ps->ce[idx];
2509			int integer, decimal;
2510			u64 busy, dt, now;
2511
2512			if (p->busy)
2513				p->busy = ktime_sub(intel_engine_get_busy_time(p->engine,
2514									       &now),
2515						    p->busy - 1);
2516			else
2517				now = ktime_get();
2518			p->time = ktime_sub(now, p->time);
2519
2520			err = switch_to_kernel_sync(ce, err);
2521			p->runtime += intel_context_get_total_runtime_ns(ce);
2522			intel_engine_pm_put(p->engine);
2523
2524			busy = 100 * ktime_to_ns(p->busy);
2525			dt = ktime_to_ns(p->time);
2526			if (dt) {
2527				integer = div64_u64(busy, dt);
2528				busy -= integer * dt;
2529				decimal = div64_u64(100 * busy, dt);
2530			} else {
2531				integer = 0;
2532				decimal = 0;
2533			}
2534
2535			pr_info("%s %5s: { seqno:%d, busy:%d.%02d%%, runtime:%lldms, walltime:%lldms }\n",
2536				name, p->engine->name, ce->timeline->seqno,
2537				integer, decimal,
2538				div_u64(p->runtime, 1000 * 1000),
2539				div_u64(ktime_to_ns(p->time), 1000 * 1000));
2540		}
2541	}
2542
2543out:
2544	for (idx = 0; idx < nengines; idx++) {
2545		if (IS_ERR_OR_NULL(ps->ce[idx]))
2546			break;
2547
2548		intel_context_unpin(ps->ce[idx]);
2549		intel_context_put(ps->ce[idx]);
2550	}
2551	kfree(ps);
2552
2553	cpu_latency_qos_remove_request(&qos);
2554	kfree(stats);
2555	return err;
2556}
2557
2558static int p_sync0(void *arg)
2559{
2560	struct perf_stats *p = arg;
2561	struct intel_engine_cs *engine = p->engine;
2562	struct intel_context *ce;
2563	IGT_TIMEOUT(end_time);
2564	unsigned long count;
2565	bool busy;
2566	int err = 0;
2567
2568	ce = intel_context_create(engine);
2569	if (IS_ERR(ce))
2570		return PTR_ERR(ce);
2571
2572	err = intel_context_pin(ce);
2573	if (err) {
2574		intel_context_put(ce);
2575		return err;
2576	}
2577
2578	if (intel_engine_supports_stats(engine)) {
2579		p->busy = intel_engine_get_busy_time(engine, &p->time);
2580		busy = true;
2581	} else {
2582		p->time = ktime_get();
2583		busy = false;
2584	}
2585
2586	count = 0;
2587	do {
2588		struct i915_request *rq;
2589
2590		rq = i915_request_create(ce);
2591		if (IS_ERR(rq)) {
2592			err = PTR_ERR(rq);
2593			break;
2594		}
2595
2596		i915_request_get(rq);
2597		i915_request_add(rq);
2598
2599		err = 0;
2600		if (i915_request_wait(rq, 0, HZ / 5) < 0)
2601			err = -ETIME;
2602		i915_request_put(rq);
2603		if (err)
2604			break;
2605
2606		count++;
2607	} while (!__igt_timeout(end_time, NULL));
2608
2609	if (busy) {
2610		ktime_t now;
2611
2612		p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
2613				    p->busy);
2614		p->time = ktime_sub(now, p->time);
2615	} else {
2616		p->time = ktime_sub(ktime_get(), p->time);
2617	}
2618
2619	err = switch_to_kernel_sync(ce, err);
2620	p->runtime = intel_context_get_total_runtime_ns(ce);
2621	p->count = count;
2622
2623	intel_context_unpin(ce);
2624	intel_context_put(ce);
2625	return err;
2626}
2627
2628static int p_sync1(void *arg)
2629{
2630	struct perf_stats *p = arg;
2631	struct intel_engine_cs *engine = p->engine;
2632	struct i915_request *prev = NULL;
2633	struct intel_context *ce;
2634	IGT_TIMEOUT(end_time);
2635	unsigned long count;
2636	bool busy;
2637	int err = 0;
2638
2639	ce = intel_context_create(engine);
2640	if (IS_ERR(ce))
2641		return PTR_ERR(ce);
2642
2643	err = intel_context_pin(ce);
2644	if (err) {
2645		intel_context_put(ce);
2646		return err;
2647	}
2648
2649	if (intel_engine_supports_stats(engine)) {
2650		p->busy = intel_engine_get_busy_time(engine, &p->time);
2651		busy = true;
2652	} else {
2653		p->time = ktime_get();
2654		busy = false;
2655	}
2656
2657	count = 0;
2658	do {
2659		struct i915_request *rq;
2660
2661		rq = i915_request_create(ce);
2662		if (IS_ERR(rq)) {
2663			err = PTR_ERR(rq);
2664			break;
2665		}
2666
2667		i915_request_get(rq);
2668		i915_request_add(rq);
2669
2670		err = 0;
2671		if (prev && i915_request_wait(prev, 0, HZ / 5) < 0)
2672			err = -ETIME;
2673		i915_request_put(prev);
2674		prev = rq;
2675		if (err)
2676			break;
2677
2678		count++;
2679	} while (!__igt_timeout(end_time, NULL));
2680	i915_request_put(prev);
2681
2682	if (busy) {
2683		ktime_t now;
2684
2685		p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
2686				    p->busy);
2687		p->time = ktime_sub(now, p->time);
2688	} else {
2689		p->time = ktime_sub(ktime_get(), p->time);
2690	}
2691
2692	err = switch_to_kernel_sync(ce, err);
2693	p->runtime = intel_context_get_total_runtime_ns(ce);
2694	p->count = count;
2695
2696	intel_context_unpin(ce);
2697	intel_context_put(ce);
2698	return err;
2699}
2700
2701static int p_many(void *arg)
2702{
2703	struct perf_stats *p = arg;
2704	struct intel_engine_cs *engine = p->engine;
2705	struct intel_context *ce;
2706	IGT_TIMEOUT(end_time);
2707	unsigned long count;
2708	int err = 0;
2709	bool busy;
2710
2711	ce = intel_context_create(engine);
2712	if (IS_ERR(ce))
2713		return PTR_ERR(ce);
2714
2715	err = intel_context_pin(ce);
2716	if (err) {
2717		intel_context_put(ce);
2718		return err;
2719	}
2720
2721	if (intel_engine_supports_stats(engine)) {
2722		p->busy = intel_engine_get_busy_time(engine, &p->time);
2723		busy = true;
2724	} else {
2725		p->time = ktime_get();
2726		busy = false;
2727	}
2728
2729	count = 0;
2730	do {
2731		struct i915_request *rq;
2732
2733		rq = i915_request_create(ce);
2734		if (IS_ERR(rq)) {
2735			err = PTR_ERR(rq);
2736			break;
2737		}
2738
2739		i915_request_add(rq);
2740		count++;
2741	} while (!__igt_timeout(end_time, NULL));
2742
2743	if (busy) {
2744		ktime_t now;
2745
2746		p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
2747				    p->busy);
2748		p->time = ktime_sub(now, p->time);
2749	} else {
2750		p->time = ktime_sub(ktime_get(), p->time);
2751	}
2752
2753	err = switch_to_kernel_sync(ce, err);
2754	p->runtime = intel_context_get_total_runtime_ns(ce);
2755	p->count = count;
2756
2757	intel_context_unpin(ce);
2758	intel_context_put(ce);
2759	return err;
2760}
2761
2762static int perf_parallel_engines(void *arg)
2763{
2764	struct drm_i915_private *i915 = arg;
2765	static int (* const func[])(void *arg) = {
2766		p_sync0,
2767		p_sync1,
2768		p_many,
2769		NULL,
2770	};
2771	const unsigned int nengines = num_uabi_engines(i915);
2772	struct intel_engine_cs *engine;
2773	int (* const *fn)(void *arg);
2774	struct pm_qos_request qos;
2775	struct {
2776		struct perf_stats p;
2777		struct task_struct *tsk;
2778	} *engines;
2779	int err = 0;
2780
2781	engines = kcalloc(nengines, sizeof(*engines), GFP_KERNEL);
2782	if (!engines)
2783		return -ENOMEM;
2784
2785	cpu_latency_qos_add_request(&qos, 0);
2786
2787	for (fn = func; *fn; fn++) {
2788		char name[KSYM_NAME_LEN];
2789		struct igt_live_test t;
2790		unsigned int idx;
2791
2792		snprintf(name, sizeof(name), "%ps", *fn);
2793		err = igt_live_test_begin(&t, i915, __func__, name);
2794		if (err)
2795			break;
2796
2797		atomic_set(&i915->selftest.counter, nengines);
2798
2799		idx = 0;
2800		for_each_uabi_engine(engine, i915) {
2801			intel_engine_pm_get(engine);
2802
2803			memset(&engines[idx].p, 0, sizeof(engines[idx].p));
2804			engines[idx].p.engine = engine;
2805
2806			engines[idx].tsk = kthread_run(*fn, &engines[idx].p,
2807						       "igt:%s", engine->name);
2808			if (IS_ERR(engines[idx].tsk)) {
2809				err = PTR_ERR(engines[idx].tsk);
2810				intel_engine_pm_put(engine);
2811				break;
2812			}
2813			get_task_struct(engines[idx++].tsk);
2814		}
2815
2816		yield(); /* start all threads before we kthread_stop() */
2817
2818		idx = 0;
2819		for_each_uabi_engine(engine, i915) {
2820			int status;
2821
2822			if (IS_ERR(engines[idx].tsk))
2823				break;
2824
2825			status = kthread_stop(engines[idx].tsk);
2826			if (status && !err)
2827				err = status;
2828
2829			intel_engine_pm_put(engine);
2830			put_task_struct(engines[idx++].tsk);
2831		}
2832
2833		if (igt_live_test_end(&t))
2834			err = -EIO;
2835		if (err)
2836			break;
2837
2838		idx = 0;
2839		for_each_uabi_engine(engine, i915) {
2840			struct perf_stats *p = &engines[idx].p;
2841			u64 busy = 100 * ktime_to_ns(p->busy);
2842			u64 dt = ktime_to_ns(p->time);
2843			int integer, decimal;
2844
2845			if (dt) {
2846				integer = div64_u64(busy, dt);
2847				busy -= integer * dt;
2848				decimal = div64_u64(100 * busy, dt);
2849			} else {
2850				integer = 0;
2851				decimal = 0;
2852			}
2853
2854			GEM_BUG_ON(engine != p->engine);
2855			pr_info("%s %5s: { count:%lu, busy:%d.%02d%%, runtime:%lldms, walltime:%lldms }\n",
2856				name, engine->name, p->count, integer, decimal,
2857				div_u64(p->runtime, 1000 * 1000),
2858				div_u64(ktime_to_ns(p->time), 1000 * 1000));
2859			idx++;
2860		}
2861	}
2862
2863	cpu_latency_qos_remove_request(&qos);
2864	kfree(engines);
2865	return err;
2866}
2867
2868int i915_request_perf_selftests(struct drm_i915_private *i915)
2869{
2870	static const struct i915_subtest tests[] = {
2871		SUBTEST(perf_request_latency),
2872		SUBTEST(perf_series_engines),
2873		SUBTEST(perf_parallel_engines),
2874	};
2875
2876	if (intel_gt_is_wedged(&i915->gt))
2877		return 0;
2878
2879	return i915_subtests(tests, i915);
2880}