intel_ring_submission.c 34.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * Copyright © 2008-2010 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Authors:
 *    Eric Anholt <eric@anholt.net>
 *    Zou Nan hai <nanhai.zou@intel.com>
 *    Xiang Hai hao<haihao.xiang@intel.com>
 *
 */

30 31
#include "gen2_engine_cs.h"
#include "gen6_engine_cs.h"
32
#include "gen6_ppgtt.h"
33
#include "gen7_renderclear.h"
34
#include "i915_drv.h"
35
#include "intel_context.h"
36
#include "intel_gt.h"
37
#include "intel_reset.h"
38
#include "intel_ring.h"
39
#include "shmem_utils.h"
40

41 42 43 44 45
/* Rough estimate of the typical request size, performing a flush,
 * set-context and then emitting the batch.
 */
#define LEGACY_REQUEST_SIZE 200

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
static void set_hwstam(struct intel_engine_cs *engine, u32 mask)
{
	/*
	 * Keep the render interrupt unmasked as this papers over
	 * lost interrupts following a reset.
	 */
	if (engine->class == RENDER_CLASS) {
		if (INTEL_GEN(engine->i915) >= 6)
			mask &= ~BIT(0);
		else
			mask &= ~I915_USER_INTERRUPT;
	}

	intel_engine_set_hwsp_writemask(engine, mask);
}

static void set_hws_pga(struct intel_engine_cs *engine, phys_addr_t phys)
63 64 65
{
	u32 addr;

66
	addr = lower_32_bits(phys);
67
	if (INTEL_GEN(engine->i915) >= 4)
68 69
		addr |= (phys >> 28) & 0xf0;

70
	intel_uncore_write(engine->uncore, HWS_PGA, addr);
71 72
}

73
static struct page *status_page(struct intel_engine_cs *engine)
74
{
75
	struct drm_i915_gem_object *obj = engine->status_page.vma->obj;
76

77 78 79 80 81 82 83
	GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
	return sg_page(obj->mm.pages->sgl);
}

static void ring_setup_phys_status_page(struct intel_engine_cs *engine)
{
	set_hws_pga(engine, PFN_PHYS(page_to_pfn(status_page(engine))));
84 85 86 87
	set_hwstam(engine, ~0u);
}

static void set_hwsp(struct intel_engine_cs *engine, u32 offset)
88
{
89
	i915_reg_t hwsp;
90

91 92
	/*
	 * The ring status page addresses are no longer next to the rest of
93 94
	 * the ring registers as of gen7.
	 */
95
	if (IS_GEN(engine->i915, 7)) {
96
		switch (engine->id) {
97 98 99 100 101 102
		/*
		 * No more rings exist on Gen7. Default case is only to shut up
		 * gcc switch check warning.
		 */
		default:
			GEM_BUG_ON(engine->id);
103 104
			/* fallthrough */
		case RCS0:
105
			hwsp = RENDER_HWS_PGA_GEN7;
106
			break;
107
		case BCS0:
108
			hwsp = BLT_HWS_PGA_GEN7;
109
			break;
110
		case VCS0:
111
			hwsp = BSD_HWS_PGA_GEN7;
112
			break;
113
		case VECS0:
114
			hwsp = VEBOX_HWS_PGA_GEN7;
115 116
			break;
		}
117
	} else if (IS_GEN(engine->i915, 6)) {
118
		hwsp = RING_HWS_PGA_GEN6(engine->mmio_base);
119
	} else {
120
		hwsp = RING_HWS_PGA(engine->mmio_base);
121
	}
122

123 124
	intel_uncore_write(engine->uncore, hwsp, offset);
	intel_uncore_posting_read(engine->uncore, hwsp);
125
}
126

127 128 129 130 131 132 133 134
static void flush_cs_tlb(struct intel_engine_cs *engine)
{
	struct drm_i915_private *dev_priv = engine->i915;

	if (!IS_GEN_RANGE(dev_priv, 6, 7))
		return;

	/* ring should be idle before issuing a sync flush*/
135 136
	drm_WARN_ON(&dev_priv->drm,
		    (ENGINE_READ(engine, RING_MI_MODE) & MODE_IDLE) == 0);
137 138 139 140 141 142 143

	ENGINE_WRITE(engine, RING_INSTPM,
		     _MASKED_BIT_ENABLE(INSTPM_TLB_INVALIDATE |
					INSTPM_SYNC_FLUSH));
	if (intel_wait_for_register(engine->uncore,
				    RING_INSTPM(engine->mmio_base),
				    INSTPM_SYNC_FLUSH, 0,
144
				    1000))
145 146 147
		drm_err(&dev_priv->drm,
			"%s: wait for SyncFlush to complete for TLB invalidation timed out\n",
			engine->name);
148
}
149

150 151
static void ring_setup_status_page(struct intel_engine_cs *engine)
{
152
	set_hwsp(engine, i915_ggtt_offset(engine->status_page.vma));
153
	set_hwstam(engine, ~0u);
154

155
	flush_cs_tlb(engine);
156 157
}

158
static bool stop_ring(struct intel_engine_cs *engine)
159
{
160
	struct drm_i915_private *dev_priv = engine->i915;
161

162
	if (INTEL_GEN(dev_priv) > 2) {
163 164 165
		ENGINE_WRITE(engine,
			     RING_MI_MODE, _MASKED_BIT_ENABLE(STOP_RING));
		if (intel_wait_for_register(engine->uncore,
166 167 168 169
					    RING_MI_MODE(engine->mmio_base),
					    MODE_IDLE,
					    MODE_IDLE,
					    1000)) {
170 171 172
			drm_err(&dev_priv->drm,
				"%s : timed out trying to stop ring\n",
				engine->name);
173 174 175

			/*
			 * Sometimes we observe that the idle flag is not
176 177 178
			 * set even though the ring is empty. So double
			 * check before giving up.
			 */
179 180
			if (ENGINE_READ(engine, RING_HEAD) !=
			    ENGINE_READ(engine, RING_TAIL))
181
				return false;
182 183
		}
	}
184

185
	ENGINE_WRITE(engine, RING_HEAD, ENGINE_READ(engine, RING_TAIL));
186

187 188
	ENGINE_WRITE(engine, RING_HEAD, 0);
	ENGINE_WRITE(engine, RING_TAIL, 0);
189

190
	/* The ring must be empty before it is disabled */
191
	ENGINE_WRITE(engine, RING_CTL, 0);
192

193
	return (ENGINE_READ(engine, RING_HEAD) & HEAD_ADDR) == 0;
194
}
195

