intel_guc_submission.c 35.7 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
/*
 * Copyright © 2014 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.
 *
 */

25
#include <linux/circ_buf.h>
26 27
#include <trace/events/dma_fence.h>

28
#include "intel_guc_submission.h"
29 30
#include "i915_drv.h"

31
/**
A
Alex Dai 已提交
32
 * DOC: GuC-based command submission
33
 *
34
 * GuC client:
35
 * A intel_guc_client refers to a submission path through GuC. Currently, there
36 37 38 39 40
 * are two clients. One of them (the execbuf_client) is charged with all
 * submissions to the GuC, the other one (preempt_client) is responsible for
 * preempting the execbuf_client. This struct is the owner of a doorbell, a
 * process descriptor and a workqueue (all of them inside a single gem object
 * that contains all required pages for these elements).
41
 *
42
 * GuC stage descriptor:
43 44
 * During initialization, the driver allocates a static pool of 1024 such
 * descriptors, and shares them with the GuC.
45
 * Currently, there exists a 1:1 mapping between a intel_guc_client and a
46 47 48 49
 * guc_stage_desc (via the client's stage_id), so effectively only one
 * gets used. This stage descriptor lets the GuC know about the doorbell,
 * workqueue and process descriptor. Theoretically, it also lets the GuC
 * know about our HW contexts (context ID, etc...), but we actually
50
 * employ a kind of submission where the GuC uses the LRCA sent via the work
51
 * item instead (the single guc_stage_desc associated to execbuf client
52 53
 * contains information about the default kernel context only, but this is
 * essentially unused). This is called a "proxy" submission.
54 55 56 57 58 59 60 61
 *
 * The Scratch registers:
 * There are 16 MMIO-based registers start from 0xC180. The kernel driver writes
 * a value to the action register (SOFT_SCRATCH_0) along with any data. It then
 * triggers an interrupt on the GuC via another register write (0xC4C8).
 * Firmware writes a success/fail code back to the action register after
 * processes the request. The kernel driver polls waiting for this update and
 * then proceeds.
62
 * See intel_guc_send()
63 64 65 66 67 68 69 70 71 72 73
 *
 * Doorbells:
 * Doorbells are interrupts to uKernel. A doorbell is a single cache line (QW)
 * mapped into process space.
 *
 * Work Items:
 * There are several types of work items that the host may place into a
 * workqueue, each with its own requirements and limitations. Currently only
 * WQ_TYPE_INORDER is needed to support legacy submission via GuC, which
 * represents in-order queue. The kernel driver packs ring tail pointer and an
 * ELSP context descriptor dword into Work Item.
74
 * See guc_add_request()
75 76 77
 *
 */

78
static inline bool is_high_priority(struct intel_guc_client *client)
79
{
80 81
	return (client->priority == GUC_CLIENT_PRIORITY_KMD_HIGH ||
		client->priority == GUC_CLIENT_PRIORITY_HIGH);
82 83
}

84
static int reserve_doorbell(struct intel_guc_client *client)
85 86 87 88 89 90 91 92 93 94 95 96 97
{
	unsigned long offset;
	unsigned long end;
	u16 id;

	GEM_BUG_ON(client->doorbell_id != GUC_DOORBELL_INVALID);

	/*
	 * The bitmap tracks which doorbell registers are currently in use.
	 * It is split into two halves; the first half is used for normal
	 * priority contexts, the second half for high-priority ones.
	 */
	offset = 0;
98
	end = GUC_NUM_DOORBELLS / 2;
99 100 101 102 103
	if (is_high_priority(client)) {
		offset = end;
		end += offset;
	}

104
	id = find_next_zero_bit(client->guc->doorbell_bitmap, end, offset);
105 106 107 108 109 110
	if (id == end)
		return -ENOSPC;

	__set_bit(id, client->guc->doorbell_bitmap);
	client->doorbell_id = id;
	DRM_DEBUG_DRIVER("client %u (high prio=%s) reserved doorbell: %d\n",
111
			 client->stage_id, yesno(is_high_priority(client)),
112 113 114 115
			 id);
	return 0;
}

116
static void unreserve_doorbell(struct intel_guc_client *client)
117 118 119 120 121 122 123
{
	GEM_BUG_ON(client->doorbell_id == GUC_DOORBELL_INVALID);

	__clear_bit(client->doorbell_id, client->guc->doorbell_bitmap);
	client->doorbell_id = GUC_DOORBELL_INVALID;
}

124 125 126 127
/*
 * Tell the GuC to allocate or deallocate a specific doorbell
 */

128
static int __guc_allocate_doorbell(struct intel_guc *guc, u32 stage_id)
129
{
130 131
	u32 action[] = {
		INTEL_GUC_ACTION_ALLOCATE_DOORBELL,
132
		stage_id
133
	};
134

135
	return intel_guc_send(guc, action, ARRAY_SIZE(action));
136 137
}

138
static int __guc_deallocate_doorbell(struct intel_guc *guc, u32 stage_id)
139
{
140 141
	u32 action[] = {
		INTEL_GUC_ACTION_DEALLOCATE_DOORBELL,
142
		stage_id
143
	};
144

145
	return intel_guc_send(guc, action, ARRAY_SIZE(action));
146 147
}

148
static struct guc_stage_desc *__get_stage_desc(struct intel_guc_client *client)
149
{
150
	struct guc_stage_desc *base = client->guc->stage_desc_pool_vaddr;
151

152
	return &base[client->stage_id];
153 154
}

155 156 157 158 159 160 161
/*
 * Initialise, update, or clear doorbell data shared with the GuC
 *
 * These functions modify shared data and so need access to the mapped
 * client object which contains the page being used for the doorbell
 */

162
static void __update_doorbell_desc(struct intel_guc_client *client, u16 new_id)
163
{
164
	struct guc_stage_desc *desc;
165

166
	/* Update the GuC's idea of the doorbell ID */
167
	desc = __get_stage_desc(client);
168
	desc->db_id = new_id;
169
}
170

