[Intel-gfx] [PATCH v2 10/16] drm/i915/pxp: Enable PXP power management
Chris Wilson
chris at chris-wilson.co.uk
Wed Mar 3 22:52:12 UTC 2021
Quoting Daniele Ceraolo Spurio (2021-03-01 19:31:54)
> +int intel_pxp_runtime_resume(struct intel_pxp *pxp)
> +{
> + struct intel_gt *gt = pxp_to_gt(pxp);
> + int ret;
> +
> + if (!intel_pxp_is_enabled(pxp))
> + return 0;
> +
> + intel_pxp_irq_enable(pxp);
> + pxp->global_state_in_suspend = false;
> +
> + /*
> + * if the display loses power during runtime suspend it will cause the
> + * session to become invalid, so to be safe we always re-create it. The
> + * MEI module is still bound, so this is the same as a teardown event,
> + * hence we can just pretend we received the irq.
> + */
> + intel_pxp_mark_termination_in_progress(pxp);
> +
> + spin_lock_irq(>->irq_lock);
> + intel_pxp_irq_handler(pxp, GEN12_DISPLAY_PXP_STATE_TERMINATED_INTERRUPT);
> + spin_unlock_irq(>->irq_lock);
> +
> + return ret;
return random() ?
> diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
> index 488006a0cf39..bb981d38c2fe 100644
> --- a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
> +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c
> @@ -25,8 +25,14 @@ static bool intel_pxp_session_is_in_play(struct intel_pxp *pxp, u32 id)
> intel_wakeref_t wakeref;
> u32 sip = 0;
>
> - with_intel_runtime_pm(gt->uncore->rpm, wakeref)
> - sip = intel_uncore_read(gt->uncore, GEN12_KCR_SIP);
> + /* if we're suspended the session is considered off */
> + wakeref = intel_runtime_pm_get_if_in_use(gt->uncore->rpm);
> + if (!wakeref)
> + return false;
> +
> + sip = intel_uncore_read(gt->uncore, GEN12_KCR_SIP);
> +
> + intel_runtime_pm_put(gt->uncore->rpm, wakeref);
with_intel_runtime_pm_if_in_use(gt->uncore->rpm, wakeref)
sip = intel_uncore_read(gt->uncore, GEN12_KCR_SIP);
>
> return sip & BIT(id);
> }
> @@ -43,12 +49,18 @@ static int pxp_wait_for_session_state(struct intel_pxp *pxp, u32 id, bool in_pla
> u32 mask = BIT(id);
> int ret;
>
> - with_intel_runtime_pm(gt->uncore->rpm, wakeref)
> - ret = intel_wait_for_register(gt->uncore,
> - GEN12_KCR_SIP,
> - mask,
> - in_play ? mask : 0,
> - 100);
> + /* if we're suspended the session is considered off */
> + wakeref = intel_runtime_pm_get_if_in_use(gt->uncore->rpm);
> + if (!wakeref)
> + return in_play ? -ENODEV : 0;
> +
> + ret = intel_wait_for_register(gt->uncore,
> + GEN12_KCR_SIP,
> + mask,
> + in_play ? mask : 0,
> + 100);
> +
> + intel_runtime_pm_put(gt->uncore->rpm, wakeref);
Ditto
-Chris
More information about the Intel-gfx
mailing list