aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-02-08 06:13:05 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-02-10 14:17:24 -0500
commite86f9ceee19ec028ae79a09fe1eaabf315d67969 (patch)
tree5f9863ae2b5d30ff4dc3579d0395ea486d735d92 /drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
parent9f2ade33e659250a810e5bdab0c602085792d5b6 (diff)
drm/amdgpu: move sync into job object
No need to keep that for every IB. Signed-off-by: Christian König <christian.koenig@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 6f3e757e056e..0f6719e0ace0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -46,6 +46,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
46 (*job)->ibs = (void *)&(*job)[1]; 46 (*job)->ibs = (void *)&(*job)[1];
47 (*job)->num_ibs = num_ibs; 47 (*job)->num_ibs = num_ibs;
48 48
49 amdgpu_sync_create(&(*job)->sync);
50
49 return 0; 51 return 0;
50} 52}
51 53
@@ -73,6 +75,7 @@ void amdgpu_job_free(struct amdgpu_job *job)
73 amdgpu_ib_free(job->adev, &job->ibs[i]); 75 amdgpu_ib_free(job->adev, &job->ibs[i]);
74 76
75 amdgpu_bo_unref(&job->uf.bo); 77 amdgpu_bo_unref(&job->uf.bo);
78 amdgpu_sync_free(&job->sync);
76 kfree(job); 79 kfree(job);
77} 80}
78 81
@@ -99,23 +102,22 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
99static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) 102static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
100{ 103{
101 struct amdgpu_job *job = to_amdgpu_job(sched_job); 104 struct amdgpu_job *job = to_amdgpu_job(sched_job);
102 struct amdgpu_sync *sync = &job->ibs->sync;
103 struct amdgpu_vm *vm = job->ibs->vm; 105 struct amdgpu_vm *vm = job->ibs->vm;
104 106
105 struct fence *fence = amdgpu_sync_get_fence(sync); 107 struct fence *fence = amdgpu_sync_get_fence(&job->sync);
106 108
107 if (fence == NULL && vm && !job->ibs->grabbed_vmid) { 109 if (fence == NULL && vm && !job->ibs->grabbed_vmid) {
108 struct amdgpu_ring *ring = job->ring; 110 struct amdgpu_ring *ring = job->ring;
109 int r; 111 int r;
110 112
111 r = amdgpu_vm_grab_id(vm, ring, sync, 113 r = amdgpu_vm_grab_id(vm, ring, &job->sync,
112 &job->base.s_fence->base); 114 &job->base.s_fence->base);
113 if (r) 115 if (r)
114 DRM_ERROR("Error getting VM ID (%d)\n", r); 116 DRM_ERROR("Error getting VM ID (%d)\n", r);
115 else 117 else
116 job->ibs->grabbed_vmid = true; 118 job->ibs->grabbed_vmid = true;
117 119
118 fence = amdgpu_sync_get_fence(sync); 120 fence = amdgpu_sync_get_fence(&job->sync);
119 } 121 }
120 122
121 return fence; 123 return fence;
@@ -132,9 +134,16 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job)
132 return NULL; 134 return NULL;
133 } 135 }
134 job = to_amdgpu_job(sched_job); 136 job = to_amdgpu_job(sched_job);
137
138 r = amdgpu_sync_wait(&job->sync);
139 if (r) {
140 DRM_ERROR("failed to sync wait (%d)\n", r);
141 return NULL;
142 }
143
135 trace_amdgpu_sched_run_job(job); 144 trace_amdgpu_sched_run_job(job);
136 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, 145 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job->owner,
137 job->owner, &fence); 146 job->sync.last_vm_update, &fence);
138 if (r) { 147 if (r) {
139 DRM_ERROR("Error scheduling IBs (%d)\n", r); 148 DRM_ERROR("Error scheduling IBs (%d)\n", r);
140 goto err; 149 goto err;