196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
static struct i915_address_space *vm_alias(struct i915_address_space *vm)
{
	if (i915_is_ggtt(vm))
		vm = &i915_vm_to_ggtt(vm)->alias->vm;

	return vm;
}

static void set_pp_dir(struct intel_engine_cs *engine)
{
	struct i915_address_space *vm = vm_alias(engine->gt->vm);

	if (vm) {
		struct i915_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);

		ENGINE_WRITE(engine, RING_PP_DIR_DCLV, PP_DIR_DCLV_2G);
		ENGINE_WRITE(engine, RING_PP_DIR_BASE,
			     px_base(ppgtt->pd)->ggtt_offset << 10);
	}
}

217
static int xcs_resume(struct intel_engine_cs *engine)
218
{
219
	struct drm_i915_private *dev_priv = engine->i915;
220
	struct intel_ring *ring = engine->legacy.ring;
221 222
	int ret = 0;

223 224
	ENGINE_TRACE(engine, "ring:{HEAD:%04x, TAIL:%04x}\n",
		     ring->head, ring->tail);
225

226
	intel_uncore_forcewake_get(engine->uncore, FORCEWAKE_ALL);
227

228
	/* WaClearRingBufHeadRegAtInit:ctg,elk */
229
	if (!stop_ring(engine)) {
230
		/* G45 ring initialization often fails to reset head to zero */
231 232 233 234 235 236 237 238 239 240 241
		drm_dbg(&dev_priv->drm, "%s head not reset to zero "
			"ctl %08x head %08x tail %08x start %08x\n",
			engine->name,
			ENGINE_READ(engine, RING_CTL),
			ENGINE_READ(engine, RING_HEAD),
			ENGINE_READ(engine, RING_TAIL),
			ENGINE_READ(engine, RING_START));

		if (!stop_ring(engine)) {
			drm_err(&dev_priv->drm,
				"failed to set %s head to zero "
242 243
				"ctl %08x head %08x tail %08x start %08x\n",
				engine->name,
244 245 246 247
				ENGINE_READ(engine, RING_CTL),
				ENGINE_READ(engine, RING_HEAD),
				ENGINE_READ(engine, RING_TAIL),
				ENGINE_READ(engine, RING_START));
248 249
			ret = -EIO;
			goto out;
250
		}
251 252
	}

253
	if (HWS_NEEDS_PHYSICAL(dev_priv))
254
		ring_setup_phys_status_page(engine);
255
	else
256
		ring_setup_status_page(engine);
257

258
	intel_engine_reset_breadcrumbs(engine);
259

260
	/* Enforce ordering by reading HEAD register back */
261
	ENGINE_POSTING_READ(engine, RING_HEAD);
262

263 264
	/*
	 * Initialize the ring. This must happen _after_ we've cleared the ring
265 266
	 * registers with the above sequence (the readback of the HEAD registers
	 * also enforces ordering), otherwise the hw might lose the new ring
267 268
	 * register values.
	 */
269
	ENGINE_WRITE(engine, RING_START, i915_ggtt_offset(ring->vma));
270

271 272 273
	/* Check that the ring offsets point within the ring! */
	GEM_BUG_ON(!intel_ring_offset_valid(ring, ring->head));
	GEM_BUG_ON(!intel_ring_offset_valid(ring, ring->tail));
274
	intel_ring_update_space(ring);
C
Chris Wilson 已提交
275

276 277
	set_pp_dir(engine);

C
Chris Wilson 已提交
278
	/* First wake the ring up to an empty/idle ring */
279 280 281
	ENGINE_WRITE(engine, RING_HEAD, ring->head);
	ENGINE_WRITE(engine, RING_TAIL, ring->head);
	ENGINE_POSTING_READ(engine, RING_TAIL);
282

283
	ENGINE_WRITE(engine, RING_CTL, RING_CTL_SIZE(ring->size) | RING_VALID);
284 285

	/* If the head is still not zero, the ring is dead */
286
	if (intel_wait_for_register(engine->uncore,
287
				    RING_CTL(engine->mmio_base),
288 289
				    RING_VALID, RING_VALID,
				    50)) {
290
		drm_err(&dev_priv->drm, "%s initialization failed "
291
			  "ctl %08x (valid? %d) head %08x [%08x] tail %08x [%08x] start %08x [expected %08x]\n",
292
			  engine->name,
293 294 295 296 297
			  ENGINE_READ(engine, RING_CTL),
			  ENGINE_READ(engine, RING_CTL) & RING_VALID,
			  ENGINE_READ(engine, RING_HEAD), ring->head,
			  ENGINE_READ(engine, RING_TAIL), ring->tail,
			  ENGINE_READ(engine, RING_START),
298
			  i915_ggtt_offset(ring->vma));
299 300
		ret = -EIO;
		goto out;
301 302
	}

303
	if (INTEL_GEN(dev_priv) > 2)
304 305
		ENGINE_WRITE(engine,
			     RING_MI_MODE, _MASKED_BIT_DISABLE(STOP_RING));
306

C
Chris Wilson 已提交
307 308
	/* Now awake, let it get started */
	if (ring->tail != ring->head) {
309 310
		ENGINE_WRITE(engine, RING_TAIL, ring->tail);
		ENGINE_POSTING_READ(engine, RING_TAIL);
C
Chris Wilson 已提交
311 312
	}

313
	/* Papering over lost _interrupts_ immediately following the restart */
314
	intel_engine_signal_breadcrumbs(engine);
315
out:
316
	intel_uncore_forcewake_put(engine->uncore, FORCEWAKE_ALL);
317 318

	return ret;
319 320
}

