diff options
author | Dave Airlie <airlied@redhat.com> | 2017-10-19 20:47:19 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-10-19 20:47:19 -0400 |
commit | 6585d4274b0baf1d09318539c4a726a96b51af34 (patch) | |
tree | 179aacc9409db45966595893ae4842104b314442 /drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |
parent | 40d86701a625eed9e644281b9af228d6a52d8ed9 (diff) | |
parent | 96687ec0bb478088cb6941a7dca3bb6808a19313 (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.c | 18 |
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) | |||
177 | static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) | 181 | static 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 | } |