drm/etnaviv: expedited MMU fault handling
authorLucas Stach <l.stach@pengutronix.de>
Wed, 7 Jun 2023 13:02:23 +0000 (15:02 +0200)
committerJaehoon Chung <jh80.chung@samsung.com>
Wed, 13 Mar 2024 06:58:56 +0000 (15:58 +0900)
The GPU is halted when it hits a MMU exception, so there is no point in
waiting for the job timeout to expire or try to work out if the GPU is
still making progress in the timeout handler, as we know that the GPU
won't make any more progress.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
(cherry picked from commit ad542ee013149aa3274550ae81074d97b3944849)
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.h
drivers/gpu/drm/etnaviv/etnaviv_sched.c

index 8ff3e7d11f380a0e2401e943afebee03a7f95fbc..65ee5b9bfb5e80fea531caf012eef29feb2798ab 100644 (file)
@@ -1523,6 +1523,8 @@ static irqreturn_t irq_handler(int irq, void *data)
 
                if (intr & VIVS_HI_INTR_ACKNOWLEDGE_MMU_EXCEPTION) {
                        dump_mmu_fault(gpu);
+                       gpu->state = ETNA_GPU_STATE_FAULT;
+                       drm_sched_fault(&gpu->sched);
                        intr &= ~VIVS_HI_INTR_ACKNOWLEDGE_MMU_EXCEPTION;
                }
 
index 9502152929adcc5c7900c3e7b76d018628b298ca..add41a8a1ea613f81be47aa9a6b879d8aafc4f72 100644 (file)
@@ -97,6 +97,7 @@ enum etnaviv_gpu_state {
        ETNA_GPU_STATE_RESET,
        ETNA_GPU_STATE_INITIALIZED,
        ETNA_GPU_STATE_RUNNING,
+       ETNA_GPU_STATE_FAULT,
 };
 
 struct etnaviv_gpu {
index 2dea74c2b8fc44f433f8aa1bc520e29b99645dd9..258a179c03288fcadc09cf3fe042fdd04d56cca8 100644 (file)
@@ -106,8 +106,9 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
         */
        dma_addr = gpu_read(gpu, VIVS_FE_DMA_ADDRESS);
        change = dma_addr - gpu->hangcheck_dma_addr;
-       if (gpu->completed_fence != gpu->hangcheck_fence ||
-           change < 0 || change > 16) {
+       if (gpu->state == ETNA_GPU_STATE_RUNNING &&
+           (gpu->completed_fence != gpu->hangcheck_fence ||
+            change < 0 || change > 16)) {
                gpu->hangcheck_dma_addr = dma_addr;
                gpu->hangcheck_fence = gpu->completed_fence;
                goto out_no_timeout;