All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Karunika Choo" <karunika.choo@arm.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v1 24/27] drm/panthor: Route HW component PM through access windows
Date: Tue, 22 Sep 2026 21:06:39 +0000	[thread overview]
Message-ID: <20260922210640.0D0261F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260922204535.2850094-25-karunika.choo@arm.com>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] panthor: panthor_device_resume() incorrectly propagates -EAGAIN on AW race
- [High] panthor: post-yield worker accesses hardware with clocks disabled during system suspend
- [High] panthor: hardware fails to re-initialize on system resume if suspended while GPU_STOPPED
- [Medium] panthor: hardware components skip graceful teardown on runtime suspend race
- [Medium] panthor: pm_runtime_put_noidle() in post_yield_work stalls autosuspend indefinitely
--

commit 8aa28a6a344b704e733c2685619e190f808b85d0
Author: Karunika Choo <karunika.choo@arm.com>

drm/panthor: Route HW component PM through access windows

This commit makes access-window resume and suspend own GPU access when AW
support is present, while keeping the direct HW component PM path for older
GPUs. It also handles WINDOW_CLOSED and arbiter restart events and defers
post-yield cleanup to a workqueue context.

> diff --git a/drivers/gpu/drm/panthor/panthor_aw.c b/drivers/gpu/drm/panthor/panthor_aw.c
> index 40122bb4b83af..4fcfb3ad05073 100644
> --- a/drivers/gpu/drm/panthor/panthor_aw.c
> +++ b/drivers/gpu/drm/panthor/panthor_aw.c

[ ... ]

> @@ -118,6 +121,52 @@ static int panthor_aw_state_wait_transition(struct panthor_aw *aw, u32 timeout_m
>  		timeout_ms);
>  }
>  
> +static void panthor_aw_post_yield_work(struct work_struct *work)
> +{
> +	struct panthor_aw *aw =
> +		container_of(work, struct panthor_aw, post_yield_work);
> +	struct panthor_device *ptdev = aw->ptdev;
> +	struct device *dev = ptdev->base.dev;
> +	int ret;
> +
> +	/* Something else has progressed the state to READY. */
> +	if (atomic_read(&aw->state) != PANTHOR_AW_STATE_GPU_STOPPED)
> +		return;
> +
> +	/*
> +	 * Ensure in-progress resume is completed and prevent future RPM suspend
> +	 * to keep the clocks turned on when accessing HW registers.
> +	 */
> +	pm_runtime_get_noresume(dev);
> +	pm_runtime_barrier(dev);
> +
> +	ret = panthor_device_suspend_hw_components(ptdev);

[Severity: Medium]
If a WINDOW_CLOSED event queues panthor_aw_post_yield_work() and races with a
runtime suspend, could this skip the graceful hardware teardown?

Since panthor_aw_suspend() skips panthor_device_suspend_hw_components() when
the state is PANTHOR_AW_STATE_GPU_STOPPED, the clocks would be disabled and
the device becomes RPM_SUSPENDED. When this worker executes,
pm_runtime_get_noresume() does not wake the device. Will
panthor_device_suspend_hw_components() then see pm_runtime_suspended() as
true and skip the teardown entirely, leaving caches and firmware improperly
halted?

[Severity: High]
Could this worker also access hardware registers with clocks disabled during a
system suspend?

If a system suspend races with this worker, panthor_device_suspend() could call
panthor_aw_suspend(), which skips the teardown due to the GPU_STOPPED state.
Clocks are then disabled, but since system PM leaves the runtime status as
RPM_ACTIVE, panthor_device_suspend_hw_components() might proceed to access
hardware registers without clocks, potentially causing a bus fault.

> +	if (ret)
> +		dev_warn(dev, "Failed to suspend hardware components.");
> +
> +	panthor_aw_state_set(aw, PANTHOR_AW_STATE_READY);
> +
> +	/*
> +	 * schedule an immediate tick to re-evaluate if there is any additional
> +	 * work. This will request access to the GPU again and if the driver has
> +	 * gone idle, it will yield GPU access via the runtime suspend path.
> +	 */
> +	panthor_sched_resume(ptdev);
> +
> +	pm_runtime_put_noidle(dev);

[Severity: Medium]
Does pm_runtime_put_noidle() drop the PM reference without re-arming the
autosuspend timer?

If the autosuspend timer fires while the temporary reference is held in this
function, the suspend aborts due to a non-zero usage count. Using
pm_runtime_put_noidle() drops the usage count but does not queue an idle
notification. Could this leave the device actively powered on indefinitely
until another explicit PM transition occurs?

> +}

