[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(&gt->irq_lock);
> +       intel_pxp_irq_handler(pxp, GEN12_DISPLAY_PXP_STATE_TERMINATED_INTERRUPT);
> +       spin_unlock_irq(&gt->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