On Wed, May 13, 2026 at 9:59 AM Boris Brezillon <[email protected]> wrote: > > Overload the already existing pm_runtime_active_auto_try_enabled guard > with our custom guard that force the state to suspened (and thus clear > the runtime_error) in case the resume fails. > > Once done, we can replace the existing places where manual > panthor_device_resume_and_get()+pm_runtime_put_autosuspend() were > done by guards. This patch also replaces a pm_runtime_put call by pm_runtime_put_autosuspend, and removes redundant pm_runtime_mark_last_busy calls. Can we add another patch for the functionality change first?
> > Signed-off-by: Boris Brezillon <[email protected]> > --- > drivers/gpu/drm/panthor/panthor_device.h | 10 +++++++--- > drivers/gpu/drm/panthor/panthor_drv.c | 4 ++-- > drivers/gpu/drm/panthor/panthor_sched.c | 11 ++++------- > 3 files changed, 13 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/panthor/panthor_device.h > b/drivers/gpu/drm/panthor/panthor_device.h > index 1aaf06df875b..51527d2e2f77 100644 > --- a/drivers/gpu/drm/panthor/panthor_device.h > +++ b/drivers/gpu/drm/panthor/panthor_device.h > @@ -407,9 +407,10 @@ int panthor_device_mmap_io(struct panthor_device *ptdev, > int panthor_device_resume(struct device *dev); > int panthor_device_suspend(struct device *dev); > > -static inline int panthor_device_resume_and_get(struct panthor_device *ptdev) > +static inline int panthor_device_resume_and_get(struct device *dev) > { > - int ret = pm_runtime_resume_and_get(ptdev->base.dev); > + struct panthor_device *ptdev = dev_get_drvdata(dev); > + int ret = pm_runtime_resume_and_get(dev); > > /* If the resume failed, we need to clear the runtime_error, which > * can done by forcing the RPM state to suspended. If multiple > @@ -424,11 +425,14 @@ static inline int panthor_device_resume_and_get(struct > panthor_device *ptdev) > * something we can live with. > */ > if (ret && atomic_cmpxchg(&ptdev->pm.recovery_needed, 1, 0) == 1) > - pm_runtime_set_suspended(ptdev->base.dev); > + pm_runtime_set_suspended(dev); > > return ret; > } > > +DEFINE_GUARD_COND(pm_runtime_active_auto, _try_enabled_or_suspend, > + panthor_device_resume_and_get(_T), _RET == 0) > + > enum drm_panthor_exception_type { > DRM_PANTHOR_EXCEPTION_OK = 0x00, > DRM_PANTHOR_EXCEPTION_TERMINATED = 0x04, > diff --git a/drivers/gpu/drm/panthor/panthor_drv.c > b/drivers/gpu/drm/panthor/panthor_drv.c > index 789ddc0ff7ef..f2d60ff00896 100644 > --- a/drivers/gpu/drm/panthor/panthor_drv.c > +++ b/drivers/gpu/drm/panthor/panthor_drv.c > @@ -824,7 +824,8 @@ static int panthor_query_timestamp_info(struct > panthor_device *ptdev, > (flags & DRM_PANTHOR_TIMESTAMP_DURATION) || > (timestamp_types >= 2); > > - ret = panthor_device_resume_and_get(ptdev); > + ACQUIRE(pm_runtime_active_auto_try_enabled_or_suspend, > pm_guard)(ptdev->base.dev); > + ret = ACQUIRE_ERR(pm_runtime_active_auto_try_enabled_or_suspend, > &pm_guard); > if (ret) > return ret; > > @@ -894,7 +895,6 @@ static int panthor_query_timestamp_info(struct > panthor_device *ptdev, > arg->cpu_timestamp_nsec = 0; > } > > - pm_runtime_put(ptdev->base.dev); > return 0; > } > > diff --git a/drivers/gpu/drm/panthor/panthor_sched.c > b/drivers/gpu/drm/panthor/panthor_sched.c > index 9aa9941d2309..9afa38e87fc9 100644 > --- a/drivers/gpu/drm/panthor/panthor_sched.c > +++ b/drivers/gpu/drm/panthor/panthor_sched.c > @@ -2630,13 +2630,12 @@ static void tick_work(struct work_struct *work) > if (ACQUIRE_ERR(drm_dev_access, &dev_guard)) > return; > > - ret = panthor_device_resume_and_get(ptdev); > + ACQUIRE(pm_runtime_active_auto_try_enabled_or_suspend, > pm_guard)(ptdev->base.dev); > + ret = ACQUIRE_ERR(pm_runtime_active_auto_try_enabled_or_suspend, > &pm_guard); > if (drm_WARN_ON(&ptdev->base, ret)) > return; > > tick(sched); > - pm_runtime_mark_last_busy(ptdev->base.dev); > - pm_runtime_put_autosuspend(ptdev->base.dev); > } > > static int panthor_queue_eval_syncwait(struct panthor_group *group, u8 > queue_idx) > @@ -3359,7 +3358,8 @@ queue_run_job(struct drm_sched_job *sched_job) > return dma_fence_get(job->done_fence); > } > > - ret = panthor_device_resume_and_get(ptdev); > + ACQUIRE(pm_runtime_active_auto_try_enabled_or_suspend, > pm_guard)(ptdev->base.dev); > + ret = ACQUIRE_ERR(pm_runtime_active_auto_try_enabled_or_suspend, > &pm_guard); > if (drm_WARN_ON(&ptdev->base, ret)) > return ERR_PTR(ret); > > @@ -3367,9 +3367,6 @@ queue_run_job(struct drm_sched_job *sched_job) > done_fence = queue_run_job_locked(job); > } > > - pm_runtime_mark_last_busy(ptdev->base.dev); > - pm_runtime_put_autosuspend(ptdev->base.dev); > - > return done_fence; > } > > > -- > 2.54.0 >
