Skip to content

Commit 2202eca

Browse files
Jonathan-CavittAndi Shyti
authored andcommitted
drm/i915: No TLB invalidation on suspended GT
In case of GT is suspended, don't allow submission of new TLB invalidation request and cancel all pending requests. The TLB entries will be invalidated either during GuC reload or on system resume. Signed-off-by: Fei Yang <[email protected]> Signed-off-by: Jonathan Cavitt <[email protected]> CC: John Harrison <[email protected]> Reviewed-by: Andi Shyti <[email protected]> Acked-by: Tvrtko Ursulin <[email protected]> Acked-by: Nirmoy Das <[email protected]> Signed-off-by: Andi Shyti <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent af58ee2 commit 2202eca

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

drivers/gpu/drm/i915/gt/uc/intel_guc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,4 +537,5 @@ int intel_guc_invalidate_tlb_engines(struct intel_guc *guc);
537537
int intel_guc_invalidate_tlb_guc(struct intel_guc *guc);
538538
int intel_guc_tlb_invalidation_done(struct intel_guc *guc,
539539
const u32 *payload, u32 len);
540+
void wake_up_all_tlb_invalidate(struct intel_guc *guc);
540541
#endif

drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,6 +1796,20 @@ static void __guc_reset_context(struct intel_context *ce, intel_engine_mask_t st
17961796
intel_context_put(parent);
17971797
}
17981798

1799+
void wake_up_all_tlb_invalidate(struct intel_guc *guc)
1800+
{
1801+
struct intel_guc_tlb_wait *wait;
1802+
unsigned long i;
1803+
1804+
if (!intel_guc_tlb_invalidation_is_available(guc))
1805+
return;
1806+
1807+
xa_lock_irq(&guc->tlb_lookup);
1808+
xa_for_each(&guc->tlb_lookup, i, wait)
1809+
wake_up(&wait->wq);
1810+
xa_unlock_irq(&guc->tlb_lookup);
1811+
}
1812+
17991813
void intel_guc_submission_reset(struct intel_guc *guc, intel_engine_mask_t stalled)
18001814
{
18011815
struct intel_context *ce;
@@ -1925,9 +1939,6 @@ void intel_guc_submission_cancel_requests(struct intel_guc *guc)
19251939

19261940
void intel_guc_submission_reset_finish(struct intel_guc *guc)
19271941
{
1928-
struct intel_guc_tlb_wait *wait;
1929-
unsigned long i;
1930-
19311942
/* Reset called during driver load or during wedge? */
19321943
if (unlikely(!guc_submission_initialized(guc) ||
19331944
intel_gt_is_wedged(guc_to_gt(guc)))) {
@@ -1951,12 +1962,7 @@ void intel_guc_submission_reset_finish(struct intel_guc *guc)
19511962
* The full GT reset will have cleared the TLB caches and flushed the
19521963
* G2H message queue; we can release all the blocked waiters.
19531964
*/
1954-
if (intel_guc_tlb_invalidation_is_available(guc)) {
1955-
xa_lock_irq(&guc->tlb_lookup);
1956-
xa_for_each(&guc->tlb_lookup, i, wait)
1957-
wake_up(&wait->wq);
1958-
xa_unlock_irq(&guc->tlb_lookup);
1959-
}
1965+
wake_up_all_tlb_invalidate(guc);
19601966
}
19611967

19621968
static void destroyed_worker_func(struct work_struct *w);

drivers/gpu/drm/i915/gt/uc/intel_uc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,8 @@ void intel_uc_suspend(struct intel_uc *uc)
688688
/* flush the GSC worker */
689689
intel_gsc_uc_flush_work(&uc->gsc);
690690

691+
wake_up_all_tlb_invalidate(guc);
692+
691693
if (!intel_guc_is_ready(guc)) {
692694
guc->interrupts.enabled = false;
693695
return;
@@ -736,6 +738,11 @@ static int __uc_resume(struct intel_uc *uc, bool enable_communication)
736738

737739
intel_gsc_uc_resume(&uc->gsc);
738740

741+
if (intel_guc_tlb_invalidation_is_available(guc)) {
742+
intel_guc_invalidate_tlb_engines(guc);
743+
intel_guc_invalidate_tlb_guc(guc);
744+
}
745+
739746
return 0;
740747
}
741748

0 commit comments

Comments
 (0)