321
static void reset_prepare(struct intel_engine_cs *engine)
322
{
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
	struct intel_uncore *uncore = engine->uncore;
	const u32 base = engine->mmio_base;

	/*
	 * We stop engines, otherwise we might get failed reset and a
	 * dead gpu (on elk). Also as modern gpu as kbl can suffer
	 * from system hang if batchbuffer is progressing when
	 * the reset is issued, regardless of READY_TO_RESET ack.
	 * Thus assume it is best to stop engines on all gens
	 * where we have a gpu reset.
	 *
	 * WaKBLVECSSemaphoreWaitPoll:kbl (on ALL_ENGINES)
	 *
	 * WaMediaResetMainRingCleanup:ctg,elk (presumably)
	 *
	 * FIXME: Wa for more modern gens needs to be validated
	 */
340
	ENGINE_TRACE(engine, "\n");
341 342

	if (intel_engine_stop_cs(engine))
343
		ENGINE_TRACE(engine, "timed out on STOP_RING\n");
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

	intel_uncore_write_fw(uncore,
			      RING_HEAD(base),
			      intel_uncore_read_fw(uncore, RING_TAIL(base)));
	intel_uncore_posting_read_fw(uncore, RING_HEAD(base)); /* paranoia */

	intel_uncore_write_fw(uncore, RING_HEAD(base), 0);
	intel_uncore_write_fw(uncore, RING_TAIL(base), 0);
	intel_uncore_posting_read_fw(uncore, RING_TAIL(base));

	/* The ring must be empty before it is disabled */
	intel_uncore_write_fw(uncore, RING_CTL(base), 0);

	/* Check acts as a post */
	if (intel_uncore_read_fw(uncore, RING_HEAD(base)))
359 360
		ENGINE_TRACE(engine, "ring head [%x] not parked\n",
			     intel_uncore_read_fw(uncore, RING_HEAD(base)));
361 362
}

363
static void reset_rewind(struct intel_engine_cs *engine, bool stalled)
364
{
365 366
	struct i915_request *pos, *rq;
	unsigned long flags;
367
	u32 head;
368

369
	rq = NULL;
370 371
	spin_lock_irqsave(&engine->active.lock, flags);
	list_for_each_entry(pos, &engine->active.requests, sched.link) {
372
		if (!i915_request_completed(pos)) {
373 374 375
			rq = pos;
			break;
		}
376
	}
377 378

	/*
379
	 * The guilty request will get skipped on a hung engine.
380
	 *
381 382 383 384 385 386 387 388 389 390 391 392 393
	 * Users of client default contexts do not rely on logical
	 * state preserved between batches so it is safe to execute
	 * queued requests following the hang. Non default contexts
	 * rely on preserved state, so skipping a batch loses the
	 * evolution of the state and it needs to be considered corrupted.
	 * Executing more queued batches on top of corrupted state is
	 * risky. But we take the risk by trying to advance through
	 * the queued requests in order to make the client behaviour
	 * more predictable around resets, by not throwing away random
	 * amount of batches it has prepared for execution. Sophisticated
	 * clients can use gem_reset_stats_ioctl and dma fence status
	 * (exported via sync_file info ioctl on explicit fences) to observe
	 * when it loses the context state and should rebuild accordingly.
394
	 *
395 396 397
	 * The context ban, and ultimately the client ban, mechanism are safety
	 * valves if client submission ends up resulting in nothing more than
	 * subsequent hangs.
398
	 */
399

400
	if (rq) {
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
		/*
		 * Try to restore the logical GPU state to match the
		 * continuation of the request queue. If we skip the
		 * context/PD restore, then the next request may try to execute
		 * assuming that its context is valid and loaded on the GPU and
		 * so may try to access invalid memory, prompting repeated GPU
		 * hangs.
		 *
		 * If the request was guilty, we still restore the logical
		 * state in case the next request requires it (e.g. the
		 * aliasing ppgtt), but skip over the hung batch.
		 *
		 * If the request was innocent, we try to replay the request
		 * with the restored context.
		 */
416
		__i915_request_reset(rq, stalled);
417

418
		GEM_BUG_ON(rq->ring != engine->legacy.ring);
419 420
		head = rq->head;
	} else {
421
		head = engine->legacy.ring->tail;
422
	}
423
	engine->legacy.ring->head = intel_ring_wrap(engine->legacy.ring, head);
424

425
	spin_unlock_irqrestore(&engine->active.lock, flags);
426 427
}

428 429 430 431
static void reset_finish(struct intel_engine_cs *engine)
{
}

432
static void reset_cancel(struct intel_engine_cs *engine)
433
{
434
	struct i915_request *request;
435 436
	unsigned long flags;

437
	spin_lock_irqsave(&engine->active.lock, flags);
438 439

	/* Mark all submitted requests as skipped. */
440
	list_for_each_entry(request, &engine->active.requests, sched.link) {
441
		i915_request_set_error_once(request, -EIO);
442
		i915_request_mark_complete(request);
443
	}
444

445 446
	/* Remaining _unready_ requests will be nop'ed when submitted */

447
	spin_unlock_irqrestore(&engine->active.lock, flags);
448 449
}

450
static void i9xx_submit_request(struct i915_request *request)
451
{
452
	i915_request_submit(request);
453
	wmb(); /* paranoid flush writes out of the WCB before mmio */
454

455 456
	ENGINE_WRITE(request->engine, RING_TAIL,
		     intel_ring_set_tail(request->ring, request->tail));
457 458
}

459 460
static void __ring_context_fini(struct intel_context *ce)
{
461
	i915_vma_put(ce->state);
462 463
}

464
static void ring_context_destroy(struct kref *ref)
465
{
466 467
	struct intel_context *ce = container_of(ref, typeof(*ce), ref);

468
	GEM_BUG_ON(intel_context_is_pinned(ce));
469

470 471
	if (ce->state)
		__ring_context_fini(ce);
472

473
	intel_context_fini(ce);
474
	intel_context_free(ce);
475 476
}

