]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/panthor: Report group as timedout when we fail to properly suspend
authorBoris Brezillon <boris.brezillon@collabora.com>
Tue, 29 Oct 2024 15:29:11 +0000 (16:29 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Wed, 30 Oct 2024 15:37:18 +0000 (16:37 +0100)
If we don't do that, the group is considered usable by userspace, but
all further GROUP_SUBMIT will fail with -EINVAL.

Changes in v3:
- Add R-bs

Changes in v2:
- New patch

Fixes: de8548813824 ("drm/panthor: Add the scheduler logical block")
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241029152912.270346-3-boris.brezillon@collabora.com
drivers/gpu/drm/panthor/panthor_sched.c

index 05119d9bb279364cebae4c1446b6e285e6404b21..9929e22f4d8d2e146e4ed6cbdd53a87d546334fc 100644 (file)
@@ -589,10 +589,11 @@ struct panthor_group {
         * @timedout: True when a timeout occurred on any of the queues owned by
         * this group.
         *
-        * Timeouts can be reported by drm_sched or by the FW. In any case, any
-        * timeout situation is unrecoverable, and the group becomes useless.
-        * We simply wait for all references to be dropped so we can release the
-        * group object.
+        * Timeouts can be reported by drm_sched or by the FW. If a reset is required,
+        * and the group can't be suspended, this also leads to a timeout. In any case,
+        * any timeout situation is unrecoverable, and the group becomes useless. We
+        * simply wait for all references to be dropped so we can release the group
+        * object.
         */
        bool timedout;
 
@@ -2640,6 +2641,12 @@ void panthor_sched_suspend(struct panthor_device *ptdev)
                csgs_upd_ctx_init(&upd_ctx);
                while (slot_mask) {
                        u32 csg_id = ffs(slot_mask) - 1;
+                       struct panthor_csg_slot *csg_slot = &sched->csg_slots[csg_id];
+
+                       /* We consider group suspension failures as fatal and flag the
+                        * group as unusable by setting timedout=true.
+                        */
+                       csg_slot->group->timedout = true;
 
                        csgs_upd_ctx_queue_reqs(ptdev, &upd_ctx, csg_id,
                                                CSG_STATE_TERMINATE,