return bound;
 }
 
+static int __pxp_global_teardown_final(struct intel_pxp *pxp)
+{
+       if (!pxp->arb_is_valid)
+               return 0;
+       /*
+        * To ensure synchronous and coherent session teardown completion
+        * in response to suspend or shutdown triggers, don't use a worker.
+        */
+       intel_pxp_mark_termination_in_progress(pxp);
+       intel_pxp_terminate(pxp, false);
+
+       if (!wait_for_completion_timeout(&pxp->termination, msecs_to_jiffies(250)))
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int __pxp_global_teardown_restart(struct intel_pxp *pxp)
+{
+       if (pxp->arb_is_valid)
+               return 0;
+       /*
+        * The arb-session is currently inactive and we are doing a reset and restart
+        * due to a runtime event. Use the worker that was designed for this.
+        */
+       pxp_queue_termination(pxp);
+
+       if (!wait_for_completion_timeout(&pxp->termination, msecs_to_jiffies(250)))
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+void intel_pxp_end(struct intel_pxp *pxp)
+{
+       struct drm_i915_private *i915 = pxp->ctrl_gt->i915;
+       intel_wakeref_t wakeref;
+
+       if (!intel_pxp_is_enabled(pxp))
+               return;
+
+       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
+
+       mutex_lock(&pxp->arb_mutex);
+
+       if (__pxp_global_teardown_final(pxp))
+               drm_dbg(&i915->drm, "PXP end timed out\n");
+
+       mutex_unlock(&pxp->arb_mutex);
+
+       intel_pxp_fini_hw(pxp);
+       intel_runtime_pm_put(&i915->runtime_pm, wakeref);
+}
+
 /*
  * the arb session is restarted from the irq work when we receive the
  * termination completion interrupt
 
        mutex_lock(&pxp->arb_mutex);
 
-       if (pxp->arb_is_valid)
-               goto unlock;
-
-       pxp_queue_termination(pxp);
-
-       if (!wait_for_completion_timeout(&pxp->termination,
-                                       msecs_to_jiffies(250))) {
-               ret = -ETIMEDOUT;
+       ret = __pxp_global_teardown_restart(pxp);
+       if (ret)
                goto unlock;
-       }
 
        /* make sure the compiler doesn't optimize the double access */
        barrier();
 
        return ret;
 }
 
-static void pxp_terminate(struct intel_pxp *pxp)
+void intel_pxp_terminate(struct intel_pxp *pxp, bool post_invalidation_needs_restart)
 {
        int ret;
 
-       pxp->hw_state_invalidated = true;
+       pxp->hw_state_invalidated = post_invalidation_needs_restart;
 
        /*
         * if we fail to submit the termination there is no point in waiting for
 
        if (events & PXP_TERMINATION_REQUEST) {
                events &= ~PXP_TERMINATION_COMPLETE;
-               pxp_terminate(pxp);
+               intel_pxp_terminate(pxp, true);
        }
 
        if (events & PXP_TERMINATION_COMPLETE)
 
 
 #ifdef CONFIG_DRM_I915_PXP
 void intel_pxp_session_management_init(struct intel_pxp *pxp);
+void intel_pxp_terminate(struct intel_pxp *pxp, bool post_invalidation_needs_restart);
 #else
 static inline void intel_pxp_session_management_init(struct intel_pxp *pxp)
 {
 }
+
+static inline void intel_pxp_terminate(struct intel_pxp *pxp, bool post_invalidation_needs_restart)
+{
+}
 #endif
 #endif /* __INTEL_PXP_SESSION_H__ */