477
static int __context_pin_ppgtt(struct intel_context *ce)
478
{
479
	struct i915_address_space *vm;
480 481
	int err = 0;

482
	vm = vm_alias(ce->vm);
483 484
	if (vm)
		err = gen6_ppgtt_pin(i915_vm_to_ppgtt((vm)));
485 486 487 488

	return err;
}

489
static void __context_unpin_ppgtt(struct intel_context *ce)
490
{
491
	struct i915_address_space *vm;
492

493
	vm = vm_alias(ce->vm);
494 495
	if (vm)
		gen6_ppgtt_unpin(i915_vm_to_ppgtt(vm));
496 497
}

498
static void ring_context_unpin(struct intel_context *ce)
499
{
500
	__context_unpin_ppgtt(ce);
501 502
}

503 504 505 506 507 508
static struct i915_vma *
alloc_context_vma(struct intel_engine_cs *engine)
{
	struct drm_i915_private *i915 = engine->i915;
	struct drm_i915_gem_object *obj;
	struct i915_vma *vma;
509
	int err;
510

511
	obj = i915_gem_object_create_shmem(i915, engine->context_size);
512 513 514
	if (IS_ERR(obj))
		return ERR_CAST(obj);

515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
	/*
	 * Try to make the context utilize L3 as well as LLC.
	 *
	 * On VLV we don't have L3 controls in the PTEs so we
	 * shouldn't touch the cache level, especially as that
	 * would make the object snooped which might have a
	 * negative performance impact.
	 *
	 * Snooping is required on non-llc platforms in execlist
	 * mode, but since all GGTT accesses use PAT entry 0 we
	 * get snooping anyway regardless of cache_level.
	 *
	 * This is only applicable for Ivy Bridge devices since
	 * later platforms don't have L3 control bits in the PTE.
	 */
	if (IS_IVYBRIDGE(i915))
		i915_gem_object_set_cache_coherency(obj, I915_CACHE_L3_LLC);

533
	if (engine->default_state) {
534
		void *vaddr;
535 536 537 538 539 540 541

		vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
		if (IS_ERR(vaddr)) {
			err = PTR_ERR(vaddr);
			goto err_obj;
		}

542 543
		shmem_read(engine->default_state, 0,
			   vaddr, engine->context_size);
544

545
		i915_gem_object_flush_map(obj);
546
		__i915_gem_object_release_map(obj);
547 548
	}

549
	vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
550 551 552 553
	if (IS_ERR(vma)) {
		err = PTR_ERR(vma);
		goto err_obj;
	}
554 555

	return vma;
556 557 558 559

err_obj:
	i915_gem_object_put(obj);
	return ERR_PTR(err);
560 561
}

562
static int ring_context_alloc(struct intel_context *ce)
563
{
564
	struct intel_engine_cs *engine = ce->engine;
565

566
	/* One ringbuffer to rule them all */
567 568 569
	GEM_BUG_ON(!engine->legacy.ring);
	ce->ring = engine->legacy.ring;
	ce->timeline = intel_timeline_get(engine->legacy.timeline);
570

571 572
	GEM_BUG_ON(ce->state);
	if (engine->context_size) {
573 574 575
		struct i915_vma *vma;

		vma = alloc_context_vma(engine);
576 577
		if (IS_ERR(vma))
			return PTR_ERR(vma);
578 579

		ce->state = vma;
580 581
		if (engine->default_state)
			__set_bit(CONTEXT_VALID_BIT, &ce->flags);
582 583
	}

584 585 586 587 588
	return 0;
}

static int ring_context_pin(struct intel_context *ce)
{
589
	return __context_pin_ppgtt(ce);
590 591
}

592 593
static void ring_context_reset(struct intel_context *ce)
{
594
	intel_ring_reset(ce->ring, ce->ring->emit);
595 596
}

597
static const struct intel_context_ops ring_context_ops = {
598 599
	.alloc = ring_context_alloc,

600
	.pin = ring_context_pin,
601
	.unpin = ring_context_unpin,
602

603 604 605
	.enter = intel_context_enter_engine,
	.exit = intel_context_exit_engine,

606
	.reset = ring_context_reset,
607 608 609
	.destroy = ring_context_destroy,
};

610 611 612
static int load_pd_dir(struct i915_request *rq,
		       const struct i915_ppgtt *ppgtt,
		       u32 valid)
613 614 615 616
{
	const struct intel_engine_cs * const engine = rq->engine;
	u32 *cs;

617
	cs = intel_ring_begin(rq, 12);
618 619 620
	if (IS_ERR(cs))
		return PTR_ERR(cs);

621
	*cs++ = MI_LOAD_REGISTER_IMM(1);
622
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_DCLV(engine->mmio_base));
623
	*cs++ = valid;
624 625

	*cs++ = MI_LOAD_REGISTER_IMM(1);
626
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine->mmio_base));
627
	*cs++ = px_base(ppgtt->pd)->ggtt_offset << 10;
628

629
	/* Stall until the page table load is complete? */
630
	*cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT;
631
	*cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine->mmio_base));
632
	*cs++ = intel_gt_scratch_offset(engine->gt,
633
					INTEL_GT_SCRATCH_FIELD_DEFAULT);
634

635 636 637 638
	*cs++ = MI_LOAD_REGISTER_IMM(1);
	*cs++ = i915_mmio_reg_offset(RING_INSTPM(engine->mmio_base));
	*cs++ = _MASKED_BIT_ENABLE(INSTPM_TLB_INVALIDATE);

639
	intel_ring_advance(rq, cs);
640

641
	return rq->engine->emit_flush(rq, EMIT_FLUSH);
642 643
}

644 645 646
static inline int mi_set_context(struct i915_request *rq,
				 struct intel_context *ce,
				 u32 flags)