171
static struct guc_doorbell_info *__get_doorbell(struct intel_guc_client *client)
172 173 174 175
{
	return client->vaddr + client->doorbell_offset;
}

176
static bool has_doorbell(struct intel_guc_client *client)
177 178 179 180 181 182 183
{
	if (client->doorbell_id == GUC_DOORBELL_INVALID)
		return false;

	return test_bit(client->doorbell_id, client->guc->doorbell_bitmap);
}

184
static void __create_doorbell(struct intel_guc_client *client)
185 186 187 188
{
	struct guc_doorbell_info *doorbell;

	doorbell = __get_doorbell(client);
189
	doorbell->db_status = GUC_DOORBELL_ENABLED;
190
	doorbell->cookie = 0;
191 192
}

193
static void __destroy_doorbell(struct intel_guc_client *client)
194
{
195
	struct drm_i915_private *dev_priv = guc_to_i915(client->guc);
196
	struct guc_doorbell_info *doorbell;
197 198
	u16 db_id = client->doorbell_id;

199

200 201 202 203
	doorbell = __get_doorbell(client);
	doorbell->db_status = GUC_DOORBELL_DISABLED;
	doorbell->cookie = 0;

204 205
	/* Doorbell release flow requires that we wait for GEN8_DRB_VALID bit
	 * to go to zero after updating db_status before we call the GuC to
206 207
	 * release the doorbell
	 */
208 209
	if (wait_for_us(!(I915_READ(GEN8_DRBREGL(db_id)) & GEN8_DRB_VALID), 10))
		WARN_ONCE(true, "Doorbell never became invalid after disable\n");
210 211
}

212
static int create_doorbell(struct intel_guc_client *client)
213 214 215 216
{
	int ret;

	__update_doorbell_desc(client, client->doorbell_id);
217
	__create_doorbell(client);
218

219 220 221 222 223 224 225 226
	ret = __guc_allocate_doorbell(client->guc, client->stage_id);
	if (ret) {
		__destroy_doorbell(client);
		__update_doorbell_desc(client, GUC_DOORBELL_INVALID);
		DRM_ERROR("Couldn't create client %u doorbell: %d\n",
			  client->stage_id, ret);
		return ret;
	}
227 228 229 230

	return 0;
}

231
static int destroy_doorbell(struct intel_guc_client *client)
232
{
233
	int ret;
234

235 236
	GEM_BUG_ON(!has_doorbell(client));

237 238 239 240 241
	__destroy_doorbell(client);
	ret = __guc_deallocate_doorbell(client->guc, client->stage_id);
	if (ret)
		DRM_ERROR("Couldn't destroy client %u doorbell: %d\n",
			  client->stage_id, ret);
242

243
	__update_doorbell_desc(client, GUC_DOORBELL_INVALID);
244

245
	return ret;
246
}
247

248
static unsigned long __select_cacheline(struct intel_guc *guc)
249
{
250
	unsigned long offset;
251 252 253 254 255

	/* Doorbell uses a single cache line within a page */
	offset = offset_in_page(guc->db_cacheline);

	/* Moving to next cache line to reduce contention */
256
	guc->db_cacheline += cache_line_size();
257

258
	DRM_DEBUG_DRIVER("reserved cacheline 0x%lx, next 0x%x, linesize %u\n",
259
			 offset, guc->db_cacheline, cache_line_size());
260 261 262
	return offset;
}

263
static inline struct guc_process_desc *
264
__get_process_desc(struct intel_guc_client *client)
265 266 267 268
{
	return client->vaddr + client->proc_desc_offset;
}

269 270 271
/*
 * Initialise the process descriptor shared with the GuC firmware.
 */
272
static void guc_proc_desc_init(struct intel_guc *guc,
273
			       struct intel_guc_client *client)
274 275 276
{
	struct guc_process_desc *desc;

277
	desc = memset(__get_process_desc(client), 0, sizeof(*desc));
278 279 280 281 282 283 284 285 286 287

	/*
	 * XXX: pDoorbell and WQVBaseAddress are pointers in process address
	 * space for ring3 clients (set them as in mmap_ioctl) or kernel
	 * space for kernel clients (map on demand instead? May make debug
	 * easier to have it mapped).
	 */
	desc->wq_base_addr = 0;
	desc->db_base_addr = 0;

288
	desc->stage_id = client->stage_id;
289
	desc->wq_size_bytes = GUC_WQ_SIZE;
290 291 292 293
	desc->wq_status = WQ_STATUS_ACTIVE;
	desc->priority = client->priority;
}

294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
static int guc_stage_desc_pool_create(struct intel_guc *guc)
{
	struct i915_vma *vma;
	void *vaddr;

	vma = intel_guc_allocate_vma(guc,
				     PAGE_ALIGN(sizeof(struct guc_stage_desc) *
				     GUC_MAX_STAGE_DESCRIPTORS));
	if (IS_ERR(vma))
		return PTR_ERR(vma);

	vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
	if (IS_ERR(vaddr)) {
		i915_vma_unpin_and_release(&vma);
		return PTR_ERR(vaddr);
	}

	guc->stage_desc_pool = vma;
	guc->stage_desc_pool_vaddr = vaddr;
	ida_init(&guc->stage_ids);

	return 0;
}

static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
{
	ida_destroy(&guc->stage_ids);
	i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
	i915_vma_unpin_and_release(&guc->stage_desc_pool);
}

325
/*
326
 * Initialise/clear the stage descriptor shared with the GuC firmware.
327 328 329 330 331
 *
 * This descriptor tells the GuC where (in GGTT space) to find the important
 * data structures relating to this client (doorbell, process descriptor,
 * write queue, etc).
 */
332
static void guc_stage_desc_init(struct intel_guc *guc,
333
				struct intel_guc_client *client)
