drm/panthor: Force an immediate reset on unrecoverable faults
authorBoris Brezillon <boris.brezillon@collabora.com>
Thu, 2 May 2024 18:38:09 +0000 (20:38 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Mon, 13 May 2024 07:52:09 +0000 (09:52 +0200)
If the FW reports an unrecoverable fault, we need to reset the GPU
before we can start re-using it again.

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/20240502183813.1612017-2-boris.brezillon@collabora.com
drivers/gpu/drm/panthor/panthor_device.c
drivers/gpu/drm/panthor/panthor_device.h
drivers/gpu/drm/panthor/panthor_sched.c

index 75276cbeba208da8156ef8b31eec247bd855342e..4c5b54e7abb7b65b6c00391411b6ba05d72d436b 100644 (file)
@@ -293,6 +293,7 @@ static const struct panthor_exception_info panthor_exception_infos[] = {
        PANTHOR_EXCEPTION(ACTIVE),
        PANTHOR_EXCEPTION(CS_RES_TERM),
        PANTHOR_EXCEPTION(CS_CONFIG_FAULT),
+       PANTHOR_EXCEPTION(CS_UNRECOVERABLE),
        PANTHOR_EXCEPTION(CS_ENDPOINT_FAULT),
        PANTHOR_EXCEPTION(CS_BUS_FAULT),
        PANTHOR_EXCEPTION(CS_INSTR_INVALID),
index 2fdd671b38fd9bfef1a0b06ce7d8802e3da9cc19..e388c0472ba783ab777227595c4a8d155dbf65bb 100644 (file)
@@ -216,6 +216,7 @@ enum drm_panthor_exception_type {
        DRM_PANTHOR_EXCEPTION_CS_RES_TERM = 0x0f,
        DRM_PANTHOR_EXCEPTION_MAX_NON_FAULT = 0x3f,
        DRM_PANTHOR_EXCEPTION_CS_CONFIG_FAULT = 0x40,
+       DRM_PANTHOR_EXCEPTION_CS_UNRECOVERABLE = 0x41,
        DRM_PANTHOR_EXCEPTION_CS_ENDPOINT_FAULT = 0x44,
        DRM_PANTHOR_EXCEPTION_CS_BUS_FAULT = 0x48,
        DRM_PANTHOR_EXCEPTION_CS_INSTR_INVALID = 0x49,
index c126251c5ba7e1257ac29abe46b53960998395c7..e455e8445582a17296c7c49032f61ee51565d1fb 100644 (file)
@@ -1281,7 +1281,16 @@ cs_slot_process_fatal_event_locked(struct panthor_device *ptdev,
        if (group)
                group->fatal_queues |= BIT(cs_id);
 
-       sched_queue_delayed_work(sched, tick, 0);
+       if (CS_EXCEPTION_TYPE(fatal) == DRM_PANTHOR_EXCEPTION_CS_UNRECOVERABLE) {
+               /* If this exception is unrecoverable, queue a reset, and make
+                * sure we stop scheduling groups until the reset has happened.
+                */
+               panthor_device_schedule_reset(ptdev);
+               cancel_delayed_work(&sched->tick_work);
+       } else {
+               sched_queue_delayed_work(sched, tick, 0);
+       }
+
        drm_warn(&ptdev->base,
                 "CSG slot %d CS slot: %d\n"
                 "CS_FATAL.EXCEPTION_TYPE: 0x%x (%s)\n"