647 648
{
	struct intel_engine_cs *engine = rq->engine;
649
	struct drm_i915_private *i915 = engine->i915;
650
	enum intel_engine_id id;
651
	const int num_engines =
652
		IS_HASWELL(i915) ? engine->gt->info.num_engines - 1 : 0;
653
	bool force_restore = false;
654 655 656 657
	int len;
	u32 *cs;

	len = 4;
658
	if (IS_GEN(i915, 7))
659
		len += 2 + (num_engines ? 4 * num_engines + 6 : 0);
660 661
	else if (IS_GEN(i915, 5))
		len += 2;
662 663 664 665 666 667
	if (flags & MI_FORCE_RESTORE) {
		GEM_BUG_ON(flags & MI_RESTORE_INHIBIT);
		flags &= ~MI_FORCE_RESTORE;
		force_restore = true;
		len += 2;
	}
668 669 670 671 672 673

	cs = intel_ring_begin(rq, len);
	if (IS_ERR(cs))
		return PTR_ERR(cs);

	/* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */
674
	if (IS_GEN(i915, 7)) {
675
		*cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
676
		if (num_engines) {
677 678
			struct intel_engine_cs *signaller;

679
			*cs++ = MI_LOAD_REGISTER_IMM(num_engines);
680
			for_each_engine(signaller, engine->gt, id) {
681 682 683 684 685 686 687 688 689
				if (signaller == engine)
					continue;

				*cs++ = i915_mmio_reg_offset(
					   RING_PSMI_CTL(signaller->mmio_base));
				*cs++ = _MASKED_BIT_ENABLE(
						GEN6_PSMI_SLEEP_MSG_DISABLE);
			}
		}
690 691 692 693 694 695 696 697
	} else if (IS_GEN(i915, 5)) {
		/*
		 * This w/a is only listed for pre-production ilk a/b steppings,
		 * but is also mentioned for programming the powerctx. To be
		 * safe, just apply the workaround; we do not use SyncFlush so
		 * this should never take effect and so be a no-op!
		 */
		*cs++ = MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN;
698 699
	}

700 701 702 703 704 705 706 707 708 709 710 711 712 713
	if (force_restore) {
		/*
		 * The HW doesn't handle being told to restore the current
		 * context very well. Quite often it likes goes to go off and
		 * sulk, especially when it is meant to be reloading PP_DIR.
		 * A very simple fix to force the reload is to simply switch
		 * away from the current context and back again.
		 *
		 * Note that the kernel_context will contain random state
		 * following the INHIBIT_RESTORE. We accept this since we
		 * never use the kernel_context state; it is merely a
		 * placeholder we use to flush other contexts.
		 */
		*cs++ = MI_SET_CONTEXT;
714
		*cs++ = i915_ggtt_offset(engine->kernel_context->state) |
715 716 717 718
			MI_MM_SPACE_GTT |
			MI_RESTORE_INHIBIT;
	}

719 720
	*cs++ = MI_NOOP;
	*cs++ = MI_SET_CONTEXT;
721
	*cs++ = i915_ggtt_offset(ce->state) | flags;
722 723 724 725 726 727
	/*
	 * w/a: MI_SET_CONTEXT must always be followed by MI_NOOP
	 * WaMiSetContext_Hang:snb,ivb,vlv
	 */
	*cs++ = MI_NOOP;

728
	if (IS_GEN(i915, 7)) {
729
		if (num_engines) {
730 731 732
			struct intel_engine_cs *signaller;
			i915_reg_t last_reg = {}; /* keep gcc quiet */

733
			*cs++ = MI_LOAD_REGISTER_IMM(num_engines);
734
			for_each_engine(signaller, engine->gt, id) {
735 736 737 738 739 740 741 742 743 744 745 746
				if (signaller == engine)
					continue;

				last_reg = RING_PSMI_CTL(signaller->mmio_base);
				*cs++ = i915_mmio_reg_offset(last_reg);
				*cs++ = _MASKED_BIT_DISABLE(
						GEN6_PSMI_SLEEP_MSG_DISABLE);
			}

			/* Insert a delay before the next switch! */
			*cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT;
			*cs++ = i915_mmio_reg_offset(last_reg);
747
			*cs++ = intel_gt_scratch_offset(engine->gt,
748
							INTEL_GT_SCRATCH_FIELD_DEFAULT);
749 750 751
			*cs++ = MI_NOOP;
		}
		*cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
752 753
	} else if (IS_GEN(i915, 5)) {
		*cs++ = MI_SUSPEND_FLUSH;
754 755 756 757 758 759 760
	}

	intel_ring_advance(rq, cs);

	return 0;
}

761
static int remap_l3_slice(struct i915_request *rq, int slice)
762
{
763
	u32 *cs, *remap_info = rq->engine->i915->l3_parity.remap_info[slice];
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
	int i;

	if (!remap_info)
		return 0;

	cs = intel_ring_begin(rq, GEN7_L3LOG_SIZE/4 * 2 + 2);
	if (IS_ERR(cs))
		return PTR_ERR(cs);

	/*
	 * Note: We do not worry about the concurrent register cacheline hang
	 * here because no other code should access these registers other than
	 * at initialization time.
	 */
	*cs++ = MI_LOAD_REGISTER_IMM(GEN7_L3LOG_SIZE/4);
	for (i = 0; i < GEN7_L3LOG_SIZE/4; i++) {
		*cs++ = i915_mmio_reg_offset(GEN7_L3LOG(slice, i));
		*cs++ = remap_info[i];
	}
	*cs++ = MI_NOOP;
	intel_ring_advance(rq, cs);

	return 0;
}

789 790
static int remap_l3(struct i915_request *rq)
{
791
	struct i915_gem_context *ctx = i915_request_gem_context(rq);
792 793
	int i, err;

794
	if (!ctx || !ctx->remap_slice)
795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
		return 0;

	for (i = 0; i < MAX_L3_SLICES; i++) {
		if (!(ctx->remap_slice & BIT(i)))
			continue;

		err = remap_l3_slice(rq, i);
		if (err)
			return err;
	}

	ctx->remap_slice = 0;
	return 0;
}

