diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 22 |
3 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index aa2dcf578dd6..719506808b4a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -717,6 +717,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, | |||
717 | void *owner); | 717 | void *owner); |
718 | int amdgpu_sync_rings(struct amdgpu_sync *sync, | 718 | int amdgpu_sync_rings(struct amdgpu_sync *sync, |
719 | struct amdgpu_ring *ring); | 719 | struct amdgpu_ring *ring); |
720 | struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync); | ||
720 | int amdgpu_sync_wait(struct amdgpu_sync *sync); | 721 | int amdgpu_sync_wait(struct amdgpu_sync *sync); |
721 | void amdgpu_sync_free(struct amdgpu_device *adev, struct amdgpu_sync *sync, | 722 | void amdgpu_sync_free(struct amdgpu_device *adev, struct amdgpu_sync *sync, |
722 | struct fence *fence); | 723 | struct fence *fence); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index f93fb3541488..de98fbd2971e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
@@ -27,6 +27,12 @@ | |||
27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
29 | 29 | ||
30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *job) | ||
31 | { | ||
32 | struct amdgpu_job *sched_job = (struct amdgpu_job *)job; | ||
33 | return amdgpu_sync_get_fence(&sched_job->ibs->sync); | ||
34 | } | ||
35 | |||
30 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) | 36 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) |
31 | { | 37 | { |
32 | struct amdgpu_job *sched_job; | 38 | struct amdgpu_job *sched_job; |
@@ -75,6 +81,7 @@ static void amdgpu_sched_process_job(struct amd_sched_job *job) | |||
75 | } | 81 | } |
76 | 82 | ||
77 | struct amd_sched_backend_ops amdgpu_sched_ops = { | 83 | struct amd_sched_backend_ops amdgpu_sched_ops = { |
84 | .dependency = amdgpu_sched_dependency, | ||
78 | .run_job = amdgpu_sched_run_job, | 85 | .run_job = amdgpu_sched_run_job, |
79 | .process_job = amdgpu_sched_process_job | 86 | .process_job = amdgpu_sched_process_job |
80 | }; | 87 | }; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 4fffb2539331..69b7d4540c6e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | |||
@@ -202,6 +202,28 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, | |||
202 | return r; | 202 | return r; |
203 | } | 203 | } |
204 | 204 | ||
205 | struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync) | ||
206 | { | ||
207 | struct amdgpu_sync_entry *e; | ||
208 | struct hlist_node *tmp; | ||
209 | struct fence *f; | ||
210 | int i; | ||
211 | |||
212 | hash_for_each_safe(sync->fences, i, tmp, e, node) { | ||
213 | |||
214 | f = e->fence; | ||
215 | |||
216 | hash_del(&e->node); | ||
217 | kfree(e); | ||
218 | |||
219 | if (!fence_is_signaled(f)) | ||
220 | return f; | ||
221 | |||
222 | fence_put(f); | ||
223 | } | ||
224 | return NULL; | ||
225 | } | ||
226 | |||
205 | int amdgpu_sync_wait(struct amdgpu_sync *sync) | 227 | int amdgpu_sync_wait(struct amdgpu_sync *sync) |
206 | { | 228 | { |
207 | struct amdgpu_sync_entry *e; | 229 | struct amdgpu_sync_entry *e; |