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]>
---
 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,
+                         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);
+               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

Reply via email to