On Tue, 5 May 2026 16:05:11 +0200 Ketil Johnsen ketil.johnsen@arm.com 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 | 135 +++++++++++++++--------- 1 file changed, 86 insertions(+), 49 deletions(-)
diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c index 5ee386338005c..987072bd867c4 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -1934,6 +1934,12 @@ static void csgs_upd_ctx_init(struct panthor_csg_slots_upd_ctx *ctx) memset(ctx, 0, sizeof(*ctx)); } +static void csgs_upd_ctx_ring_doorbell(struct panthor_csg_slots_upd_ctx *ctx,
u32 csg_id)+{
- ctx->update_mask |= BIT(csg_id);
+}
static void csgs_upd_ctx_queue_reqs(struct panthor_device *ptdev, struct panthor_csg_slots_upd_ctx *ctx, u32 csg_id, u32 value, u32 mask) @@ -1944,7 +1950,8 @@ static void csgs_upd_ctx_queue_reqs(struct panthor_device *ptdev, ctx->requests[csg_id].value = (ctx->requests[csg_id].value & ~mask) | (value & mask); ctx->requests[csg_id].mask |= mask;
- ctx->update_mask |= BIT(csg_id);
- csgs_upd_ctx_ring_doorbell(ctx, csg_id);
} static int csgs_upd_ctx_apply_locked(struct panthor_device *ptdev, @@ -1961,8 +1968,12 @@ static int csgs_upd_ctx_apply_locked(struct panthor_device *ptdev, while (update_slots) { struct panthor_fw_csg_iface *csg_iface; u32 csg_id = ffs(update_slots) - 1;
u32 req_mask = ctx->requests[csg_id].mask;update_slots &= ~BIT(csg_id);
if (!req_mask)continue;
Looks like something that should be in patch 7, where you update the doorbell_req register, and then call csgs_upd_ctx_ring_doorbell(), meaning req_mask can be zero. The other option would be to teach panthor_csg_slots_upd_ctx about CS doorbells, and let csgs_upd_ctx_apply_locked() toggle the doorbell_req.
- csg_iface = panthor_fw_get_csg_iface(ptdev, csg_id); panthor_fw_update_reqs(csg_iface, req, ctx->requests[csg_id].value,
@@ -1979,6 +1990,9 @@ static int csgs_upd_ctx_apply_locked(struct panthor_device *ptdev, int ret; update_slots &= ~BIT(csg_id);
if (!req_mask)continue;- csg_iface = panthor_fw_get_csg_iface(ptdev, csg_id);
ret = panthor_fw_csg_wait_acks(ptdev, csg_id, req_mask, &acked, 100);