aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c22
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);
718int amdgpu_sync_rings(struct amdgpu_sync *sync, 718int amdgpu_sync_rings(struct amdgpu_sync *sync,
719 struct amdgpu_ring *ring); 719 struct amdgpu_ring *ring);
720struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
720int amdgpu_sync_wait(struct amdgpu_sync *sync); 721int amdgpu_sync_wait(struct amdgpu_sync *sync);
721void amdgpu_sync_free(struct amdgpu_device *adev, struct amdgpu_sync *sync, 722void 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
30static 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
30static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) 36static 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
77struct amd_sched_backend_ops amdgpu_sched_ops = { 83struct 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
205struct 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
205int amdgpu_sync_wait(struct amdgpu_sync *sync) 227int amdgpu_sync_wait(struct amdgpu_sync *sync)
206{ 228{
207 struct amdgpu_sync_entry *e; 229 struct amdgpu_sync_entry *e;