810
static int switch_mm(struct i915_request *rq, struct i915_address_space *vm)
811
{
812
	int ret;
813

814 815
	if (!vm)
		return 0;
816

817 818 819
	ret = rq->engine->emit_flush(rq, EMIT_FLUSH);
	if (ret)
		return ret;
820

821 822 823 824 825 826 827 828 829 830 831
	/*
	 * Not only do we need a full barrier (post-sync write) after
	 * invalidating the TLBs, but we need to wait a little bit
	 * longer. Whether this is merely delaying us, or the
	 * subsequent flush is a key part of serialising with the
	 * post-sync op, this extra pass appears vital before a
	 * mm switch!
	 */
	ret = load_pd_dir(rq, i915_vm_to_ppgtt(vm), PP_DIR_DCLV_2G);
	if (ret)
		return ret;
832

833
	return rq->engine->emit_flush(rq, EMIT_INVALIDATE);
834
}
835

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
static int clear_residuals(struct i915_request *rq)
{
	struct intel_engine_cs *engine = rq->engine;
	int ret;

	ret = switch_mm(rq, vm_alias(engine->kernel_context->vm));
	if (ret)
		return ret;

	if (engine->kernel_context->state) {
		ret = mi_set_context(rq,
				     engine->kernel_context,
				     MI_MM_SPACE_GTT | MI_RESTORE_INHIBIT);
		if (ret)
			return ret;
	}

	ret = engine->emit_bb_start(rq,
				    engine->wa_ctx.vma->node.start, 0,
				    0);
	if (ret)
		return ret;

	ret = engine->emit_flush(rq, EMIT_FLUSH);
	if (ret)
		return ret;

	/* Always invalidate before the next switch_mm() */
	return engine->emit_flush(rq, EMIT_INVALIDATE);
}

867 868
static int switch_context(struct i915_request *rq)
{
869
	struct intel_engine_cs *engine = rq->engine;
870
	struct intel_context *ce = rq->context;
871
	void **residuals = NULL;
872
	int ret;
873

874
	GEM_BUG_ON(HAS_EXECLISTS(engine->i915));
875

876 877 878 879 880 881 882 883 884 885
	if (engine->wa_ctx.vma && ce != engine->kernel_context) {
		if (engine->wa_ctx.vma->private != ce) {
			ret = clear_residuals(rq);
			if (ret)
				return ret;

			residuals = &engine->wa_ctx.vma->private;
		}
	}

886
	ret = switch_mm(rq, vm_alias(ce->vm));
887 888
	if (ret)
		return ret;
889

890
	if (ce->state) {
891
		u32 flags;
892

893
		GEM_BUG_ON(engine->id != RCS0);
894

895 896 897 898 899 900 901 902 903
		/* For resource streamer on HSW+ and power context elsewhere */
		BUILD_BUG_ON(HSW_MI_RS_SAVE_STATE_EN != MI_SAVE_EXT_STATE_EN);
		BUILD_BUG_ON(HSW_MI_RS_RESTORE_STATE_EN != MI_RESTORE_EXT_STATE_EN);

		flags = MI_SAVE_EXT_STATE_EN | MI_MM_SPACE_GTT;
		if (test_bit(CONTEXT_VALID_BIT, &ce->flags))
			flags |= MI_RESTORE_EXT_STATE_EN;
		else
			flags |= MI_RESTORE_INHIBIT;
904

905
		ret = mi_set_context(rq, ce, flags);
906 907 908 909
		if (ret)
			return ret;
	}

910 911
	ret = remap_l3(rq);
	if (ret)
912
		return ret;
913

914 915 916 917 918 919 920 921 922 923 924 925 926 927
	/*
	 * Now past the point of no return, this request _will_ be emitted.
	 *
	 * Or at least this preamble will be emitted, the request may be
	 * interrupted prior to submitting the user payload. If so, we
	 * still submit the "empty" request in order to preserve global
	 * state tracking such as this, our tracking of the current
	 * dirty context.
	 */
	if (residuals) {
		intel_context_put(*residuals);
		*residuals = intel_context_get(ce);
	}

928 929 930
	return 0;
}

931
static int ring_request_alloc(struct i915_request *request)
932
{
933
	int ret;
934

935
	GEM_BUG_ON(!intel_context_is_pinned(request->context));
936
	GEM_BUG_ON(i915_request_timeline(request)->has_initial_breadcrumb);
937

938 939
	/*
	 * Flush enough space to reduce the likelihood of waiting after
940 941 942
	 * we start building the request - in which case we will just
	 * have to repeat work.
	 */
943
	request->reserved_space += LEGACY_REQUEST_SIZE;
944

945 946
	/* Unconditionally invalidate GPU caches and TLBs. */
	ret = request->engine->emit_flush(request, EMIT_INVALIDATE);
947 948
	if (ret)
		return ret;
949

950
	ret = switch_context(request);
951 952 953
	if (ret)
		return ret;

954
	request->reserved_space -= LEGACY_REQUEST_SIZE;
955
	return 0;
956 957
}

958
static void gen6_bsd_submit_request(struct i915_request *request)
959
{
960
	struct intel_uncore *uncore = request->engine->uncore;
961

962
	intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL);
963

964
       /* Every tail move must follow the sequence below */
965 966 967 968

	/* Disable notification that the ring is IDLE. The GT
	 * will then assume that it is busy and bring it out of rc6.
	 */
969 970
	intel_uncore_write_fw(uncore, GEN6_BSD_SLEEP_PSMI_CONTROL,
			      _MASKED_BIT_ENABLE(GEN6_BSD_SLEEP_MSG_DISABLE));
971 972

	/* Clear the context id. Here be magic! */
973
	intel_uncore_write64_fw(uncore, GEN6_BSD_RNCID, 0x0);
974

975
	/* Wait for the ring not to be idle, i.e. for it to wake up. */
976
	if (__intel_wait_for_register_fw(uncore,
977 978 979 980
					 GEN6_BSD_SLEEP_PSMI_CONTROL,
					 GEN6_BSD_SLEEP_INDICATOR,
					 0,
					 1000, 0, NULL))
981 982
		drm_err(&uncore->i915->drm,
			"timed out waiting for the BSD ring to wake up\n");
983

984
	/* Now that the ring is fully powered up, update the tail */
985
	i9xx_submit_request(request);
986 987 988 989

	/* Let the ring send IDLE messages to the GT again,
	 * and so let it sleep to conserve power when idle.
	 */