334
{
335
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
336
	struct intel_engine_cs *engine;
337
	struct i915_gem_context *ctx = client->owner;
338
	struct guc_stage_desc *desc;
339
	unsigned int tmp;
340
	u32 gfx_addr;
341

342
	desc = __get_stage_desc(client);
343
	memset(desc, 0, sizeof(*desc));
344

345 346
	desc->attribute = GUC_STAGE_DESC_ATTR_ACTIVE |
			  GUC_STAGE_DESC_ATTR_KERNEL;
347 348
	if (is_high_priority(client))
		desc->attribute |= GUC_STAGE_DESC_ATTR_PREEMPT;
349
	desc->stage_id = client->stage_id;
350 351
	desc->priority = client->priority;
	desc->db_id = client->doorbell_id;
352

353
	for_each_engine_masked(engine, dev_priv, client->engines, tmp) {
354
		struct intel_context *ce = &ctx->engine[engine->id];
355
		u32 guc_engine_id = engine->guc_id;
356
		struct guc_execlist_context *lrc = &desc->lrc[guc_engine_id];
357 358 359 360 361 362 363 364

		/* TODO: We have a design issue to be solved here. Only when we
		 * receive the first batch, we know which engine is used by the
		 * user. But here GuC expects the lrc and ring to be pinned. It
		 * is not an issue for default context, which is the only one
		 * for now who owns a GuC client. But for future owner of GuC
		 * client, need to make sure lrc is pinned prior to enter here.
		 */
365
		if (!ce->state)
366 367
			break;	/* XXX: continue? */

368
		/*
369
		 * XXX: When this is a GUC_STAGE_DESC_ATTR_KERNEL client (proxy
370 371 372
		 * submission or, in other words, not using a direct submission
		 * model) the KMD's LRCA is not used for any work submission.
		 * Instead, the GuC uses the LRCA of the user mode context (see
373
		 * guc_add_request below).
374
		 */
375
		lrc->context_desc = lower_32_bits(ce->lrc_desc);
376 377

		/* The state page is after PPHWSP */
378
		lrc->ring_lrca =
379
			guc_ggtt_offset(ce->state) + LRC_STATE_PN * PAGE_SIZE;
380 381

		/* XXX: In direct submission, the GuC wants the HW context id
382 383
		 * here. In proxy submission, it wants the stage id
		 */
384
		lrc->context_id = (client->stage_id << GUC_ELC_CTXID_OFFSET) |
385
				(guc_engine_id << GUC_ELC_ENGINE_OFFSET);
386

387
		lrc->ring_begin = guc_ggtt_offset(ce->ring->vma);
388 389
		lrc->ring_end = lrc->ring_begin + ce->ring->size - 1;
		lrc->ring_next_free_location = lrc->ring_begin;
390 391
		lrc->ring_current_tail_pointer_value = 0;

392
		desc->engines_used |= (1 << guc_engine_id);
393 394
	}

395
	DRM_DEBUG_DRIVER("Host engines 0x%x => GuC engines used 0x%x\n",
396
			 client->engines, desc->engines_used);
397
	WARN_ON(desc->engines_used == 0);
398

399
	/*
400 401
	 * The doorbell, process descriptor, and workqueue are all parts
	 * of the client object, which the GuC will reference via the GGTT
402
	 */
403
	gfx_addr = guc_ggtt_offset(client->vma);
404
	desc->db_trigger_phy = sg_dma_address(client->vma->pages->sgl) +
405
				client->doorbell_offset;
406
	desc->db_trigger_cpu = ptr_to_u64(__get_doorbell(client));
407 408
	desc->db_trigger_uk = gfx_addr + client->doorbell_offset;
	desc->process_desc = gfx_addr + client->proc_desc_offset;
409 410
	desc->wq_addr = gfx_addr + GUC_DB_SIZE;
	desc->wq_size = GUC_WQ_SIZE;
411

412
	desc->desc_private = ptr_to_u64(client);
413 414
}

415
static void guc_stage_desc_fini(struct intel_guc *guc,
416
				struct intel_guc_client *client)
417
{
418
	struct guc_stage_desc *desc;
419

420
	desc = __get_stage_desc(client);
421
	memset(desc, 0, sizeof(*desc));
422 423
}

424
/* Construct a Work Item and append it to the GuC's Work Queue */
425
static void guc_wq_item_append(struct intel_guc_client *client,
426 427
			       u32 target_engine, u32 context_desc,
			       u32 ring_tail, u32 fence_id)
428
{
429 430
	/* wqi_len is in DWords, and does not include the one-word header */
	const size_t wqi_size = sizeof(struct guc_wq_item);
431
	const u32 wqi_len = wqi_size / sizeof(u32) - 1;
432
	struct guc_process_desc *desc = __get_process_desc(client);
433
	struct guc_wq_item *wqi;
434
	u32 wq_off;
435

436
	lockdep_assert_held(&client->wq_lock);
437

438 439 440 441 442 443 444
	/* For now workqueue item is 4 DWs; workqueue buffer is 2 pages. So we
	 * should not have the case where structure wqi is across page, neither
	 * wrapped to the beginning. This simplifies the implementation below.
	 *
	 * XXX: if not the case, we need save data to a temp wqi and copy it to
	 * workqueue buffer dw by dw.
	 */
445
	BUILD_BUG_ON(wqi_size != 16);
446

447 448 449 450
	/* Free space is guaranteed. */
	wq_off = READ_ONCE(desc->tail);
	GEM_BUG_ON(CIRC_SPACE(wq_off, READ_ONCE(desc->head),
			      GUC_WQ_SIZE) < wqi_size);
451
	GEM_BUG_ON(wq_off & (wqi_size - 1));
452 453

	/* WQ starts from the page after doorbell / process_desc */
454
	wqi = client->vaddr + wq_off + GUC_DB_SIZE;
455

456
	/* Now fill in the 4-word work queue item */
457
	wqi->header = WQ_TYPE_INORDER |
458
		      (wqi_len << WQ_LEN_SHIFT) |
459
		      (target_engine << WQ_TARGET_SHIFT) |
460
		      WQ_NO_WCFLUSH_WAIT;
461
	wqi->context_desc = context_desc;
462
	wqi->submit_element_info = ring_tail << WQ_RING_TAIL_SHIFT;
463 464
	GEM_BUG_ON(ring_tail > WQ_RING_TAIL_MAX);
	wqi->fence_id = fence_id;
465

466
	/* Make the update visible to GuC */
467
	WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1));
