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(>_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(>->uc); 159 160 for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i) 161 xe_hw_fence_irq_finish(>->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(>->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(>->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(>_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(>_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(>->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(>->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(>->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(>->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(>_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(>->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(>->uc); 564 if (err) 565 goto out_fw; 566 567 err = xe_uc_init_hwconfig(>->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(>->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(>->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(>->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(>->uc); 673 if (err) 674 return err; 675 676 err = xe_uc_init_hw(>->uc); 677 if (err) 678 return err; 679 680 err = xe_uc_start(>->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(>->reg_sr, gt); 702 703 err = xe_wopcm_init(>->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(>->uc); 711 if (err) 712 return err; 713 714 err = xe_uc_init_hw(>->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(>_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(>->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(>->uc); 772 xe_uc_stop_prepare(>->uc); 773 xe_gt_pagefault_reset(gt); 774 775 xe_uc_stop(>->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(>->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(>->uc)) 821 return; 822 823 xe_gt_info(gt, "reset queued\n"); 824 queue_work(gt->ordered_wq, >->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(>->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(>->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(>->uc.gsc.fw) || 880 xe_uc_fw_is_loaded(>->uc.gsc.fw)) && XE_WA(gt, 22019338487)) 881 ret = xe_guc_pc_restore_stashed_freq(>->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(>->uc); 976 xe_gt_tlb_invalidation_reset(gt); 977 } 978