From: sashiko-bot@kernel.org
To: "Baihui Liang" <liangbaihui@linux.spacemit.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH] drm/imagination: retry runtime idle when firmware is not yet idle
Date: Thu, 29 Oct 2026 08:58:29 +0000 [thread overview]
Message-ID: <sashiko-outbox-188997@kernel.org> (raw)
In-Reply-To: <20261029-img-pm-autosuspend-v1-1-26851840a34e@linux.spacemit.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm/imagination: pvr_power_device_idle() bypasses idle check on autosuspend
--
commit 21bc022f1187eccd547ba4f832837505cc945974
Author: Baihui Liang <liangbaihui@linux.spacemit.com>
drm/imagination: retry runtime idle when firmware is not yet idle
This patch modifies pvr_power_device_idle() to call pm_runtime_autosuspend()
before returning -EBUSY when pvr_power_is_idle() returns false, aiming to
retry the idle check once the firmware reaches ROGUE_FWIF_POW_IDLE.
> diff --git a/drivers/gpu/drm/imagination/pvr_power.c b/drivers/gpu/drm/imagination/pvr_power.c
> index eb4b6ecdf4f4d..6f38249ffcb72 100644
> --- a/drivers/gpu/drm/imagination/pvr_power.c
> +++ b/drivers/gpu/drm/imagination/pvr_power.c
> @@ -434,7 +434,16 @@ pvr_power_device_idle(struct device *dev)
> struct drm_device *drm_dev = platform_get_drvdata(plat_dev);
> struct pvr_device *pvr_dev = to_pvr_device(drm_dev);
>
> - return pvr_power_is_idle(pvr_dev) ? 0 : -EBUSY;
> + if (pvr_power_is_idle(pvr_dev))
> + return 0;
> +
> + /*
> + * Firmware not yet idle; reject but schedule autosuspend so
> + * runtime_idle() can be retried.
> + */
> + pm_runtime_autosuspend(dev);
> +
> + return -EBUSY;
> }
[Severity: High]
Does calling pm_runtime_autosuspend() from pvr_power_device_idle() actually
retry the ->runtime_idle() callback, or does it bypass the idle check and run
pvr_power_device_suspend() directly?
Looking at pm_runtime_autosuspend() in include/linux/pm_runtime.h:
static inline int pm_runtime_autosuspend(struct device *dev)
{
pm_runtime_mark_last_busy(dev);
return __pm_runtime_suspend(dev, RPM_AUTO);
}
When pvr_power_device_idle() calls pm_runtime_autosuspend() because
pvr_power_is_idle() returned false (for example, when pvr_kccb_send_cmd()
in drivers/gpu/drm/imagination/pvr_ccb.c drops its runtime PM reference via
pvr_power_put() while a caller is still waiting in
pvr_kccb_wait_for_completion(), or while firmware has not yet transitioned
to ROGUE_FWIF_POW_IDLE), __pm_runtime_suspend(dev, RPM_AUTO) invokes
rpm_suspend(dev, RPM_AUTO).
When the autosuspend delay is non-zero, rpm_suspend() arms
dev->power.suspend_timer with dev->power.timer_autosuspends = 1, and
returning -EBUSY from pvr_power_device_idle() to rpm_idle() does not cancel
that timer. When the timer fires, pm_suspend_timer_fn() in
drivers/base/power/runtime.c runs:
if (expires > 0 && expires <= ktime_get_mono_fast_ns()) {
dev->power.timer_expires = 0;
rpm_suspend(dev, dev->power.timer_autosuspends ?
(RPM_ASYNC | RPM_AUTO) : RPM_ASYNC);
}
This queues RPM_REQ_AUTOSUSPEND on pm_wq, which calls rpm_suspend() ->
pvr_power_device_suspend() directly without calling rpm_idle() or
pvr_power_device_idle().
Because pvr_power_device_suspend() in drivers/gpu/drm/imagination/pvr_power.c
does not check pvr_power_is_idle():
int
pvr_power_device_suspend(struct device *dev)
{
...
if (READ_ONCE(pvr_dev->fw_dev.initialised)) {
err = pvr_power_fw_disable(pvr_dev, false, true);
won't the driver unconditionally disable firmware when the autosuspend timer
expires, even if the firmware or KCCB is still busy?
Furthermore, if pm_runtime_autosuspend_expiration() returns 0 when
pm_runtime_autosuspend() is called (for example, if autosuspend_delay_ms is
set to 0 via sysfs), __pm_runtime_suspend(dev, RPM_AUTO) is synchronous and
will execute pvr_power_device_suspend() immediately from inside
pvr_power_device_idle() right after pvr_power_is_idle() returned false.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261029-img-pm-autosuspend-v1-1-26851840a34e@linux.spacemit.com?part=1
prev parent reply other threads:[~2026-10-29 8:58 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 8:38 [PATCH] drm/imagination: retry runtime idle when firmware is not yet idle Baihui Liang
2026-10-29 8:38 ` Baihui Liang
2026-10-29 8:58 ` sashiko-bot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-188997@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=liangbaihui@linux.spacemit.com \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.