468 469
}

470
static void guc_reset_wq(struct intel_guc_client *client)
471
{
472
	struct guc_process_desc *desc = __get_process_desc(client);
473 474 475 476 477

	desc->head = 0;
	desc->tail = 0;
}

478
static void guc_ring_doorbell(struct intel_guc_client *client)
479
{
480 481
	struct guc_doorbell_info *db;
	u32 cookie;
482

483
	lockdep_assert_held(&client->wq_lock);
484 485

	/* pointer of current doorbell cacheline */
486
	db = __get_doorbell(client);
487

488 489 490 491
	/*
	 * We're not expecting the doorbell cookie to change behind our back,
	 * we also need to treat 0 as a reserved value.
	 */
492
	cookie = READ_ONCE(db->cookie);
493
	WARN_ON_ONCE(xchg(&db->cookie, cookie + 1 ?: cookie + 2) != cookie);
494

495 496
	/* XXX: doorbell was lost and need to acquire it again */
	GEM_BUG_ON(db->db_status != GUC_DOORBELL_ENABLED);
497 498
}

499 500 501
static void guc_add_request(struct intel_guc *guc,
			    struct drm_i915_gem_request *rq)
{
502
	struct intel_guc_client *client = guc->execbuf_client;
503
	struct intel_engine_cs *engine = rq->engine;
504 505
	u32 ctx_desc = lower_32_bits(intel_lr_context_descriptor(rq->ctx,
								 engine));
506 507 508 509 510 511 512 513 514 515 516 517 518
	u32 ring_tail = intel_ring_set_tail(rq->ring, rq->tail) / sizeof(u64);

	spin_lock(&client->wq_lock);

	guc_wq_item_append(client, engine->guc_id, ctx_desc,
			   ring_tail, rq->global_seqno);
	guc_ring_doorbell(client);

	client->submissions[engine->id] += 1;

	spin_unlock(&client->wq_lock);
}

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
/*
 * When we're doing submissions using regular execlists backend, writing to
 * ELSP from CPU side is enough to make sure that writes to ringbuffer pages
 * pinned in mappable aperture portion of GGTT are visible to command streamer.
 * Writes done by GuC on our behalf are not guaranteeing such ordering,
 * therefore, to ensure the flush, we're issuing a POSTING READ.
 */
static void flush_ggtt_writes(struct i915_vma *vma)
{
	struct drm_i915_private *dev_priv = to_i915(vma->obj->base.dev);

	if (i915_vma_is_map_and_fenceable(vma))
		POSTING_READ_FW(GUC_STATUS);
}

#define GUC_PREEMPT_FINISHED 0x1
#define GUC_PREEMPT_BREADCRUMB_DWORDS 0x8
static void inject_preempt_context(struct work_struct *work)
{
	struct guc_preempt_work *preempt_work =
		container_of(work, typeof(*preempt_work), work);
	struct intel_engine_cs *engine = preempt_work->engine;
	struct intel_guc *guc = container_of(preempt_work, typeof(*guc),
					     preempt_work[engine->id]);
543
	struct intel_guc_client *client = guc->preempt_client;
544
	struct guc_stage_desc *stage_desc = __get_stage_desc(client);
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
	struct intel_ring *ring = client->owner->engine[engine->id].ring;
	u32 ctx_desc = lower_32_bits(intel_lr_context_descriptor(client->owner,
								 engine));
	u32 *cs = ring->vaddr + ring->tail;
	u32 data[7];

	if (engine->id == RCS) {
		cs = gen8_emit_ggtt_write_rcs(cs, GUC_PREEMPT_FINISHED,
				intel_hws_preempt_done_address(engine));
	} else {
		cs = gen8_emit_ggtt_write(cs, GUC_PREEMPT_FINISHED,
				intel_hws_preempt_done_address(engine));
		*cs++ = MI_NOOP;
		*cs++ = MI_NOOP;
	}
	*cs++ = MI_USER_INTERRUPT;
	*cs++ = MI_NOOP;

	GEM_BUG_ON(!IS_ALIGNED(ring->size,
			       GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32)));
	GEM_BUG_ON((void *)cs - (ring->vaddr + ring->tail) !=
		   GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32));

	ring->tail += GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32);
	ring->tail &= (ring->size - 1);

	flush_ggtt_writes(ring->vma);

	spin_lock_irq(&client->wq_lock);
	guc_wq_item_append(client, engine->guc_id, ctx_desc,
			   ring->tail / sizeof(u64), 0);
	spin_unlock_irq(&client->wq_lock);

578 579 580 581 582 583 584 585 586 587 588 589 590 591
	/*
	 * If GuC firmware performs an engine reset while that engine had
	 * a preemption pending, it will set the terminated attribute bit
	 * on our preemption stage descriptor. GuC firmware retains all
	 * pending work items for a high-priority GuC client, unlike the
	 * normal-priority GuC client where work items are dropped. It
	 * wants to make sure the preempt-to-idle work doesn't run when
	 * scheduling resumes, and uses this bit to inform its scheduler
	 * and presumably us as well. Our job is to clear it for the next
	 * preemption after reset, otherwise that and future preemptions
	 * will never complete. We'll just clear it every time.
	 */
	stage_desc->attribute &= ~GUC_STAGE_DESC_ATTR_TERMINATED;

