From: Liviu Dudau <liviu.dudau@arm.com>
To: Ketil Johnsen <ketil.johnsen@arm.com>
Cc: Boris Brezillon <boris.brezillon@collabora.com>,
Steven Price <steven.price@arm.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Daniel Almeida <daniel.almeida@collabora.com>,
Alice Ryhl <aliceryhl@google.com>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Florent Tomasin <florent.tomasin@arm.com>
Subject: Re: [PATCH v2 2/7] drm/panthor: Minor scheduler refactoring
Date: Thu, 30 Jul 2026 10:48:55 +0100 [thread overview]
Message-ID: <amseBzdpRBJtaz54@e142607> (raw)
In-Reply-To: <20260712135439.1546950-3-ketil.johnsen@arm.com>
On Sun, Jul 12, 2026 at 03:54:34PM +0200, Ketil Johnsen wrote:
> From: Florent Tomasin <florent.tomasin@arm.com>
>
> Refactor parts of the group scheduling logic into new helper functions.
> This will simplify addition of the protected mode feature.
>
> Remove redundant assignments of csg_slot.
>
> Signed-off-by: Florent Tomasin <florent.tomasin@arm.com>
> Co-developed-by: Ketil Johnsen <ketil.johnsen@arm.com>
> Signed-off-by: Ketil Johnsen <ketil.johnsen@arm.com>
> ---
> drivers/gpu/drm/panthor/panthor_sched.c | 126 ++++++++++++++----------
> 1 file changed, 74 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c
> index 5b34032deff81..465f1b86249f8 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.c
> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
> @@ -2267,12 +2267,75 @@ tick_ctx_cleanup(struct panthor_scheduler *sched,
> }
> }
>
> +static void
> +tick_ctx_evict_group(struct panthor_scheduler *sched,
> + struct panthor_csg_slots_upd_ctx *upd_ctx,
> + struct panthor_group *group)
> +{
> + struct panthor_device *ptdev = sched->ptdev;
> +
> + if (drm_WARN_ON(&ptdev->base, group->csg_id < 0))
> + return;
> +
> + csgs_upd_ctx_queue_reqs(ptdev, upd_ctx, group->csg_id,
> + group_can_run(group) ?
> + CSG_STATE_SUSPEND : CSG_STATE_TERMINATE,
> + CSG_STATE_MASK);
> +}
> +
> +static void
> +tick_ctx_reschedule_group(struct panthor_scheduler *sched,
I think the name of this function is misleading, as it doesn't reschedule anything,
just updates the CSG's priority information. Maybe call it tick_ctx_update_group_prio ?
> + struct panthor_csg_slots_upd_ctx *upd_ctx,
> + struct panthor_group *group,
> + int new_csg_prio)
> +{
> + struct panthor_device *ptdev = sched->ptdev;
> + struct panthor_fw_csg_iface *csg_iface;
> + struct panthor_csg_slot *csg_slot;
> +
> + if (group->csg_id < 0)
> + return;
> +
> + csg_iface = panthor_fw_get_csg_iface(ptdev, group->csg_id);
> + csg_slot = &sched->csg_slots[group->csg_id];
> +
> + if (csg_slot->priority != new_csg_prio) {
> + panthor_fw_update_reqs(csg_iface, endpoint_req,
> + CSG_EP_REQ_PRIORITY(new_csg_prio),
> + CSG_EP_REQ_PRIORITY_MASK);
As Steven mentioned, this should use panthor_fw_csg_endpoint_req_update() instead.
Best regards,
Liviu
> + csgs_upd_ctx_queue_reqs(ptdev, upd_ctx, group->csg_id,
> + csg_iface->output->ack ^ CSG_ENDPOINT_CONFIG,
> + CSG_ENDPOINT_CONFIG);
> + }
> +}
> +
> +static void
> +tick_ctx_schedule_group(struct panthor_scheduler *sched,
> + struct panthor_csg_slots_upd_ctx *upd_ctx,
> + struct panthor_group *group,
> + int csg_id, int csg_prio)
> +{
> + struct panthor_device *ptdev = sched->ptdev;
> + struct panthor_fw_csg_iface *csg_iface =
> + panthor_fw_get_csg_iface(ptdev, csg_id);
> +
> + group_bind_locked(group, csg_id);
> + csg_slot_prog_locked(ptdev, csg_id, csg_prio);
> +
> + csgs_upd_ctx_queue_reqs(ptdev, upd_ctx, csg_id,
> + group->state == PANTHOR_CS_GROUP_SUSPENDED ?
> + CSG_STATE_RESUME : CSG_STATE_START,
> + CSG_STATE_MASK);
> + csgs_upd_ctx_queue_reqs(ptdev, upd_ctx, csg_id,
> + csg_iface->output->ack ^ CSG_ENDPOINT_CONFIG,
> + CSG_ENDPOINT_CONFIG);
> +}
> +
> static void
> tick_ctx_apply(struct panthor_scheduler *sched, struct panthor_sched_tick_ctx *ctx)
> {
> struct panthor_group *group, *tmp;
> struct panthor_device *ptdev = sched->ptdev;
> - struct panthor_csg_slot *csg_slot;
> int prio, new_csg_prio = MAX_CSG_PRIO, i;
> u32 free_csg_slots = 0;
> struct panthor_csg_slots_upd_ctx upd_ctx;
> @@ -2282,44 +2345,13 @@ tick_ctx_apply(struct panthor_scheduler *sched, struct panthor_sched_tick_ctx *c
>
> for (prio = PANTHOR_CSG_PRIORITY_COUNT - 1; prio >= 0; prio--) {
> /* Suspend or terminate evicted groups. */
> - list_for_each_entry(group, &ctx->old_groups[prio], run_node) {
> - bool term = !group_can_run(group);
> - int csg_id = group->csg_id;
> -
> - if (drm_WARN_ON(&ptdev->base, csg_id < 0))
> - continue;
> -
> - csg_slot = &sched->csg_slots[csg_id];
> - csgs_upd_ctx_queue_reqs(ptdev, &upd_ctx, csg_id,
> - term ? CSG_STATE_TERMINATE : CSG_STATE_SUSPEND,
> - CSG_STATE_MASK);
> - }
> + list_for_each_entry(group, &ctx->old_groups[prio], run_node)
> + tick_ctx_evict_group(sched, &upd_ctx, group);
>
> /* Update priorities on already running groups. */
> - list_for_each_entry(group, &ctx->groups[prio], run_node) {
> - struct panthor_fw_csg_iface *csg_iface;
> - int csg_id = group->csg_id;
> -
> - if (csg_id < 0) {
> - new_csg_prio--;
> - continue;
> - }
> -
> - csg_slot = &sched->csg_slots[csg_id];
> - csg_iface = panthor_fw_get_csg_iface(ptdev, csg_id);
> - if (csg_slot->priority == new_csg_prio) {
> - new_csg_prio--;
> - continue;
> - }
> -
> - panthor_fw_csg_endpoint_req_update(ptdev, csg_iface,
> - CSG_EP_REQ_PRIORITY(new_csg_prio),
> - CSG_EP_REQ_PRIORITY_MASK);
> - csgs_upd_ctx_queue_reqs(ptdev, &upd_ctx, csg_id,
> - csg_iface->output->ack ^ CSG_ENDPOINT_CONFIG,
> - CSG_ENDPOINT_CONFIG);
> - new_csg_prio--;
> - }
> + list_for_each_entry(group, &ctx->groups[prio], run_node)
> + tick_ctx_reschedule_group(sched, &upd_ctx, group,
> + new_csg_prio--);
> }
>
> ret = csgs_upd_ctx_apply_locked(ptdev, &upd_ctx);
> @@ -2355,28 +2387,18 @@ tick_ctx_apply(struct panthor_scheduler *sched, struct panthor_sched_tick_ctx *c
> for (prio = PANTHOR_CSG_PRIORITY_COUNT - 1; prio >= 0; prio--) {
> list_for_each_entry(group, &ctx->groups[prio], run_node) {
> int csg_id = group->csg_id;
> - struct panthor_fw_csg_iface *csg_iface;
> + int csg_prio = new_csg_prio--;
>
> - if (csg_id >= 0) {
> - new_csg_prio--;
> + if (csg_id >= 0)
> continue;
> - }
>
> csg_id = ffs(free_csg_slots) - 1;
> if (drm_WARN_ON(&ptdev->base, csg_id < 0))
> break;
>
> - csg_iface = panthor_fw_get_csg_iface(ptdev, csg_id);
> - csg_slot = &sched->csg_slots[csg_id];
> - group_bind_locked(group, csg_id);
> - csg_slot_prog_locked(ptdev, csg_id, new_csg_prio--);
> - csgs_upd_ctx_queue_reqs(ptdev, &upd_ctx, csg_id,
> - group->state == PANTHOR_CS_GROUP_SUSPENDED ?
> - CSG_STATE_RESUME : CSG_STATE_START,
> - CSG_STATE_MASK);
> - csgs_upd_ctx_queue_reqs(ptdev, &upd_ctx, csg_id,
> - csg_iface->output->ack ^ CSG_ENDPOINT_CONFIG,
> - CSG_ENDPOINT_CONFIG);
> + tick_ctx_schedule_group(sched, &upd_ctx, group, csg_id,
> + csg_prio);
> +
> free_csg_slots &= ~BIT(csg_id);
> }
> }
> --
> 2.43.0
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
next prev parent reply other threads:[~2026-07-30 9:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-12 13:54 [PATCH v2 0/7] drm/panthor: Protected mode support for Mali CSF GPUs Ketil Johnsen
2026-07-12 13:54 ` [PATCH v2 1/7] drm/panthor: De-duplicate FW memory section sync Ketil Johnsen
2026-07-22 15:59 ` Steven Price
2026-07-12 13:54 ` [PATCH v2 2/7] drm/panthor: Minor scheduler refactoring Ketil Johnsen
2026-07-24 14:57 ` Steven Price
2026-07-30 9:48 ` Liviu Dudau [this message]
2026-07-12 13:54 ` [PATCH v2 3/7] drm/panthor: Explicit expansion of locked VM region Ketil Johnsen
2026-07-13 6:56 ` Boris Brezillon
2026-07-30 10:47 ` Liviu Dudau
2026-07-12 13:54 ` [PATCH v2 4/7] drm/panthor: Pass drm_file instead of panthor_file Ketil Johnsen
2026-07-24 15:02 ` Steven Price
2026-07-12 13:54 ` [PATCH v2 5/7] drm/panthor: Don't allocate protm_suspend_buf Ketil Johnsen
2026-07-13 7:02 ` Boris Brezillon
2026-07-24 15:03 ` Steven Price
2026-07-30 10:50 ` Liviu Dudau
2026-07-12 13:54 ` [PATCH v2 6/7] drm/panthor: Add support for entering and exiting protected mode Ketil Johnsen
2026-07-13 8:37 ` Boris Brezillon
2026-07-12 13:54 ` [PATCH v2 7/7] drm/panthor: Expose protected rendering features Ketil Johnsen
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=amseBzdpRBJtaz54@e142607 \
--to=liviu.dudau@arm.com \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=boris.brezillon@collabora.com \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=florent.tomasin@arm.com \
--cc=ketil.johnsen@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=simona@ffwll.ch \
--cc=steven.price@arm.com \
--cc=tzimmermann@suse.de \
/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.