[ ... ]

> @@ -396,20 +531,45 @@ int panthor_aw_suspend(struct panthor_device *ptdev)
>  
>  	/* suspend hw components directly if AW is not supported */
>  	if (!aw)
> -		return 0;
> +		return panthor_device_suspend_hw_components(ptdev);
>  
>  	if (atomic_read(&aw->state) == PANTHOR_AW_STATE_READY)
>  		goto out_irq_suspend;
>  
> +	if (atomic_read(&aw->state) == PANTHOR_AW_STATE_GPU_GRANTED) {
> +		ret = panthor_device_suspend_hw_components(ptdev);
> +		if (ret)
> +			goto out_irq_suspend;
> +	}
> +
>  	if (panthor_aw_state_try_set(aw, PANTHOR_AW_STATE_GPU_GRANTED,
> -		PANTHOR_AW_STATE_GPU_STOPPED))
> +		PANTHOR_AW_STATE_STOPPED_IDLE)) {

[Severity: High]
If a system suspend occurs while aw->state is PANTHOR_AW_STATE_GPU_STOPPED,
could this fail to re-initialize the hardware on resume?

Since this skips panthor_device_suspend_hw_components(), the
ptdev->pm.hw_component_state remains PANTHOR_DEVICE_PM_STATE_ACTIVE.
During system resume, panthor_device_resume_hw_components() will check if the
state is ACTIVE and immediately return 0. Does this leave the firmware, MMU,
and GPU uninitialized after losing power in S3?

>  		ret = panthor_aw_yield(aw);

[ ... ]

> diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
> index 2ccd8ad6318d1..ea35c5e1d87b4 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.c
> +++ b/drivers/gpu/drm/panthor/panthor_device.c

[ ... ]

> @@ -577,11 +577,11 @@ int panthor_device_resume(struct device *dev)
>  			atomic_set(&ptdev->reset.pending, 0);
>  		}
>  
> -		ret = panthor_device_resume_hw_components(ptdev);
> +		ret = panthor_aw_resume(ptdev);
>  		if (ret && ptdev->reset.fast) {
>  			drm_err(&ptdev->base, "Fast reset failed, trying a slow reset");
>  			ptdev->reset.fast = false;
> -			ret = panthor_device_resume_hw_components(ptdev);
> +			ret = panthor_aw_resume(ptdev);
>  		}

[Severity: High]
Does panthor_device_resume() incorrectly propagate -EAGAIN on an AW race?

If a WINDOW_CLOSED event races with a runtime PM resume, panthor_aw_resume()
observes PANTHOR_AW_STATE_GPU_STOPPED and returns -EAGAIN. Propagating this
directly to the PM core here causes the runtime resume to fail entirely.

[ ... ]

> diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
> index 42c5052ac83b9..59bc48d05eb1e 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.h
> +++ b/drivers/gpu/drm/panthor/panthor_device.h

[ ... ]

> @@ -466,8 +467,18 @@ static inline int panthor_device_resume_and_get(struct panthor_device *ptdev)
>  	 * succeeded. Given resume errors are not expected, this is probably
>  	 * something we can live with.
>  	 */
> -	if (ret && atomic_cmpxchg(&ptdev->pm.recovery_needed, 1, 0) == 1)
> -		pm_runtime_set_suspended(ptdev->base.dev);
> +	if (ret) {
> +		if (atomic_cmpxchg(&ptdev->pm.recovery_needed, 1, 0) == 1)
> +			pm_runtime_set_suspended(ptdev->base.dev);
> +
> +		return ret;
> +	}
> +
> +	ret = panthor_aw_ensure_gpu_access(ptdev);

[Severity: High]
Does this early bailout bypass the intended retry logic?

