diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 7570f2439a11..4af92649c4a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -60,6 +60,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | |||
60 | (*job)->need_pipeline_sync = false; | 60 | (*job)->need_pipeline_sync = false; |
61 | 61 | ||
62 | amdgpu_sync_create(&(*job)->sync); | 62 | amdgpu_sync_create(&(*job)->sync); |
63 | amdgpu_sync_create(&(*job)->sched_sync); | ||
63 | 64 | ||
64 | return 0; | 65 | return 0; |
65 | } | 66 | } |
@@ -98,6 +99,7 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job) | |||
98 | 99 | ||
99 | dma_fence_put(job->fence); | 100 | dma_fence_put(job->fence); |
100 | amdgpu_sync_free(&job->sync); | 101 | amdgpu_sync_free(&job->sync); |
102 | amdgpu_sync_free(&job->sched_sync); | ||
101 | kfree(job); | 103 | kfree(job); |
102 | } | 104 | } |
103 | 105 | ||
@@ -107,6 +109,7 @@ void amdgpu_job_free(struct amdgpu_job *job) | |||
107 | 109 | ||
108 | dma_fence_put(job->fence); | 110 | dma_fence_put(job->fence); |
109 | amdgpu_sync_free(&job->sync); | 111 | amdgpu_sync_free(&job->sync); |
112 | amdgpu_sync_free(&job->sched_sync); | ||
110 | kfree(job); | 113 | kfree(job); |
111 | } | 114 | } |
112 | 115 | ||
@@ -139,10 +142,10 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
139 | struct amdgpu_vm *vm = job->vm; | 142 | struct amdgpu_vm *vm = job->vm; |
140 | 143 | ||
141 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync); | 144 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync); |
145 | int r; | ||
142 | 146 | ||
143 | while (fence == NULL && vm && !job->vm_id) { | 147 | while (fence == NULL && vm && !job->vm_id) { |
144 | struct amdgpu_ring *ring = job->ring; | 148 | struct amdgpu_ring *ring = job->ring; |
145 | int r; | ||
146 | 149 | ||
147 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, | 150 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, |
148 | &job->base.s_fence->finished, | 151 | &job->base.s_fence->finished, |
@@ -153,9 +156,11 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
153 | fence = amdgpu_sync_get_fence(&job->sync); | 156 | fence = amdgpu_sync_get_fence(&job->sync); |
154 | } | 157 | } |
155 | 158 | ||
156 | if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) | 159 | if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) { |
157 | job->need_pipeline_sync = true; | 160 | r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence); |
158 | 161 | if (r) | |
162 | DRM_ERROR("Error adding fence to sync (%d)\n", r); | ||
163 | } | ||
159 | return fence; | 164 | return fence; |
160 | } | 165 | } |
161 | 166 | ||