990 991
	intel_uncore_write_fw(uncore, GEN6_BSD_SLEEP_PSMI_CONTROL,
			      _MASKED_BIT_DISABLE(GEN6_BSD_SLEEP_MSG_DISABLE));
992

993
	intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL);
994 995
}

996 997 998
static void i9xx_set_default_submission(struct intel_engine_cs *engine)
{
	engine->submit_request = i9xx_submit_request;
999 1000 1001

	engine->park = NULL;
	engine->unpark = NULL;
1002 1003 1004 1005
}

static void gen6_bsd_set_default_submission(struct intel_engine_cs *engine)
{
1006
	i9xx_set_default_submission(engine);
1007 1008 1009
	engine->submit_request = gen6_bsd_submit_request;
}

1010
static void ring_release(struct intel_engine_cs *engine)
1011 1012 1013
{
	struct drm_i915_private *dev_priv = engine->i915;

1014 1015
	drm_WARN_ON(&dev_priv->drm, INTEL_GEN(dev_priv) > 2 &&
		    (ENGINE_READ(engine, RING_MI_MODE) & MODE_IDLE) == 0);
1016

1017 1018
	intel_engine_cleanup_common(engine);

1019 1020 1021 1022 1023
	if (engine->wa_ctx.vma) {
		intel_context_put(engine->wa_ctx.vma->private);
		i915_vma_unpin_and_release(&engine->wa_ctx.vma, 0);
	}

1024 1025 1026 1027 1028
	intel_ring_unpin(engine->legacy.ring);
	intel_ring_put(engine->legacy.ring);

	intel_timeline_unpin(engine->legacy.timeline);
	intel_timeline_put(engine->legacy.timeline);
1029 1030
}

1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
static void setup_irq(struct intel_engine_cs *engine)
{
	struct drm_i915_private *i915 = engine->i915;

	if (INTEL_GEN(i915) >= 6) {
		engine->irq_enable = gen6_irq_enable;
		engine->irq_disable = gen6_irq_disable;
	} else if (INTEL_GEN(i915) >= 5) {
		engine->irq_enable = gen5_irq_enable;
		engine->irq_disable = gen5_irq_disable;
	} else if (INTEL_GEN(i915) >= 3) {
1042 1043
		engine->irq_enable = gen3_irq_enable;
		engine->irq_disable = gen3_irq_disable;
1044
	} else {
1045 1046
		engine->irq_enable = gen2_irq_enable;
		engine->irq_disable = gen2_irq_disable;
1047 1048 1049 1050
	}
}

static void setup_common(struct intel_engine_cs *engine)
1051
{
1052 1053
	struct drm_i915_private *i915 = engine->i915;

1054
	/* gen8+ are only supported with execlists */
1055
	GEM_BUG_ON(INTEL_GEN(i915) >= 8);
1056

1057
	setup_irq(engine);
1058

1059
	engine->resume = xcs_resume;
1060
	engine->reset.prepare = reset_prepare;
1061 1062
	engine->reset.rewind = reset_rewind;
	engine->reset.cancel = reset_cancel;
1063
	engine->reset.finish = reset_finish;
1064

1065
	engine->cops = &ring_context_ops;
1066 1067
	engine->request_alloc = ring_request_alloc;

1068 1069 1070 1071 1072
	/*
	 * Using a global execution timeline; the previous final breadcrumb is
	 * equivalent to our next initial bread so we can elide
	 * engine->emit_init_breadcrumb().
	 */
1073
	engine->emit_fini_breadcrumb = gen3_emit_breadcrumb;
1074
	if (IS_GEN(i915, 5))
1075
		engine->emit_fini_breadcrumb = gen5_emit_breadcrumb;
1076 1077

	engine->set_default_submission = i9xx_set_default_submission;
1078

1079
	if (INTEL_GEN(i915) >= 6)
1080
		engine->emit_bb_start = gen6_emit_bb_start;
1081
	else if (INTEL_GEN(i915) >= 4)
1082
		engine->emit_bb_start = gen4_emit_bb_start;
1083
	else if (IS_I830(i915) || IS_I845G(i915))
1084
		engine->emit_bb_start = i830_emit_bb_start;
1085
	else
1086
		engine->emit_bb_start = gen3_emit_bb_start;
1087 1088
}

1089
static void setup_rcs(struct intel_engine_cs *engine)
1090
{
1091
	struct drm_i915_private *i915 = engine->i915;
1092

1093
	if (HAS_L3_DPF(i915))
1094
		engine->irq_keep_mask = GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
1095

1096 1097
	engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT;

1098
	if (INTEL_GEN(i915) >= 7) {
1099 1100
		engine->emit_flush = gen7_emit_flush_rcs;
		engine->emit_fini_breadcrumb = gen7_emit_breadcrumb_rcs;
1101
	} else if (IS_GEN(i915, 6)) {
1102 1103
		engine->emit_flush = gen6_emit_flush_rcs;
		engine->emit_fini_breadcrumb = gen6_emit_breadcrumb_rcs;
1104
	} else if (IS_GEN(i915, 5)) {
1105
		engine->emit_flush = gen4_emit_flush_rcs;
1106
	} else {
1107
		if (INTEL_GEN(i915) < 4)
1108
			engine->emit_flush = gen2_emit_flush;
1109
		else
1110
			engine->emit_flush = gen4_emit_flush_rcs;
1111
		engine->irq_enable_mask = I915_USER_INTERRUPT;
1112
	}
B
Ben Widawsky 已提交
1113

1114
	if (IS_HASWELL(i915))
1115
		engine->emit_bb_start = hsw_emit_bb_start;
1116 1117
}

