diff options
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler/gpu_scheduler.c')
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index 205cb887d023..2f5d1f0da8e5 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
@@ -192,14 +192,36 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, | |||
192 | kfifo_free(&entity->job_queue); | 192 | kfifo_free(&entity->job_queue); |
193 | } | 193 | } |
194 | 194 | ||
195 | static void amd_sched_entity_wakeup(struct fence *f, struct fence_cb *cb) | ||
196 | { | ||
197 | struct amd_sched_entity *entity = | ||
198 | container_of(cb, struct amd_sched_entity, cb); | ||
199 | entity->dependency = NULL; | ||
200 | fence_put(f); | ||
201 | amd_sched_wakeup(entity->scheduler); | ||
202 | } | ||
203 | |||
195 | static struct amd_sched_job * | 204 | static struct amd_sched_job * |
196 | amd_sched_entity_pop_job(struct amd_sched_entity *entity) | 205 | amd_sched_entity_pop_job(struct amd_sched_entity *entity) |
197 | { | 206 | { |
207 | struct amd_gpu_scheduler *sched = entity->scheduler; | ||
198 | struct amd_sched_job *job; | 208 | struct amd_sched_job *job; |
199 | 209 | ||
210 | if (ACCESS_ONCE(entity->dependency)) | ||
211 | return NULL; | ||
212 | |||
200 | if (!kfifo_out_peek(&entity->job_queue, &job, sizeof(job))) | 213 | if (!kfifo_out_peek(&entity->job_queue, &job, sizeof(job))) |
201 | return NULL; | 214 | return NULL; |
202 | 215 | ||
216 | while ((entity->dependency = sched->ops->dependency(job))) { | ||
217 | |||
218 | if (fence_add_callback(entity->dependency, &entity->cb, | ||
219 | amd_sched_entity_wakeup)) | ||
220 | fence_put(entity->dependency); | ||
221 | else | ||
222 | return NULL; | ||
223 | } | ||
224 | |||
203 | return job; | 225 | return job; |
204 | } | 226 | } |
205 | 227 | ||