On Fri, 11 Sep 2026 13:40:10 +0200
Ketil Johnsen <[email protected]> wrote:

> From: Florent Tomasin <[email protected]>
> 
> 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 <[email protected]>
> Co-developed-by: Ketil Johnsen <[email protected]>
> Signed-off-by: Ketil Johnsen <[email protected]>

Reviewed-by: Boris Brezillon <[email protected]>

> 
> ---
> 
> v3:
> - Use panthor_fw_csg_endpoint_req_update() (was rebase mistake)
> - Function rename to tick_ctx_update_group_prio()
> 
> v2:
> - Moved option to ding only the CSG doorbell to later patch
> ---
>  drivers/gpu/drm/panthor/panthor_sched.c | 131 ++++++++++++++----------
>  1 file changed, 79 insertions(+), 52 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c 
> b/drivers/gpu/drm/panthor/panthor_sched.c
> index 60b2417deb81b..1123cf36a7bca 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.c
> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
> @@ -2344,12 +2344,81 @@ 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_update_group_prio(struct panthor_scheduler *sched,
> +                        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_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, group->csg_id,
> +                                     csg_iface->output->ack ^ 
> CSG_ENDPOINT_CONFIG,
> +                                     CSG_ENDPOINT_CONFIG);
> +     }
> +}
> +
> +static int
> +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);
> +     int ret;
> +
> +     ret = group_bind_locked(group, csg_id);
> +     if (ret)
> +             return ret;
> +
> +     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);
> +
> +     return 0;
> +}
> +
>  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;
> @@ -2359,44 +2428,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_update_group_prio(sched, &upd_ctx, group,
> +                                                new_csg_prio--);
>       }
>  
>       ret = csgs_upd_ctx_apply_locked(ptdev, &upd_ctx);
> @@ -2424,34 +2462,23 @@ 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];
> -                     ret = group_bind_locked(group, csg_id);
> +                     ret = tick_ctx_schedule_group(sched, &upd_ctx, group,
> +                                                   csg_id, csg_prio);
>                       if (ret) {
>                               panthor_device_schedule_reset(ptdev);
>                               ctx->csg_upd_failed_mask |= BIT(csg_id);
>                               return;
>                       }
>  
> -                     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);
>                       free_csg_slots &= ~BIT(csg_id);
>               }
>       }

Reply via email to