592 593 594 595 596 597 598 599 600 601 602 603
	data[0] = INTEL_GUC_ACTION_REQUEST_PREEMPTION;
	data[1] = client->stage_id;
	data[2] = INTEL_GUC_PREEMPT_OPTION_DROP_WORK_Q |
		  INTEL_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q;
	data[3] = engine->guc_id;
	data[4] = guc->execbuf_client->priority;
	data[5] = guc->execbuf_client->stage_id;
	data[6] = guc_ggtt_offset(guc->shared_data);

	if (WARN_ON(intel_guc_send(guc, data, ARRAY_SIZE(data)))) {
		execlists_clear_active(&engine->execlists,
				       EXECLISTS_ACTIVE_PREEMPT);
604
		tasklet_schedule(&engine->execlists.tasklet);
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
	}
}

/*
 * We're using user interrupt and HWSP value to mark that preemption has
 * finished and GPU is idle. Normally, we could unwind and continue similar to
 * execlists submission path. Unfortunately, with GuC we also need to wait for
 * it to finish its own postprocessing, before attempting to submit. Otherwise
 * GuC may silently ignore our submissions, and thus we risk losing request at
 * best, executing out-of-order and causing kernel panic at worst.
 */
#define GUC_PREEMPT_POSTPROCESS_DELAY_MS 10
static void wait_for_guc_preempt_report(struct intel_engine_cs *engine)
{
	struct intel_guc *guc = &engine->i915->guc;
	struct guc_shared_ctx_data *data = guc->shared_data_vaddr;
	struct guc_ctx_report *report =
		&data->preempt_ctx_report[engine->guc_id];

	WARN_ON(wait_for_atomic(report->report_return_status ==
				INTEL_GUC_REPORT_STATUS_COMPLETE,
				GUC_PREEMPT_POSTPROCESS_DELAY_MS));
	/*
	 * GuC is expecting that we're also going to clear the affected context
	 * counter, let's also reset the return status to not depend on GuC
	 * resetting it after recieving another preempt action
	 */
	report->affected_count = 0;
	report->report_return_status = INTEL_GUC_REPORT_STATUS_UNKNOWN;
}

636
/**
637
 * guc_submit() - Submit commands through GuC
638
 * @engine: engine associated with the commands
639 640 641
 *
 * The only error here arises if the doorbell hardware isn't functioning
 * as expected, which really shouln't happen.
642
 */
643
static void guc_submit(struct intel_engine_cs *engine)
644
{
645
	struct intel_guc *guc = &engine->i915->guc;
646 647
	struct intel_engine_execlists * const execlists = &engine->execlists;
	struct execlist_port *port = execlists->port;
648
	unsigned int n;
649

650
	for (n = 0; n < execlists_num_ports(execlists); n++) {
651 652
		struct drm_i915_gem_request *rq;
		unsigned int count;
653

654 655 656
		rq = port_unpack(&port[n], &count);
		if (rq && count == 0) {
			port_set(&port[n], port_pack(rq, ++count));
657

658
			flush_ggtt_writes(rq->ring->vma);
659

660
			guc_add_request(guc, rq);
661 662
		}
	}
663 664
}

665 666 667
static void port_assign(struct execlist_port *port,
			struct drm_i915_gem_request *rq)
{
668
	GEM_BUG_ON(port_isset(port));
669

670
	port_set(port, i915_gem_request_get(rq));
671 672
}

673
static void guc_dequeue(struct intel_engine_cs *engine)
674
{
675 676
	struct intel_engine_execlists * const execlists = &engine->execlists;
	struct execlist_port *port = execlists->port;
677
	struct drm_i915_gem_request *last = NULL;
678 679
	const struct execlist_port * const last_port =
		&execlists->port[execlists->port_mask];
680
	bool submit = false;
681 682
	struct rb_node *rb;

683
	spin_lock_irq(&engine->timeline->lock);
684 685
	rb = execlists->first;
	GEM_BUG_ON(rb_first(&execlists->queue) != rb);
686 687 688 689

	if (!rb)
		goto unlock;

690 691 692 693 694 695 696 697 698 699 700 701 702
	if (port_isset(port)) {
		if (HAS_LOGICAL_RING_PREEMPTION(engine->i915)) {
			struct guc_preempt_work *preempt_work =
				&engine->i915->guc.preempt_work[engine->id];

			if (rb_entry(rb, struct i915_priolist, node)->priority >
			    max(port_request(port)->priotree.priority, 0)) {
				execlists_set_active(execlists,
						     EXECLISTS_ACTIVE_PREEMPT);
				queue_work(engine->i915->guc.preempt_wq,
					   &preempt_work->work);
				goto unlock;
			}
703 704 705
		}

		port++;
706 707
		if (port_isset(port))
			goto unlock;
708
	}
709
	GEM_BUG_ON(port_isset(port));
710 711

	do {
712 713 714 715 716
		struct i915_priolist *p = rb_entry(rb, typeof(*p), node);
		struct drm_i915_gem_request *rq, *rn;

		list_for_each_entry_safe(rq, rn, &p->requests, priotree.link) {
			if (last && rq->ctx != last->ctx) {
717
				if (port == last_port) {
718 719 720 721 722
					__list_del_many(&p->requests,
							&rq->priotree.link);
					goto done;
				}

723 724
				if (submit)
					port_assign(port, last);
725 726 727 728 729
				port++;
			}

			INIT_LIST_HEAD(&rq->priotree.link);

730
			__i915_gem_request_submit(rq);
731 732
			trace_i915_gem_request_in(rq,
						  port_index(port, execlists));
733 734
			last = rq;
			submit = true;
735 736 737
		}

		rb = rb_next(rb);
738
		rb_erase(&p->node, &execlists->queue);
739 740
		INIT_LIST_HEAD(&p->requests);
		if (p->priority != I915_PRIORITY_NORMAL)
741
			kmem_cache_free(engine->i915->priorities, p);
742
	} while (rb);
743
done:
744
	execlists->first = rb;
745
	if (submit) {
746
		port_assign(port, last);
747
		execlists_set_active(execlists, EXECLISTS_ACTIVE_USER);
748
		guc_submit(engine);
749
	}
750
unlock:
751
	spin_unlock_irq(&engine->timeline->lock);
752 753
}

