xref: /linux/drivers/gpu/drm/xe/xe_gt.c (revision d53b8e36925256097a08d7cb749198d85cbf9b2b)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #include "xe_gt.h"
7 
8 #include <linux/minmax.h>
9 
10 #include <drm/drm_managed.h>
11 #include <drm/xe_drm.h>
12 
13 #include <generated/xe_wa_oob.h>
14 
15 #include <generated/xe_wa_oob.h>
16 
17 #include "instructions/xe_gfxpipe_commands.h"
18 #include "instructions/xe_mi_commands.h"
19 #include "regs/xe_gt_regs.h"
20 #include "xe_assert.h"
21 #include "xe_bb.h"
22 #include "xe_bo.h"
23 #include "xe_device.h"
24 #include "xe_exec_queue.h"
25 #include "xe_execlist.h"
26 #include "xe_force_wake.h"
27 #include "xe_ggtt.h"
28 #include "xe_gsc.h"
29 #include "xe_gt_ccs_mode.h"
30 #include "xe_gt_clock.h"
31 #include "xe_gt_freq.h"
32 #include "xe_gt_idle.h"
33 #include "xe_gt_mcr.h"
34 #include "xe_gt_pagefault.h"
35 #include "xe_gt_printk.h"
36 #include "xe_gt_sriov_pf.h"
37 #include "xe_gt_sysfs.h"
38 #include "xe_gt_tlb_invalidation.h"
39 #include "xe_gt_topology.h"
40 #include "xe_guc_exec_queue_types.h"
41 #include "xe_guc_pc.h"
42 #include "xe_hw_fence.h"
43 #include "xe_hw_engine_class_sysfs.h"
44 #include "xe_irq.h"
45 #include "xe_lmtt.h"
46 #include "xe_lrc.h"
47 #include "xe_map.h"
48 #include "xe_migrate.h"
49 #include "xe_mmio.h"
50 #include "xe_pat.h"
51 #include "xe_pcode.h"
52 #include "xe_pm.h"
53 #include "xe_mocs.h"
54 #include "xe_reg_sr.h"
55 #include "xe_ring_ops.h"
56 #include "xe_sa.h"
57 #include "xe_sched_job.h"
58 #include "xe_sriov.h"
59 #include "xe_tuning.h"
60 #include "xe_uc.h"
61 #include "xe_uc_fw.h"
62 #include "xe_vm.h"
63 #include "xe_wa.h"
64 #include "xe_wopcm.h"
65 
66 static void gt_fini(struct drm_device *drm, void *arg)
67 {
68 	struct xe_gt *gt = arg;
69 
70 	destroy_workqueue(gt->ordered_wq);
71 }
72 
73 struct xe_gt *xe_gt_alloc(struct xe_tile *tile)
74 {
75 	struct xe_gt *gt;
76 	int err;
77 
78 	gt = drmm_kzalloc(&tile_to_xe(tile)->drm, sizeof(*gt), GFP_KERNEL);
79 	if (!gt)
80 		return ERR_PTR(-ENOMEM);
81 
82 	gt->tile = tile;
83 	gt->ordered_wq = alloc_ordered_workqueue("gt-ordered-wq", 0);
84 
85 	err = drmm_add_action_or_reset(&gt_to_xe(gt)->drm, gt_fini, gt);
86 	if (err)
87 		return ERR_PTR(err);
88 
89 	return gt;
90 }
91 
92 void xe_gt_sanitize(struct xe_gt *gt)
93 {
94 	/*
95 	 * FIXME: if xe_uc_sanitize is called here, on TGL driver will not
96 	 * reload
97 	 */
98 	gt->uc.guc.submission_state.enabled = false;
99 }
100 
101 static void xe_gt_enable_host_l2_vram(struct xe_gt *gt)
102 {
103 	u32 reg;
104 	int err;
105 
106 	if (!XE_WA(gt, 16023588340))
107 		return;
108 
109 	err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
110 	if (WARN_ON(err))
111 		return;
112 
113 	if (!xe_gt_is_media_type(gt)) {
114 		xe_mmio_write32(gt, SCRATCH1LPFC, EN_L3_RW_CCS_CACHE_FLUSH);
115 		reg = xe_gt_mcr_unicast_read_any(gt, XE2_GAMREQSTRM_CTRL);
116 		reg |= CG_DIS_CNTLBUS;
117 		xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg);
118 	}
119 
120 	xe_gt_mcr_multicast_write(gt, XEHPC_L3CLOS_MASK(3), 0x3);
121 	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
122 }
123 
124 static void xe_gt_disable_host_l2_vram(struct xe_gt *gt)
125 {
126 	u32 reg;
127 	int err;
128 
129 	if (!XE_WA(gt, 16023588340))
130 		return;
131 
132 	if (xe_gt_is_media_type(gt))
133 		return;
134 
135 	err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
136 	if (WARN_ON(err))
137 		return;
138 
139 	reg = xe_gt_mcr_unicast_read_any(gt, XE2_GAMREQSTRM_CTRL);
140 	reg &= ~CG_DIS_CNTLBUS;
141 	xe_gt_mcr_multicast_write(gt, XE2_GAMREQSTRM_CTRL, reg);
142 
143 	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
144 }
145 
146 /**
147  * xe_gt_remove() - Clean up the GT structures before driver removal
148  * @gt: the GT object
149  *
150  * This function should only act on objects/structures that must be cleaned
151  * before the driver removal callback is complete and therefore can't be
152  * deferred to a drmm action.
153  */
154 void xe_gt_remove(struct xe_gt *gt)
155 {
156 	int i;
157 
158 	xe_uc_remove(&gt->uc);
159 
160 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i)
161 		xe_hw_fence_irq_finish(&gt->fence_irq[i]);
162 
163 	xe_gt_disable_host_l2_vram(gt);
164 }
165 
166 static void gt_reset_worker(struct work_struct *w);
167 
168 static int emit_nop_job(struct xe_gt *gt, struct xe_exec_queue *q)
169 {
170 	struct xe_sched_job *job;
171 	struct xe_bb *bb;
172 	struct dma_fence *fence;
173 	long timeout;
174 
175 	bb = xe_bb_new(gt, 4, false);
176 	if (IS_ERR(bb))
177 		return PTR_ERR(bb);
178 
179 	job = xe_bb_create_job(q, bb);
180 	if (IS_ERR(job)) {
181 		xe_bb_free(bb, NULL);
182 		return PTR_ERR(job);
183 	}
184 
185 	xe_sched_job_arm(job);
186 	fence = dma_fence_get(&job->drm.s_fence->finished);
187 	xe_sched_job_push(job);
188 
189 	timeout = dma_fence_wait_timeout(fence, false, HZ);
190 	dma_fence_put(fence);
191 	xe_bb_free(bb, NULL);
192 	if (timeout < 0)
193 		return timeout;
194 	else if (!timeout)
195 		return -ETIME;
196 
197 	return 0;
198 }
199 
200 /*
201  * Convert back from encoded value to type-safe, only to be used when reg.mcr
202  * is true
203  */
204 static struct xe_reg_mcr to_xe_reg_mcr(const struct xe_reg reg)
205 {
206 	return (const struct xe_reg_mcr){.__reg.raw = reg.raw };
207 }
208 
209 static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
210 {
211 	struct xe_reg_sr *sr = &q->hwe->reg_lrc;
212 	struct xe_reg_sr_entry *entry;
213 	unsigned long idx;
214 	struct xe_sched_job *job;
215 	struct xe_bb *bb;
216 	struct dma_fence *fence;
217 	long timeout;
218 	int count = 0;
219 
220 	if (q->hwe->class == XE_ENGINE_CLASS_RENDER)
221 		/* Big enough to emit all of the context's 3DSTATE */
222 		bb = xe_bb_new(gt, xe_gt_lrc_size(gt, q->hwe->class), false);
223 	else
224 		/* Just pick a large BB size */
225 		bb = xe_bb_new(gt, SZ_4K, false);
226 
227 	if (IS_ERR(bb))
228 		return PTR_ERR(bb);
229 
230 	xa_for_each(&sr->xa, idx, entry)
231 		++count;
232 
233 	if (count) {
234 		xe_gt_dbg(gt, "LRC WA %s save-restore batch\n", sr->name);
235 
236 		bb->cs[bb->len++] = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS(count);
237 
238 		xa_for_each(&sr->xa, idx, entry) {
239 			struct xe_reg reg = entry->reg;
240 			struct xe_reg_mcr reg_mcr = to_xe_reg_mcr(reg);
241 			u32 val;
242 
243 			/*
244 			 * Skip reading the register if it's not really needed
245 			 */
246 			if (reg.masked)
247 				val = entry->clr_bits << 16;
248 			else if (entry->clr_bits + 1)
249 				val = (reg.mcr ?
250 				       xe_gt_mcr_unicast_read_any(gt, reg_mcr) :
251 				       xe_mmio_read32(gt, reg)) & (~entry->clr_bits);
252 			else
253 				val = 0;
254 
255 			val |= entry->set_bits;
256 
257 			bb->cs[bb->len++] = reg.addr;
258 			bb->cs[bb->len++] = val;
259 			xe_gt_dbg(gt, "REG[0x%x] = 0x%08x", reg.addr, val);
260 		}
261 	}
262 
263 	xe_lrc_emit_hwe_state_instructions(q, bb);
264 
265 	job = xe_bb_create_job(q, bb);
266 	if (IS_ERR(job)) {
267 		xe_bb_free(bb, NULL);
268 		return PTR_ERR(job);
269 	}
270 
271 	xe_sched_job_arm(job);
272 	fence = dma_fence_get(&job->drm.s_fence->finished);
273 	xe_sched_job_push(job);
274 
275 	timeout = dma_fence_wait_timeout(fence, false, HZ);
276 	dma_fence_put(fence);
277 	xe_bb_free(bb, NULL);
278 	if (timeout < 0)
279 		return timeout;
280 	else if (!timeout)
281 		return -ETIME;
282 
283 	return 0;
284 }
285 
286 int xe_gt_record_default_lrcs(struct xe_gt *gt)
287 {
288 	struct xe_device *xe = gt_to_xe(gt);
289 	struct xe_hw_engine *hwe;
290 	enum xe_hw_engine_id id;
291 	int err = 0;
292 
293 	for_each_hw_engine(hwe, gt, id) {
294 		struct xe_exec_queue *q, *nop_q;
295 		void *default_lrc;
296 
297 		if (gt->default_lrc[hwe->class])
298 			continue;
299 
300 		xe_reg_sr_init(&hwe->reg_lrc, hwe->name, xe);
301 		xe_wa_process_lrc(hwe);
302 		xe_hw_engine_setup_default_lrc_state(hwe);
303 		xe_tuning_process_lrc(hwe);
304 
305 		default_lrc = drmm_kzalloc(&xe->drm,
306 					   xe_gt_lrc_size(gt, hwe->class),
307 					   GFP_KERNEL);
308 		if (!default_lrc)
309 			return -ENOMEM;
310 
311 		q = xe_exec_queue_create(xe, NULL, BIT(hwe->logical_instance), 1,
312 					 hwe, EXEC_QUEUE_FLAG_KERNEL, 0);
313 		if (IS_ERR(q)) {
314 			err = PTR_ERR(q);
315 			xe_gt_err(gt, "hwe %s: xe_exec_queue_create failed (%pe)\n",
316 				  hwe->name, q);
317 			return err;
318 		}
319 
320 		/* Prime golden LRC with known good state */
321 		err = emit_wa_job(gt, q);
322 		if (err) {
323 			xe_gt_err(gt, "hwe %s: emit_wa_job failed (%pe) guc_id=%u\n",
324 				  hwe->name, ERR_PTR(err), q->guc->id);
325 			goto put_exec_queue;
326 		}
327 
328 		nop_q = xe_exec_queue_create(xe, NULL, BIT(hwe->logical_instance),
329 					     1, hwe, EXEC_QUEUE_FLAG_KERNEL, 0);
330 		if (IS_ERR(nop_q)) {
331 			err = PTR_ERR(nop_q);
332 			xe_gt_err(gt, "hwe %s: nop xe_exec_queue_create failed (%pe)\n",
333 				  hwe->name, nop_q);
334 			goto put_exec_queue;
335 		}
336 
337 		/* Switch to different LRC */
338 		err = emit_nop_job(gt, nop_q);
339 		if (err) {
340 			xe_gt_err(gt, "hwe %s: nop emit_nop_job failed (%pe) guc_id=%u\n",
341 				  hwe->name, ERR_PTR(err), nop_q->guc->id);
342 			goto put_nop_q;
343 		}
344 
345 		/* Reload golden LRC to record the effect of any indirect W/A */
346 		err = emit_nop_job(gt, q);
347 		if (err) {
348 			xe_gt_err(gt, "hwe %s: emit_nop_job failed (%pe) guc_id=%u\n",
349 				  hwe->name, ERR_PTR(err), q->guc->id);
350 			goto put_nop_q;
351 		}
352 
353 		xe_map_memcpy_from(xe, default_lrc,
354 				   &q->lrc[0]->bo->vmap,
355 				   xe_lrc_pphwsp_offset(q->lrc[0]),
356 				   xe_gt_lrc_size(gt, hwe->class));
357 
358 		gt->default_lrc[hwe->class] = default_lrc;
359 put_nop_q:
360 		xe_exec_queue_put(nop_q);
361 put_exec_queue:
362 		xe_exec_queue_put(q);
363 		if (err)
364 			break;
365 	}
366 
367 	return err;
368 }
369 
370 int xe_gt_init_early(struct xe_gt *gt)
371 {
372 	int err;
373 
374 	if (IS_SRIOV_PF(gt_to_xe(gt))) {
375 		err = xe_gt_sriov_pf_init_early(gt);
376 		if (err)
377 			return err;
378 	}
379 
380 	xe_reg_sr_init(&gt->reg_sr, "GT", gt_to_xe(gt));
381 
382 	err = xe_wa_init(gt);
383 	if (err)
384 		return err;
385 
386 	xe_wa_process_gt(gt);
387 	xe_wa_process_oob(gt);
388 	xe_tuning_process_gt(gt);
389 
390 	xe_force_wake_init_gt(gt, gt_to_fw(gt));
391 	xe_pcode_init(gt);
392 	spin_lock_init(&gt->global_invl_lock);
393 
394 	return 0;
395 }
396 
397 static void dump_pat_on_error(struct xe_gt *gt)
398 {
399 	struct drm_printer p;
400 	char prefix[32];
401 
402 	snprintf(prefix, sizeof(prefix), "[GT%u Error]", gt->info.id);
403 	p = drm_dbg_printer(&gt_to_xe(gt)->drm, DRM_UT_DRIVER, prefix);
404 
405 	xe_pat_dump(gt, &p);
406 }
407 
408 static int gt_fw_domain_init(struct xe_gt *gt)
409 {
410 	int err, i;
411 
412 	err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
413 	if (err)
414 		goto err_hw_fence_irq;
415 
416 	if (!xe_gt_is_media_type(gt)) {
417 		err = xe_ggtt_init(gt_to_tile(gt)->mem.ggtt);
418 		if (err)
419 			goto err_force_wake;
420 		if (IS_SRIOV_PF(gt_to_xe(gt)))
421 			xe_lmtt_init(&gt_to_tile(gt)->sriov.pf.lmtt);
422 	}
423 
424 	/* Enable per hw engine IRQs */
425 	xe_irq_enable_hwe(gt);
426 
427 	/* Rerun MCR init as we now have hw engine list */
428 	xe_gt_mcr_init(gt);
429 
430 	err = xe_hw_engines_init_early(gt);
431 	if (err)
432 		goto err_force_wake;
433 
434 	err = xe_hw_engine_class_sysfs_init(gt);
435 	if (err)
436 		goto err_force_wake;
437 
438 	/* Initialize CCS mode sysfs after early initialization of HW engines */
439 	err = xe_gt_ccs_mode_sysfs_init(gt);
440 	if (err)
441 		goto err_force_wake;
442 
443 	/*
444 	 * Stash hardware-reported version.  Since this register does not exist
445 	 * on pre-MTL platforms, reading it there will (correctly) return 0.
446 	 */
447 	gt->info.gmdid = xe_mmio_read32(gt, GMD_ID);
448 
449 	err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
450 	XE_WARN_ON(err);
451 
452 	return 0;
453 
454 err_force_wake:
455 	dump_pat_on_error(gt);
456 	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
457 err_hw_fence_irq:
458 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i)
459 		xe_hw_fence_irq_finish(&gt->fence_irq[i]);
460 
461 	return err;
462 }
463 
464 static int all_fw_domain_init(struct xe_gt *gt)
465 {
466 	int err, i;
467 
468 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
469 	if (err)
470 		goto err_hw_fence_irq;
471 
472 	xe_gt_mcr_set_implicit_defaults(gt);
473 	xe_reg_sr_apply_mmio(&gt->reg_sr, gt);
474 
475 	err = xe_gt_clock_init(gt);
476 	if (err)
477 		goto err_force_wake;
478 
479 	xe_mocs_init(gt);
480 	err = xe_execlist_init(gt);
481 	if (err)
482 		goto err_force_wake;
483 
484 	err = xe_hw_engines_init(gt);
485 	if (err)
486 		goto err_force_wake;
487 
488 	err = xe_uc_init_post_hwconfig(&gt->uc);
489 	if (err)
490 		goto err_force_wake;
491 
492 	if (!xe_gt_is_media_type(gt)) {
493 		/*
494 		 * USM has its only SA pool to non-block behind user operations
495 		 */
496 		if (gt_to_xe(gt)->info.has_usm) {
497 			struct xe_device *xe = gt_to_xe(gt);
498 
499 			gt->usm.bb_pool = xe_sa_bo_manager_init(gt_to_tile(gt),
500 								IS_DGFX(xe) ? SZ_1M : SZ_512K, 16);
501 			if (IS_ERR(gt->usm.bb_pool)) {
502 				err = PTR_ERR(gt->usm.bb_pool);
503 				goto err_force_wake;
504 			}
505 		}
506 	}
507 
508 	if (!xe_gt_is_media_type(gt)) {
509 		struct xe_tile *tile = gt_to_tile(gt);
510 
511 		tile->migrate = xe_migrate_init(tile);
512 		if (IS_ERR(tile->migrate)) {
513 			err = PTR_ERR(tile->migrate);
514 			goto err_force_wake;
515 		}
516 	}
517 
518 	err = xe_uc_init_hw(&gt->uc);
519 	if (err)
520 		goto err_force_wake;
521 
522 	/* Configure default CCS mode of 1 engine with all resources */
523 	if (xe_gt_ccs_mode_enabled(gt)) {
524 		gt->ccs_mode = 1;
525 		xe_gt_apply_ccs_mode(gt);
526 	}
527 
528 	if (IS_SRIOV_PF(gt_to_xe(gt)) && !xe_gt_is_media_type(gt))
529 		xe_lmtt_init_hw(&gt_to_tile(gt)->sriov.pf.lmtt);
530 
531 	if (IS_SRIOV_PF(gt_to_xe(gt)))
532 		xe_gt_sriov_pf_init_hw(gt);
533 
534 	err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
535 	XE_WARN_ON(err);
536 
537 	return 0;
538 
539 err_force_wake:
540 	xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
541 err_hw_fence_irq:
542 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i)
543 		xe_hw_fence_irq_finish(&gt->fence_irq[i]);
544 
545 	return err;
546 }
547 
548 /*
549  * Initialize enough GT to be able to load GuC in order to obtain hwconfig and
550  * enable CTB communication.
551  */
552 int xe_gt_init_hwconfig(struct xe_gt *gt)
553 {
554 	int err;
555 
556 	err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
557 	if (err)
558 		goto out;
559 
560 	xe_gt_mcr_init_early(gt);
561 	xe_pat_init(gt);
562 
563 	err = xe_uc_init(&gt->uc);
564 	if (err)
565 		goto out_fw;
566 
567 	err = xe_uc_init_hwconfig(&gt->uc);
568 	if (err)
569 		goto out_fw;
570 
571 	xe_gt_topology_init(gt);
572 	xe_gt_mcr_init(gt);
573 	xe_gt_enable_host_l2_vram(gt);
574 
575 out_fw:
576 	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
577 out:
578 	return err;
579 }
580 
581 int xe_gt_init(struct xe_gt *gt)
582 {
583 	int err;
584 	int i;
585 
586 	INIT_WORK(&gt->reset.worker, gt_reset_worker);
587 
588 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i) {
589 		gt->ring_ops[i] = xe_ring_ops_get(gt, i);
590 		xe_hw_fence_irq_init(&gt->fence_irq[i]);
591 	}
592 
593 	err = xe_gt_tlb_invalidation_init(gt);
594 	if (err)
595 		return err;
596 
597 	err = xe_gt_pagefault_init(gt);
598 	if (err)
599 		return err;
600 
601 	xe_mocs_init_early(gt);
602 
603 	err = xe_gt_sysfs_init(gt);
604 	if (err)
605 		return err;
606 
607 	err = gt_fw_domain_init(gt);
608 	if (err)
609 		return err;
610 
611 	err = xe_gt_idle_init(&gt->gtidle);
612 	if (err)
613 		return err;
614 
615 	err = xe_gt_freq_init(gt);
616 	if (err)
617 		return err;
618 
619 	xe_force_wake_init_engines(gt, gt_to_fw(gt));
620 
621 	err = all_fw_domain_init(gt);
622 	if (err)
623 		return err;
624 
625 	xe_gt_record_user_engines(gt);
626 
627 	return 0;
628 }
629 
630 void xe_gt_record_user_engines(struct xe_gt *gt)
631 {
632 	struct xe_hw_engine *hwe;
633 	enum xe_hw_engine_id id;
634 
635 	gt->user_engines.mask = 0;
636 	memset(gt->user_engines.instances_per_class, 0,
637 	       sizeof(gt->user_engines.instances_per_class));
638 
639 	for_each_hw_engine(hwe, gt, id) {
640 		if (xe_hw_engine_is_reserved(hwe))
641 			continue;
642 
643 		gt->user_engines.mask |= BIT_ULL(id);
644 		gt->user_engines.instances_per_class[hwe->class]++;
645 	}
646 
647 	xe_gt_assert(gt, (gt->user_engines.mask | gt->info.engine_mask)
648 		     == gt->info.engine_mask);
649 }
650 
651 static int do_gt_reset(struct xe_gt *gt)
652 {
653 	int err;
654 
655 	xe_gsc_wa_14015076503(gt, true);
656 
657 	xe_mmio_write32(gt, GDRST, GRDOM_FULL);
658 	err = xe_mmio_wait32(gt, GDRST, GRDOM_FULL, 0, 5000, NULL, false);
659 	if (err)
660 		xe_gt_err(gt, "failed to clear GRDOM_FULL (%pe)\n",
661 			  ERR_PTR(err));
662 
663 	xe_gsc_wa_14015076503(gt, false);
664 
665 	return err;
666 }
667 
668 static int vf_gt_restart(struct xe_gt *gt)
669 {
670 	int err;
671 
672 	err = xe_uc_sanitize_reset(&gt->uc);
673 	if (err)
674 		return err;
675 
676 	err = xe_uc_init_hw(&gt->uc);
677 	if (err)
678 		return err;
679 
680 	err = xe_uc_start(&gt->uc);
681 	if (err)
682 		return err;
683 
684 	return 0;
685 }
686 
687 static int do_gt_restart(struct xe_gt *gt)
688 {
689 	struct xe_hw_engine *hwe;
690 	enum xe_hw_engine_id id;
691 	int err;
692 
693 	if (IS_SRIOV_VF(gt_to_xe(gt)))
694 		return vf_gt_restart(gt);
695 
696 	xe_pat_init(gt);
697 
698 	xe_gt_enable_host_l2_vram(gt);
699 
700 	xe_gt_mcr_set_implicit_defaults(gt);
701 	xe_reg_sr_apply_mmio(&gt->reg_sr, gt);
702 
703 	err = xe_wopcm_init(&gt->uc.wopcm);
704 	if (err)
705 		return err;
706 
707 	for_each_hw_engine(hwe, gt, id)
708 		xe_hw_engine_enable_ring(hwe);
709 
710 	err = xe_uc_sanitize_reset(&gt->uc);
711 	if (err)
712 		return err;
713 
714 	err = xe_uc_init_hw(&gt->uc);
715 	if (err)
716 		return err;
717 
718 	if (IS_SRIOV_PF(gt_to_xe(gt)) && !xe_gt_is_media_type(gt))
719 		xe_lmtt_init_hw(&gt_to_tile(gt)->sriov.pf.lmtt);
720 
721 	if (IS_SRIOV_PF(gt_to_xe(gt)))
722 		xe_gt_sriov_pf_init_hw(gt);
723 
724 	xe_mocs_init(gt);
725 	err = xe_uc_start(&gt->uc);
726 	if (err)
727 		return err;
728 
729 	for_each_hw_engine(hwe, gt, id) {
730 		xe_reg_sr_apply_mmio(&hwe->reg_sr, gt);
731 		xe_reg_sr_apply_whitelist(hwe);
732 	}
733 
734 	/* Get CCS mode in sync between sw/hw */
735 	xe_gt_apply_ccs_mode(gt);
736 
737 	/* Restore GT freq to expected values */
738 	xe_gt_sanitize_freq(gt);
739 
740 	if (IS_SRIOV_PF(gt_to_xe(gt)))
741 		xe_gt_sriov_pf_restart(gt);
742 
743 	return 0;
744 }
745 
746 static int gt_reset(struct xe_gt *gt)
747 {
748 	int err;
749 
750 	if (xe_device_wedged(gt_to_xe(gt)))
751 		return -ECANCELED;
752 
753 	/* We only support GT resets with GuC submission */
754 	if (!xe_device_uc_enabled(gt_to_xe(gt)))
755 		return -ENODEV;
756 
757 	xe_gt_info(gt, "reset started\n");
758 
759 	if (xe_fault_inject_gt_reset()) {
760 		err = -ECANCELED;
761 		goto err_fail;
762 	}
763 
764 	xe_pm_runtime_get(gt_to_xe(gt));
765 	xe_gt_sanitize(gt);
766 
767 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
768 	if (err)
769 		goto err_msg;
770 
771 	xe_uc_gucrc_disable(&gt->uc);
772 	xe_uc_stop_prepare(&gt->uc);
773 	xe_gt_pagefault_reset(gt);
774 
775 	xe_uc_stop(&gt->uc);
776 
777 	xe_gt_tlb_invalidation_reset(gt);
778 
779 	err = do_gt_reset(gt);
780 	if (err)
781 		goto err_out;
782 
783 	err = do_gt_restart(gt);
784 	if (err)
785 		goto err_out;
786 
787 	err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
788 	XE_WARN_ON(err);
789 	xe_pm_runtime_put(gt_to_xe(gt));
790 
791 	xe_gt_info(gt, "reset done\n");
792 
793 	return 0;
794 
795 err_out:
796 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
797 err_msg:
798 	XE_WARN_ON(xe_uc_start(&gt->uc));
799 	xe_pm_runtime_put(gt_to_xe(gt));
800 err_fail:
801 	xe_gt_err(gt, "reset failed (%pe)\n", ERR_PTR(err));
802 
803 	xe_device_declare_wedged(gt_to_xe(gt));
804 
805 	return err;
806 }
807 
808 static void gt_reset_worker(struct work_struct *w)
809 {
810 	struct xe_gt *gt = container_of(w, typeof(*gt), reset.worker);
811 
812 	gt_reset(gt);
813 }
814 
815 void xe_gt_reset_async(struct xe_gt *gt)
816 {
817 	xe_gt_info(gt, "trying reset\n");
818 
819 	/* Don't do a reset while one is already in flight */
820 	if (!xe_fault_inject_gt_reset() && xe_uc_reset_prepare(&gt->uc))
821 		return;
822 
823 	xe_gt_info(gt, "reset queued\n");
824 	queue_work(gt->ordered_wq, &gt->reset.worker);
825 }
826 
827 void xe_gt_suspend_prepare(struct xe_gt *gt)
828 {
829 	XE_WARN_ON(xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL));
830 
831 	xe_uc_stop_prepare(&gt->uc);
832 
833 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
834 }
835 
836 int xe_gt_suspend(struct xe_gt *gt)
837 {
838 	int err;
839 
840 	xe_gt_dbg(gt, "suspending\n");
841 	xe_gt_sanitize(gt);
842 
843 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
844 	if (err)
845 		goto err_msg;
846 
847 	err = xe_uc_suspend(&gt->uc);
848 	if (err)
849 		goto err_force_wake;
850 
851 	xe_gt_idle_disable_pg(gt);
852 
853 	xe_gt_disable_host_l2_vram(gt);
854 
855 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
856 	xe_gt_dbg(gt, "suspended\n");
857 
858 	return 0;
859 
860 err_force_wake:
861 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
862 err_msg:
863 	xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(err));
864 
865 	return err;
866 }
867 
868 /**
869  * xe_gt_sanitize_freq() - Restore saved frequencies if necessary.
870  * @gt: the GT object
871  *
872  * Called after driver init/GSC load completes to restore GT frequencies if we
873  * limited them for any WAs.
874  */
875 int xe_gt_sanitize_freq(struct xe_gt *gt)
876 {
877 	int ret = 0;
878 
879 	if ((!xe_uc_fw_is_available(&gt->uc.gsc.fw) ||
880 	     xe_uc_fw_is_loaded(&gt->uc.gsc.fw)) && XE_WA(gt, 22019338487))
881 		ret = xe_guc_pc_restore_stashed_freq(&gt->uc.guc.pc);
882 
883 	return ret;
884 }
885 
886 int xe_gt_resume(struct xe_gt *gt)
887 {
888 	int err;
889 
890 	xe_gt_dbg(gt, "resuming\n");
891 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
892 	if (err)
893 		goto err_msg;
894 
895 	err = do_gt_restart(gt);
896 	if (err)
897 		goto err_force_wake;
898 
899 	xe_gt_idle_enable_pg(gt);
900 
901 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
902 	xe_gt_dbg(gt, "resumed\n");
903 
904 	return 0;
905 
906 err_force_wake:
907 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
908 err_msg:
909 	xe_gt_err(gt, "resume failed (%pe)\n", ERR_PTR(err));
910 
911 	return err;
912 }
913 
914 struct xe_hw_engine *xe_gt_hw_engine(struct xe_gt *gt,
915 				     enum xe_engine_class class,
916 				     u16 instance, bool logical)
917 {
918 	struct xe_hw_engine *hwe;
919 	enum xe_hw_engine_id id;
920 
921 	for_each_hw_engine(hwe, gt, id)
922 		if (hwe->class == class &&
923 		    ((!logical && hwe->instance == instance) ||
924 		    (logical && hwe->logical_instance == instance)))
925 			return hwe;
926 
927 	return NULL;
928 }
929 
930 struct xe_hw_engine *xe_gt_any_hw_engine_by_reset_domain(struct xe_gt *gt,
931 							 enum xe_engine_class class)
932 {
933 	struct xe_hw_engine *hwe;
934 	enum xe_hw_engine_id id;
935 
936 	for_each_hw_engine(hwe, gt, id) {
937 		switch (class) {
938 		case XE_ENGINE_CLASS_RENDER:
939 		case XE_ENGINE_CLASS_COMPUTE:
940 			if (hwe->class == XE_ENGINE_CLASS_RENDER ||
941 			    hwe->class == XE_ENGINE_CLASS_COMPUTE)
942 				return hwe;
943 			break;
944 		default:
945 			if (hwe->class == class)
946 				return hwe;
947 		}
948 	}
949 
950 	return NULL;
951 }
952 
953 struct xe_hw_engine *xe_gt_any_hw_engine(struct xe_gt *gt)
954 {
955 	struct xe_hw_engine *hwe;
956 	enum xe_hw_engine_id id;
957 
958 	for_each_hw_engine(hwe, gt, id)
959 		return hwe;
960 
961 	return NULL;
962 }
963 
964 /**
965  * xe_gt_declare_wedged() - Declare GT wedged
966  * @gt: the GT object
967  *
968  * Wedge the GT which stops all submission, saves desired debug state, and
969  * cleans up anything which could timeout.
970  */
971 void xe_gt_declare_wedged(struct xe_gt *gt)
972 {
973 	xe_gt_assert(gt, gt_to_xe(gt)->wedged.mode);
974 
975 	xe_uc_declare_wedged(&gt->uc);
976 	xe_gt_tlb_invalidation_reset(gt);
977 }
978