aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-10-19 20:47:19 -0400
committerDave Airlie <airlied@redhat.com>2017-10-19 20:47:19 -0400
commit6585d4274b0baf1d09318539c4a726a96b51af34 (patch)
tree179aacc9409db45966595893ae4842104b314442 /drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
parent40d86701a625eed9e644281b9af228d6a52d8ed9 (diff)
parent96687ec0bb478088cb6941a7dca3bb6808a19313 (diff)
Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next
Last set of features for 4.15. Highlights: - Add a bo flag to allow buffers to opt out of implicit sync - Add ctx priority setting interface - Lots more powerplay cleanups - Start to plumb through vram lost infrastructure for gpu reset - ttm support for huge pages - misc cleanups and bug fixes * 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux: (73 commits) drm/amd/powerplay: Place the constant on the right side of the test drm/amd/powerplay: Remove useless variable drm/amd/powerplay: Don't cast kzalloc() return value drm/amdgpu: allow GTT overcommit during bind drm/amdgpu: linear validate first then bind to GART drm/amd/pp: Fix overflow when setup decf/pix/disp dpm table. drm/amd/pp: thermal control not enabled on vega10. drm/amdgpu: busywait KIQ register accessing (v4) drm/amdgpu: report more amdgpu_fence_info drm/amdgpu:don't check soft_reset for sriov drm/amdgpu:fix duplicated setting job's vram_lost drm/amdgpu:reduce wb to 512 slot drm/amdgpu: fix regresstion on SR-IOV gpu reset failed drm/amd/powerplay: Tidy up cz_dpm_powerup_vce() drm/amd/powerplay: Tidy up cz_dpm_powerdown_vce() drm/amd/powerplay: Tidy up cz_dpm_update_vce_dpm() drm/amd/powerplay: Tidy up cz_dpm_update_uvd_dpm() drm/amd/powerplay: Tidy up cz_dpm_powerup_uvd() drm/amd/powerplay: Tidy up cz_dpm_powerdown_uvd() drm/amd/powerplay: Tidy up cz_start_dpm() ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 4510627ae83e..0cfc68db575b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -65,6 +65,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
65 amdgpu_sync_create(&(*job)->sync); 65 amdgpu_sync_create(&(*job)->sync);
66 amdgpu_sync_create(&(*job)->dep_sync); 66 amdgpu_sync_create(&(*job)->dep_sync);
67 amdgpu_sync_create(&(*job)->sched_sync); 67 amdgpu_sync_create(&(*job)->sched_sync);
68 (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
68 69
69 return 0; 70 return 0;
70} 71}
@@ -103,6 +104,7 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
103{ 104{
104 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base); 105 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
105 106
107 amdgpu_ring_priority_put(job->ring, amd_sched_get_job_priority(s_job));
106 dma_fence_put(job->fence); 108 dma_fence_put(job->fence);
107 amdgpu_sync_free(&job->sync); 109 amdgpu_sync_free(&job->sync);
108 amdgpu_sync_free(&job->dep_sync); 110 amdgpu_sync_free(&job->dep_sync);
@@ -139,6 +141,8 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
139 job->fence_ctx = entity->fence_context; 141 job->fence_ctx = entity->fence_context;
140 *f = dma_fence_get(&job->base.s_fence->finished); 142 *f = dma_fence_get(&job->base.s_fence->finished);
141 amdgpu_job_free_resources(job); 143 amdgpu_job_free_resources(job);
144 amdgpu_ring_priority_get(job->ring,
145 amd_sched_get_job_priority(&job->base));
142 amd_sched_entity_push_job(&job->base); 146 amd_sched_entity_push_job(&job->base);
143 147
144 return 0; 148 return 0;
@@ -177,8 +181,8 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
177static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) 181static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
178{ 182{
179 struct dma_fence *fence = NULL; 183 struct dma_fence *fence = NULL;
184 struct amdgpu_device *adev;
180 struct amdgpu_job *job; 185 struct amdgpu_job *job;
181 struct amdgpu_fpriv *fpriv = NULL;
182 int r; 186 int r;
183 187
184 if (!sched_job) { 188 if (!sched_job) {
@@ -186,23 +190,25 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
186 return NULL; 190 return NULL;
187 } 191 }
188 job = to_amdgpu_job(sched_job); 192 job = to_amdgpu_job(sched_job);
193 adev = job->adev;
189 194
190 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); 195 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL));
191 196
192 trace_amdgpu_sched_run_job(job); 197 trace_amdgpu_sched_run_job(job);
193 if (job->vm)
194 fpriv = container_of(job->vm, struct amdgpu_fpriv, vm);
195 /* skip ib schedule when vram is lost */ 198 /* skip ib schedule when vram is lost */
196 if (fpriv && amdgpu_kms_vram_lost(job->adev, fpriv)) 199 if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) {
200 dma_fence_set_error(&job->base.s_fence->finished, -ECANCELED);
197 DRM_ERROR("Skip scheduling IBs!\n"); 201 DRM_ERROR("Skip scheduling IBs!\n");
198 else { 202 } else {
199 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, &fence); 203 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job,
204 &fence);
200 if (r) 205 if (r)
201 DRM_ERROR("Error scheduling IBs (%d)\n", r); 206 DRM_ERROR("Error scheduling IBs (%d)\n", r);
202 } 207 }
203 /* if gpu reset, hw fence will be replaced here */ 208 /* if gpu reset, hw fence will be replaced here */
204 dma_fence_put(job->fence); 209 dma_fence_put(job->fence);
205 job->fence = dma_fence_get(fence); 210 job->fence = dma_fence_get(fence);
211
206 amdgpu_job_free_resources(job); 212 amdgpu_job_free_resources(job);
207 return fence; 213 return fence;
208} 214}