754
static void guc_submission_tasklet(unsigned long data)
755
{
756
	struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
757 758
	struct intel_engine_execlists * const execlists = &engine->execlists;
	struct execlist_port *port = execlists->port;
759 760
	struct drm_i915_gem_request *rq;

761 762 763 764
	rq = port_request(&port[0]);
	while (rq && i915_gem_request_completed(rq)) {
		trace_i915_gem_request_out(rq);
		i915_gem_request_put(rq);
765

766
		execlists_port_complete(execlists, port);
767

768 769
		rq = port_request(&port[0]);
	}
770 771
	if (!rq)
		execlists_clear_active(execlists, EXECLISTS_ACTIVE_USER);
772

773 774 775 776 777 778 779 780 781 782 783 784 785
	if (execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT) &&
	    intel_read_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX) ==
	    GUC_PREEMPT_FINISHED) {
		execlists_cancel_port_requests(&engine->execlists);
		execlists_unwind_incomplete_requests(execlists);

		wait_for_guc_preempt_report(engine);

		execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
		intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
	}

	if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT))
786
		guc_dequeue(engine);
787 788
}

789 790 791
/*
 * Everything below here is concerned with setup & teardown, and is
 * therefore not part of the somewhat time-critical batch-submission
792
 * path of guc_submit() above.
793 794
 */

795
/* Check that a doorbell register is in the expected state */
796
static bool doorbell_ok(struct intel_guc *guc, u16 db_id)
797 798
{
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
799 800 801 802 803 804 805
	u32 drbregl;
	bool valid;

	GEM_BUG_ON(db_id >= GUC_DOORBELL_INVALID);

	drbregl = I915_READ(GEN8_DRBREGL(db_id));
	valid = drbregl & GEN8_DRB_VALID;
806

807
	if (test_bit(db_id, guc->doorbell_bitmap) == valid)
808 809
		return true;

810 811
	DRM_DEBUG_DRIVER("Doorbell %d has unexpected state (0x%x): valid=%s\n",
			 db_id, drbregl, yesno(valid));
812 813 814 815

	return false;
}

816
static bool guc_verify_doorbells(struct intel_guc *guc)
817
{
818
	u16 db_id;
819 820 821 822 823 824 825 826 827 828

	for (db_id = 0; db_id < GUC_NUM_DOORBELLS; ++db_id)
		if (!doorbell_ok(guc, db_id))
			return false;

	return true;
}

static int guc_clients_doorbell_init(struct intel_guc *guc)
{
829
	int ret;
830

831
	ret = create_doorbell(guc->execbuf_client);
832 833 834
	if (ret)
		return ret;

835 836 837 838 839 840
	if (guc->preempt_client) {
		ret = create_doorbell(guc->preempt_client);
		if (ret) {
			destroy_doorbell(guc->execbuf_client);
			return ret;
		}
841
	}
842 843

	return 0;
844 845
}

846 847 848 849 850 851 852
static void guc_clients_doorbell_fini(struct intel_guc *guc)
{
	/*
	 * By the time we're here, GuC has already been reset.
	 * Instead of trying (in vain) to communicate with it, let's just
	 * cleanup the doorbell HW and our internal state.
	 */
853 854 855 856 857
	if (guc->preempt_client) {
		__destroy_doorbell(guc->preempt_client);
		__update_doorbell_desc(guc->preempt_client,
				       GUC_DOORBELL_INVALID);
	}
858 859 860 861
	__destroy_doorbell(guc->execbuf_client);
	__update_doorbell_desc(guc->execbuf_client, GUC_DOORBELL_INVALID);
}

862
/**
863
 * guc_client_alloc() - Allocate an intel_guc_client
864
 * @dev_priv:	driver private data structure
865
 * @engines:	The set of engines to enable for this client
866
 * @priority:	four levels priority _CRITICAL, _HIGH, _NORMAL and _LOW
867 868 869
 *		The kernel client to replace ExecList submission is created with
 *		NORMAL priority. Priority of a client for scheduler can be HIGH,
 *		while a preemption context can use CRITICAL.
A
Alex Dai 已提交
870
 * @ctx:	the context that owns the client (we use the default render
871
 *		context)
872
 *
873
 * Return:	An intel_guc_client object if success, else NULL.
874
 */
875
static struct intel_guc_client *
876
guc_client_alloc(struct drm_i915_private *dev_priv,
877 878
		 u32 engines,
		 u32 priority,
879
		 struct i915_gem_context *ctx)
