1313#include "xe_guc.h"
1414#include "xe_guc_ct.h"
1515#include "xe_mmio.h"
16+ #include "xe_pm.h"
1617#include "xe_sriov.h"
1718#include "xe_trace.h"
1819#include "regs/xe_guc_regs.h"
@@ -41,6 +42,7 @@ __invalidation_fence_signal(struct xe_device *xe, struct xe_gt_tlb_invalidation_
4142 bool stack = test_bit (FENCE_STACK_BIT , & fence -> base .flags );
4243
4344 trace_xe_gt_tlb_invalidation_fence_signal (xe , fence );
45+ xe_gt_tlb_invalidation_fence_fini (fence );
4446 dma_fence_signal (& fence -> base );
4547 if (!stack )
4648 dma_fence_put (& fence -> base );
@@ -263,8 +265,10 @@ int xe_gt_tlb_invalidation_ggtt(struct xe_gt *gt)
263265
264266 xe_gt_tlb_invalidation_fence_init (gt , & fence , true);
265267 ret = xe_gt_tlb_invalidation_guc (gt , & fence );
266- if (ret < 0 )
268+ if (ret < 0 ) {
269+ xe_gt_tlb_invalidation_fence_fini (& fence );
267270 return ret ;
271+ }
268272
269273 xe_gt_tlb_invalidation_fence_wait (& fence );
270274 } else if (xe_device_uc_enabled (xe ) && !xe_device_wedged (xe )) {
@@ -489,12 +493,15 @@ static const struct dma_fence_ops invalidation_fence_ops = {
489493 * @fence: TLB invalidation fence to initialize
490494 * @stack: fence is stack variable
491495 *
492- * Initialize TLB invalidation fence for use
496+ * Initialize TLB invalidation fence for use. xe_gt_tlb_invalidation_fence_fini
497+ * must be called if fence is not signaled.
493498 */
494499void xe_gt_tlb_invalidation_fence_init (struct xe_gt * gt ,
495500 struct xe_gt_tlb_invalidation_fence * fence ,
496501 bool stack )
497502{
503+ xe_pm_runtime_get_noresume (gt_to_xe (gt ));
504+
498505 spin_lock_irq (& gt -> tlb_invalidation .lock );
499506 dma_fence_init (& fence -> base , & invalidation_fence_ops ,
500507 & gt -> tlb_invalidation .lock ,
@@ -505,4 +512,16 @@ void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
505512 set_bit (FENCE_STACK_BIT , & fence -> base .flags );
506513 else
507514 dma_fence_get (& fence -> base );
515+ fence -> gt = gt ;
516+ }
517+
518+ /**
519+ * xe_gt_tlb_invalidation_fence_fini - Finalize TLB invalidation fence
520+ * @fence: TLB invalidation fence to finalize
521+ *
522+ * Drop PM ref which fence took durinig init.
523+ */
524+ void xe_gt_tlb_invalidation_fence_fini (struct xe_gt_tlb_invalidation_fence * fence )
525+ {
526+ xe_pm_runtime_put (gt_to_xe (fence -> gt ));
508527}
0 commit comments