1118
static void setup_vcs(struct intel_engine_cs *engine)
1119
{
1120
	struct drm_i915_private *i915 = engine->i915;
1121

1122
	if (INTEL_GEN(i915) >= 6) {
1123
		/* gen6 bsd needs a special wa for tail updates */
1124
		if (IS_GEN(i915, 6))
1125
			engine->set_default_submission = gen6_bsd_set_default_submission;
1126
		engine->emit_flush = gen6_emit_flush_vcs;
1127
		engine->irq_enable_mask = GT_BSD_USER_INTERRUPT;
1128

1129
		if (IS_GEN(i915, 6))
1130
			engine->emit_fini_breadcrumb = gen6_emit_breadcrumb_xcs;
1131
		else
1132
			engine->emit_fini_breadcrumb = gen7_emit_breadcrumb_xcs;
1133
	} else {
1134
		engine->emit_flush = gen4_emit_flush_vcs;
1135
		if (IS_GEN(i915, 5))
1136
			engine->irq_enable_mask = ILK_BSD_USER_INTERRUPT;
1137
		else
1138
			engine->irq_enable_mask = I915_BSD_USER_INTERRUPT;
1139
	}
1140
}
1141

1142
static void setup_bcs(struct intel_engine_cs *engine)
1143
{
1144
	struct drm_i915_private *i915 = engine->i915;
1145

1146
	engine->emit_flush = gen6_emit_flush_xcs;
1147
	engine->irq_enable_mask = GT_BLT_USER_INTERRUPT;
1148

1149
	if (IS_GEN(i915, 6))
1150
		engine->emit_fini_breadcrumb = gen6_emit_breadcrumb_xcs;
1151
	else
1152
		engine->emit_fini_breadcrumb = gen7_emit_breadcrumb_xcs;
1153
}
1154

1155
static void setup_vecs(struct intel_engine_cs *engine)
B
Ben Widawsky 已提交
1156
{
1157
	struct drm_i915_private *i915 = engine->i915;
1158

1159
	GEM_BUG_ON(INTEL_GEN(i915) < 7);
1160

1161
	engine->emit_flush = gen6_emit_flush_xcs;
1162
	engine->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
1163 1164
	engine->irq_enable = hsw_irq_enable_vecs;
	engine->irq_disable = hsw_irq_disable_vecs;
B
Ben Widawsky 已提交
1165

1166
	engine->emit_fini_breadcrumb = gen7_emit_breadcrumb_xcs;
1167 1168
}

1169 1170 1171
static int gen7_ctx_switch_bb_setup(struct intel_engine_cs * const engine,
				    struct i915_vma * const vma)
{
1172
	return gen7_setup_clear_gpr_bb(engine, vma);
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
}

static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine)
{
	struct drm_i915_gem_object *obj;
	struct i915_vma *vma;
	int size;
	int err;

	size = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */);
	if (size <= 0)
		return size;

	size = ALIGN(size, PAGE_SIZE);
	obj = i915_gem_object_create_internal(engine->i915, size);
	if (IS_ERR(obj))
		return PTR_ERR(obj);

	vma = i915_vma_instance(obj, engine->gt->vm, NULL);
	if (IS_ERR(vma)) {
		err = PTR_ERR(vma);
		goto err_obj;
	}

	vma->private = intel_context_create(engine); /* dummy residuals */
	if (IS_ERR(vma->private)) {
		err = PTR_ERR(vma->private);
		goto err_obj;
	}

	err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_HIGH);
	if (err)
		goto err_private;

1207 1208 1209 1210
	err = i915_vma_sync(vma);
	if (err)
		goto err_unpin;

1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226
	err = gen7_ctx_switch_bb_setup(engine, vma);
	if (err)
		goto err_unpin;

	engine->wa_ctx.vma = vma;
	return 0;

err_unpin:
	i915_vma_unpin(vma);
err_private:
	intel_context_put(vma->private);
err_obj:
	i915_gem_object_put(obj);
	return err;
}

1227 1228
int intel_ring_submission_setup(struct intel_engine_cs *engine)
{
1229 1230 1231 1232
	struct intel_timeline *timeline;
	struct intel_ring *ring;
	int err;

1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252
	setup_common(engine);

	switch (engine->class) {
	case RENDER_CLASS:
		setup_rcs(engine);
		break;
	case VIDEO_DECODE_CLASS:
		setup_vcs(engine);
		break;
	case COPY_ENGINE_CLASS:
		setup_bcs(engine);
		break;
	case VIDEO_ENHANCEMENT_CLASS:
		setup_vecs(engine);
		break;
	default:
		MISSING_CASE(engine->class);
		return -ENODEV;
	}

1253
	timeline = intel_timeline_create(engine->gt, engine->status_page.vma);
1254 1255 1256 1257 1258 1259
	if (IS_ERR(timeline)) {
		err = PTR_ERR(timeline);
		goto err;
	}
	GEM_BUG_ON(timeline->has_initial_breadcrumb);

1260 1261 1262 1263 1264
	err = intel_timeline_pin(timeline);
	if (err)
		goto err_timeline;

	ring = intel_engine_create_ring(engine, SZ_16K);
1265 1266
	if (IS_ERR(ring)) {
		err = PTR_ERR(ring);
1267
		goto err_timeline_unpin;
1268 1269 1270 1271 1272
	}

	err = intel_ring_pin(ring);
	if (err)
		goto err_ring;
1273

1274 1275 1276
	GEM_BUG_ON(engine->legacy.ring);
	engine->legacy.ring = ring;
	engine->legacy.timeline = timeline;
1277

1278
	GEM_BUG_ON(timeline->hwsp_ggtt != engine->status_page.vma);
1279

1280
	if (IS_HASWELL(engine->i915) && engine->class == RENDER_CLASS) {
1281 1282 1283 1284 1285
		err = gen7_ctx_switch_bb_init(engine);
		if (err)
			goto err_ring_unpin;
	}

1286 1287 1288
	/* Finally, take ownership and responsibility for cleanup! */
	engine->release = ring_release;

1289 1290
	return 0;

1291 1292
err_ring_unpin:
	intel_ring_unpin(ring);
1293 1294
err_ring:
	intel_ring_put(ring);
1295 1296 1297 1298
err_timeline_unpin:
	intel_timeline_unpin(timeline);
err_timeline:
	intel_timeline_put(timeline);
1299 1300 1301
err:
	intel_engine_cleanup_common(engine);
	return err;
B
Ben Widawsky 已提交
1302
}
1303 1304 1305 1306

#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftest_ring_submission.c"
#endif