880
{
881
	struct intel_guc_client *client;
882
	struct intel_guc *guc = &dev_priv->guc;
883
	struct i915_vma *vma;
884
	void *vaddr;
885
	int ret;
886 887 888

	client = kzalloc(sizeof(*client), GFP_KERNEL);
	if (!client)
889
		return ERR_PTR(-ENOMEM);
890 891

	client->guc = guc;
892
	client->owner = ctx;
893 894
	client->engines = engines;
	client->priority = priority;
895 896
	client->doorbell_id = GUC_DOORBELL_INVALID;
	spin_lock_init(&client->wq_lock);
897

898
	ret = ida_simple_get(&guc->stage_ids, 0, GUC_MAX_STAGE_DESCRIPTORS,
899
			     GFP_KERNEL);
900 901 902
	if (ret < 0)
		goto err_client;

903
	client->stage_id = ret;
904 905

	/* The first page is doorbell/proc_desc. Two followed pages are wq. */
906
	vma = intel_guc_allocate_vma(guc, GUC_DB_SIZE + GUC_WQ_SIZE);
907 908 909 910
	if (IS_ERR(vma)) {
		ret = PTR_ERR(vma);
		goto err_id;
	}
911

912
	/* We'll keep just the first (doorbell/proc) page permanently kmap'd. */
913
	client->vma = vma;
914 915

	vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
916 917 918 919
	if (IS_ERR(vaddr)) {
		ret = PTR_ERR(vaddr);
		goto err_vma;
	}
920
	client->vaddr = vaddr;
921

922
	client->doorbell_offset = __select_cacheline(guc);
923 924 925 926 927 928 929 930 931 932 933

	/*
	 * Since the doorbell only requires a single cacheline, we can save
	 * space by putting the application process descriptor in the same
	 * page. Use the half of the page that doesn't include the doorbell.
	 */
	if (client->doorbell_offset >= (GUC_DB_SIZE / 2))
		client->proc_desc_offset = 0;
	else
		client->proc_desc_offset = (GUC_DB_SIZE / 2);

934
	guc_proc_desc_init(guc, client);
935
	guc_stage_desc_init(guc, client);
936

937
	ret = reserve_doorbell(client);
938 939
	if (ret)
		goto err_vaddr;
940

941 942
	DRM_DEBUG_DRIVER("new priority %u client %p for engine(s) 0x%x: stage_id %u\n",
			 priority, client, client->engines, client->stage_id);
943 944
	DRM_DEBUG_DRIVER("doorbell id %u, cacheline offset 0x%lx\n",
			 client->doorbell_id, client->doorbell_offset);
945 946

	return client;
947 948 949

err_vaddr:
	i915_gem_object_unpin_map(client->vma->obj);
950 951 952
err_vma:
	i915_vma_unpin_and_release(&client->vma);
err_id:
953
	ida_simple_remove(&guc->stage_ids, client->stage_id);
954 955 956
err_client:
	kfree(client);
	return ERR_PTR(ret);
957 958
}

959
static void guc_client_free(struct intel_guc_client *client)
960
{
961
	unreserve_doorbell(client);
962
	guc_stage_desc_fini(client->guc, client);
963 964
	i915_gem_object_unpin_map(client->vma->obj);
	i915_vma_unpin_and_release(&client->vma);
965
	ida_simple_remove(&client->guc->stage_ids, client->stage_id);
966 967 968
	kfree(client);
}

969 970 971
static int guc_clients_create(struct intel_guc *guc)
{
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
972
	struct intel_guc_client *client;
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003

	GEM_BUG_ON(guc->execbuf_client);
	GEM_BUG_ON(guc->preempt_client);

	client = guc_client_alloc(dev_priv,
				  INTEL_INFO(dev_priv)->ring_mask,
				  GUC_CLIENT_PRIORITY_KMD_NORMAL,
				  dev_priv->kernel_context);
	if (IS_ERR(client)) {
		DRM_ERROR("Failed to create GuC client for submission!\n");
		return PTR_ERR(client);
	}
	guc->execbuf_client = client;

	client = guc_client_alloc(dev_priv,
				  INTEL_INFO(dev_priv)->ring_mask,
				  GUC_CLIENT_PRIORITY_KMD_HIGH,
				  dev_priv->preempt_context);
	if (IS_ERR(client)) {
		DRM_ERROR("Failed to create GuC client for preemption!\n");
		guc_client_free(guc->execbuf_client);
		guc->execbuf_client = NULL;
		return PTR_ERR(client);
	}
	guc->preempt_client = client;

	return 0;
}

static void guc_clients_destroy(struct intel_guc *guc)
{
1004
	struct intel_guc_client *client;
1005 1006

	client = fetch_and_zero(&guc->preempt_client);
1007 1008 1009 1010
	if (client)
		guc_client_free(client);

	client = fetch_and_zero(&guc->execbuf_client);
1011 1012 1013
	guc_client_free(client);
}

1014
/*
1015 1016
 * Set up the memory resources to be shared with the GuC (via the GGTT)
 * at firmware loading time.
1017
 */
1018
int intel_guc_submission_init(struct intel_guc *guc)
1019
{
1020 1021 1022
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
	struct intel_engine_cs *engine;
	enum intel_engine_id id;
1023
	int ret;
1024

1025
	if (guc->stage_desc_pool)
1026
		return 0;
1027

1028 1029 1030
	ret = guc_stage_desc_pool_create(guc);
	if (ret)
		return ret;
1031 1032 1033 1034 1035
	/*
	 * Keep static analysers happy, let them know that we allocated the
	 * vma after testing that it didn't exist earlier.
	 */
	GEM_BUG_ON(!guc->stage_desc_pool);
1036

1037
	WARN_ON(!guc_verify_doorbells(guc));
1038 1039 1040 1041
	ret = guc_clients_create(guc);
	if (ret)
		return ret;

1042 1043 1044 1045 1046
	for_each_engine(engine, dev_priv, id) {
		guc->preempt_work[id].engine = engine;
		INIT_WORK(&guc->preempt_work[id].work, inject_preempt_context);
	}

1047
	return 0;
1048

1049 1050
}

1051
void intel_guc_submission_fini(struct intel_guc *guc)
1052
{
1053 1054 1055 1056 1057 1058 1059
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
	struct intel_engine_cs *engine;
	enum intel_engine_id id;

	for_each_engine(engine, dev_priv, id)
		cancel_work_sync(&guc->preempt_work[id].work);

1060
	guc_clients_destroy(guc);
1061 1062
	WARN_ON(!guc_verify_doorbells(guc));

1063
	guc_stage_desc_pool_destroy(guc);
1064 1065
}