Because panthor_device_resume() propagates the -EAGAIN failure directly,
the initial pm_runtime_resume_and_get() call fails and populates ret. Returning
ret here completely bypasses the panthor_aw_ensure_gpu_access() retry loop that
was specifically designed to handle the -EAGAIN state.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922204535.2850094-1-karunika.choo@arm.com?part=24

  reply	other threads:[~2026-09-22 21:06 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-22 20:44 [PATCH v1 00/27] drm/panthor: Add Mali v15 virtualization support Karunika Choo
2026-09-22 20:44 ` [PATCH v1 01/27] drm/panthor: Ignore -EOPNOTSUPP for shader-present nvmem lookup Karunika Choo
2026-09-22 20:44 ` [PATCH v1 02/27] drm/panthor: Move register access helpers out of panthor_device.h Karunika Choo
2026-09-22 20:54   ` sashiko-bot
2026-09-22 20:44 ` [PATCH v1 03/27] drm/panthor: Parse and store GPU_ID fields Karunika Choo
2026-09-22 20:56   ` sashiko-bot
2026-09-22 20:44 ` [PATCH v1 04/27] drm/panthor: Add 64-bit GPU_ID decoding for v15 GPUs Karunika Choo
2026-09-22 21:01   ` sashiko-bot
2026-09-22 23:23   ` Deborah Brouwer
2026-09-22 20:44 ` [PATCH v1 05/27] drm/panthor: Move register base offsets to the HW description Karunika Choo
2026-09-22 20:45 ` [PATCH v1 06/27] drm/panthor: Derive MMU AS register addresses from base and stride Karunika Choo
2026-09-22 21:00   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 07/27] dt-bindings: gpu: mali-valhall-csf: Add Mali Gen5 AM compatible Karunika Choo
2026-09-28 10:02   ` Krzysztof Kozlowski
2026-09-22 20:45 ` [PATCH v1 08/27] drm/panthor: Add Mali v15 hardware support Karunika Choo
2026-09-22 20:58   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 09/27] drm/panthor: Skip devfreq when no OPP table is present Karunika Choo
2026-09-22 20:45 ` [PATCH v1 10/27] dt-bindings: gpu: panthor: Document panthor-system bindings Karunika Choo
2026-09-22 20:56   ` sashiko-bot
2026-09-28 10:05   ` Krzysztof Kozlowski
2026-09-22 20:45 ` [PATCH v1 11/27] drm/panthor: Add AM_SYSTEM platform driver Karunika Choo
2026-09-22 20:59   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 12/27] dt-bindings: gpu: panthor: Document panthor-arbitration bindings Karunika Choo
2026-09-22 20:59   ` sashiko-bot
2026-09-28 10:06   ` Krzysztof Kozlowski
2026-09-22 20:45 ` [PATCH v1 13/27] drm/panthor: Add AM_PARTITION_CONTROL support Karunika Choo
2026-09-22 20:57   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 14/27] drm/panthor: Add AM message helpers Karunika Choo
2026-09-22 20:58   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 15/27] drm/panthor: Add AM_RESOURCE_GROUP support Karunika Choo
2026-09-22 20:56   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 16/27] drm/panthor: Add arbitration scheduler Karunika Choo
2026-09-22 21:00   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 17/27] drm/panthor: Route arbitration events Karunika Choo
2026-09-22 21:04   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 18/27] dt-bindings: gpu: panthor: Document AW assignment DT property Karunika Choo
2026-09-22 20:57   ` sashiko-bot
2026-09-28 10:06   ` Krzysztof Kozlowski
2026-09-22 20:45 ` [PATCH v1 19/27] drm/panthor: Add AW assignment tracking Karunika Choo
2026-09-22 20:45 ` [PATCH v1 20/27] drm/panthor: Handle partition control INVALID_COMMAND interrupt Karunika Choo
2026-09-22 21:04   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 21/27] drm/panthor: Request AW to yield GPU access on idle Karunika Choo
2026-09-22 21:07   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 22/27] drm/panthor: Add access-window support Karunika Choo
2026-09-22 21:05   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 23/27] drm/panthor: Synchronize HW component PM transitions Karunika Choo
2026-09-22 20:45 ` [PATCH v1 24/27] drm/panthor: Route HW component PM through access windows Karunika Choo
2026-09-22 21:06   ` sashiko-bot [this message]
2026-09-22 20:45 ` [PATCH v1 25/27] drm/panthor: Tolerate access-window loss during HW waits Karunika Choo
2026-09-22 21:14   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 26/27] drm/panthor: Prevent missed post-yield cleanup due to reset Karunika Choo
2026-09-22 21:12   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v1 27/27] drm/panthor: Release GPU access immediately for out-of-band grants Karunika Choo
2026-09-22 21:06   ` sashiko-bot

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=20260922210640.0D0261F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=karunika.choo@arm.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.