forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/gpu/drm/etnaviv/etnaviv_sched.c
....@@ -3,7 +3,7 @@
33 * Copyright (C) 2017 Etnaviv Project
44 */
55
6
-#include <linux/kthread.h>
6
+#include <linux/moduleparam.h>
77
88 #include "etnaviv_drv.h"
99 #include "etnaviv_dump.h"
....@@ -89,12 +89,15 @@
8989 u32 dma_addr;
9090 int change;
9191
92
+ /* block scheduler */
93
+ drm_sched_stop(&gpu->sched, sched_job);
94
+
9295 /*
9396 * If the GPU managed to complete this jobs fence, the timout is
9497 * spurious. Bail out.
9598 */
9699 if (dma_fence_is_signaled(submit->out_fence))
97
- return;
100
+ goto out_no_timeout;
98101
99102 /*
100103 * If the GPU is still making forward progress on the front-end (which
....@@ -103,29 +106,32 @@
103106 */
104107 dma_addr = gpu_read(gpu, VIVS_FE_DMA_ADDRESS);
105108 change = dma_addr - gpu->hangcheck_dma_addr;
106
- if (change < 0 || change > 16) {
109
+ if (gpu->completed_fence != gpu->hangcheck_fence ||
110
+ change < 0 || change > 16) {
107111 gpu->hangcheck_dma_addr = dma_addr;
108
- schedule_delayed_work(&sched_job->work_tdr,
109
- sched_job->sched->timeout);
110
- return;
112
+ gpu->hangcheck_fence = gpu->completed_fence;
113
+ goto out_no_timeout;
111114 }
112115
113
- /* block scheduler */
114
- kthread_park(gpu->sched.thread);
115
- drm_sched_hw_job_reset(&gpu->sched, sched_job);
116
+ if(sched_job)
117
+ drm_sched_increase_karma(sched_job);
116118
117119 /* get the GPU back into the init state */
118
- etnaviv_core_dump(gpu);
120
+ etnaviv_core_dump(submit);
119121 etnaviv_gpu_recover_hang(gpu);
120122
123
+ drm_sched_resubmit_jobs(&gpu->sched);
124
+
125
+out_no_timeout:
121126 /* restart scheduler after GPU is usable again */
122
- drm_sched_job_recovery(&gpu->sched);
123
- kthread_unpark(gpu->sched.thread);
127
+ drm_sched_start(&gpu->sched, true);
124128 }
125129
126130 static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
127131 {
128132 struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job);
133
+
134
+ drm_sched_job_cleanup(sched_job);
129135
130136 etnaviv_submit_put(submit);
131137 }
....@@ -150,7 +156,7 @@
150156 mutex_lock(&submit->gpu->fence_lock);
151157
152158 ret = drm_sched_job_init(&submit->sched_job, sched_entity,
153
- submit->cmdbuf.ctx);
159
+ submit->ctx);
154160 if (ret)
155161 goto out_unlock;
156162
....@@ -159,6 +165,7 @@
159165 submit->out_fence, 0,
160166 INT_MAX, GFP_KERNEL);
161167 if (submit->out_fence_id < 0) {
168
+ drm_sched_job_cleanup(&submit->sched_job);
162169 ret = -ENOMEM;
163170 goto out_unlock;
164171 }