1066 1067
static void guc_interrupts_capture(struct drm_i915_private *dev_priv)
{
1068
	struct intel_rps *rps = &dev_priv->gt_pm.rps;
1069 1070 1071 1072
	struct intel_engine_cs *engine;
	enum intel_engine_id id;
	int irqs;

1073 1074 1075
	/* tell all command streamers to forward interrupts (but not vblank)
	 * to GuC
	 */
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
	irqs = _MASKED_BIT_ENABLE(GFX_INTERRUPT_STEERING);
	for_each_engine(engine, dev_priv, id)
		I915_WRITE(RING_MODE_GEN7(engine), irqs);

	/* route USER_INTERRUPT to Host, all others are sent to GuC. */
	irqs = GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
	       GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT;
	/* These three registers have the same bit definitions */
	I915_WRITE(GUC_BCS_RCS_IER, ~irqs);
	I915_WRITE(GUC_VCS2_VCS1_IER, ~irqs);
	I915_WRITE(GUC_WD_VECS_IER, ~irqs);
1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106

	/*
	 * The REDIRECT_TO_GUC bit of the PMINTRMSK register directs all
	 * (unmasked) PM interrupts to the GuC. All other bits of this
	 * register *disable* generation of a specific interrupt.
	 *
	 * 'pm_intrmsk_mbz' indicates bits that are NOT to be set when
	 * writing to the PM interrupt mask register, i.e. interrupts
	 * that must not be disabled.
	 *
	 * If the GuC is handling these interrupts, then we must not let
	 * the PM code disable ANY interrupt that the GuC is expecting.
	 * So for each ENABLED (0) bit in this register, we must SET the
	 * bit in pm_intrmsk_mbz so that it's left enabled for the GuC.
	 * GuC needs ARAT expired interrupt unmasked hence it is set in
	 * pm_intrmsk_mbz.
	 *
	 * Here we CLEAR REDIRECT_TO_GUC bit in pm_intrmsk_mbz, which will
	 * result in the register bit being left SET!
	 */
1107 1108
	rps->pm_intrmsk_mbz |= ARAT_EXPIRED_INTRMSK;
	rps->pm_intrmsk_mbz &= ~GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC;
1109 1110
}

1111 1112
static void guc_interrupts_release(struct drm_i915_private *dev_priv)
{
1113
	struct intel_rps *rps = &dev_priv->gt_pm.rps;
1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
	struct intel_engine_cs *engine;
	enum intel_engine_id id;
	int irqs;

	/*
	 * tell all command streamers NOT to forward interrupts or vblank
	 * to GuC.
	 */
	irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_NEVER);
	irqs |= _MASKED_BIT_DISABLE(GFX_INTERRUPT_STEERING);
	for_each_engine(engine, dev_priv, id)
		I915_WRITE(RING_MODE_GEN7(engine), irqs);

	/* route all GT interrupts to the host */
	I915_WRITE(GUC_BCS_RCS_IER, 0);
	I915_WRITE(GUC_VCS2_VCS1_IER, 0);
	I915_WRITE(GUC_WD_VECS_IER, 0);

1132 1133
	rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC;
	rps->pm_intrmsk_mbz &= ~ARAT_EXPIRED_INTRMSK;
1134 1135
}

1136
static void guc_submission_park(struct intel_engine_cs *engine)
1137 1138 1139 1140
{
	intel_engine_unpin_breadcrumbs_irq(engine);
}

1141
static void guc_submission_unpark(struct intel_engine_cs *engine)
1142 1143 1144 1145
{
	intel_engine_pin_breadcrumbs_irq(engine);
}

1146
int intel_guc_submission_enable(struct intel_guc *guc)
1147
{
1148
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
1149
	struct intel_engine_cs *engine;
1150
	enum intel_engine_id id;
1151
	int err;
1152

1153 1154 1155 1156 1157 1158 1159 1160 1161
	/*
	 * We're using GuC work items for submitting work through GuC. Since
	 * we're coalescing multiple requests from a single context into a
	 * single work item prior to assigning it to execlist_port, we can
	 * never have more work items than the total number of ports (for all
	 * engines). The GuC firmware is controlling the HEAD of work queue,
	 * and it is guaranteed that it will remove the work item from the
	 * queue before our request is completed.
	 */
1162
	BUILD_BUG_ON(ARRAY_SIZE(engine->execlists.port) *
1163 1164 1165
		     sizeof(struct guc_wq_item) *
		     I915_NUM_ENGINES > GUC_WQ_SIZE);

1166 1167 1168
	GEM_BUG_ON(!guc->execbuf_client);

	guc_reset_wq(guc->execbuf_client);
1169 1170
	if (guc->preempt_client)
		guc_reset_wq(guc->preempt_client);
1171

1172 1173
	err = intel_guc_sample_forcewake(guc);
	if (err)
1174
		return err;
1175

1176
	err = guc_clients_doorbell_init(guc);
1177
	if (err)
1178
		return err;
A
Alex Dai 已提交
1179

1180
	/* Take over from manual control of ELSP (execlists) */
1181 1182 1183
	guc_interrupts_capture(dev_priv);

	for_each_engine(engine, dev_priv, id) {
1184 1185 1186
		struct intel_engine_execlists * const execlists =
			&engine->execlists;

1187
		execlists->tasklet.func = guc_submission_tasklet;
1188 1189
		engine->park = guc_submission_park;
		engine->unpark = guc_submission_unpark;
1190 1191

		engine->flags &= ~I915_ENGINE_SUPPORTS_STATS;
1192 1193
	}

1194 1195 1196
	return 0;
}

1197
void intel_guc_submission_disable(struct intel_guc *guc)
1198
{
1199
	struct drm_i915_private *dev_priv = guc_to_i915(guc);
1200

1201 1202
	GEM_BUG_ON(dev_priv->gt.awake); /* GT should be parked first */

1203
	guc_interrupts_release(dev_priv);
1204
	guc_clients_doorbell_fini(guc);
1205

1206
	/* Revert back to manual ELSP submission */
1207
	intel_engines_reset_default_submission(dev_priv);
1208
}
1209 1210 1211 1212

#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/intel_guc.c"
#endif