diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 52 |
1 files changed, 25 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 0cfc68db575b..bdc210ac74f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -37,10 +37,7 @@ static void amdgpu_job_timedout(struct amd_sched_job *s_job) | |||
37 | atomic_read(&job->ring->fence_drv.last_seq), | 37 | atomic_read(&job->ring->fence_drv.last_seq), |
38 | job->ring->fence_drv.sync_seq); | 38 | job->ring->fence_drv.sync_seq); |
39 | 39 | ||
40 | if (amdgpu_sriov_vf(job->adev)) | 40 | amdgpu_gpu_recover(job->adev, job); |
41 | amdgpu_sriov_gpu_reset(job->adev, job); | ||
42 | else | ||
43 | amdgpu_gpu_reset(job->adev); | ||
44 | } | 41 | } |
45 | 42 | ||
46 | int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | 43 | int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, |
@@ -63,7 +60,6 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | |||
63 | (*job)->num_ibs = num_ibs; | 60 | (*job)->num_ibs = num_ibs; |
64 | 61 | ||
65 | amdgpu_sync_create(&(*job)->sync); | 62 | amdgpu_sync_create(&(*job)->sync); |
66 | amdgpu_sync_create(&(*job)->dep_sync); | ||
67 | amdgpu_sync_create(&(*job)->sched_sync); | 63 | amdgpu_sync_create(&(*job)->sched_sync); |
68 | (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter); | 64 | (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter); |
69 | 65 | ||
@@ -104,10 +100,9 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job) | |||
104 | { | 100 | { |
105 | struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base); | 101 | struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base); |
106 | 102 | ||
107 | amdgpu_ring_priority_put(job->ring, amd_sched_get_job_priority(s_job)); | 103 | amdgpu_ring_priority_put(job->ring, s_job->s_priority); |
108 | dma_fence_put(job->fence); | 104 | dma_fence_put(job->fence); |
109 | amdgpu_sync_free(&job->sync); | 105 | amdgpu_sync_free(&job->sync); |
110 | amdgpu_sync_free(&job->dep_sync); | ||
111 | amdgpu_sync_free(&job->sched_sync); | 106 | amdgpu_sync_free(&job->sched_sync); |
112 | kfree(job); | 107 | kfree(job); |
113 | } | 108 | } |
@@ -118,7 +113,6 @@ void amdgpu_job_free(struct amdgpu_job *job) | |||
118 | 113 | ||
119 | dma_fence_put(job->fence); | 114 | dma_fence_put(job->fence); |
120 | amdgpu_sync_free(&job->sync); | 115 | amdgpu_sync_free(&job->sync); |
121 | amdgpu_sync_free(&job->dep_sync); | ||
122 | amdgpu_sync_free(&job->sched_sync); | 116 | amdgpu_sync_free(&job->sched_sync); |
123 | kfree(job); | 117 | kfree(job); |
124 | } | 118 | } |
@@ -141,28 +135,29 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, | |||
141 | job->fence_ctx = entity->fence_context; | 135 | job->fence_ctx = entity->fence_context; |
142 | *f = dma_fence_get(&job->base.s_fence->finished); | 136 | *f = dma_fence_get(&job->base.s_fence->finished); |
143 | amdgpu_job_free_resources(job); | 137 | amdgpu_job_free_resources(job); |
144 | amdgpu_ring_priority_get(job->ring, | 138 | amdgpu_ring_priority_get(job->ring, job->base.s_priority); |
145 | amd_sched_get_job_priority(&job->base)); | 139 | amd_sched_entity_push_job(&job->base, entity); |
146 | amd_sched_entity_push_job(&job->base); | ||
147 | 140 | ||
148 | return 0; | 141 | return 0; |
149 | } | 142 | } |
150 | 143 | ||
151 | static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | 144 | static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job, |
145 | struct amd_sched_entity *s_entity) | ||
152 | { | 146 | { |
153 | struct amdgpu_job *job = to_amdgpu_job(sched_job); | 147 | struct amdgpu_job *job = to_amdgpu_job(sched_job); |
154 | struct amdgpu_vm *vm = job->vm; | 148 | struct amdgpu_vm *vm = job->vm; |
155 | 149 | bool explicit = false; | |
156 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->dep_sync); | ||
157 | int r; | 150 | int r; |
158 | 151 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync, &explicit); | |
159 | if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) { | 152 | |
160 | r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence); | 153 | if (fence && explicit) { |
161 | if (r) | 154 | if (amd_sched_dependency_optimized(fence, s_entity)) { |
162 | DRM_ERROR("Error adding fence to sync (%d)\n", r); | 155 | r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence, false); |
156 | if (r) | ||
157 | DRM_ERROR("Error adding fence to sync (%d)\n", r); | ||
158 | } | ||
163 | } | 159 | } |
164 | if (!fence) | 160 | |
165 | fence = amdgpu_sync_get_fence(&job->sync); | ||
166 | while (fence == NULL && vm && !job->vm_id) { | 161 | while (fence == NULL && vm && !job->vm_id) { |
167 | struct amdgpu_ring *ring = job->ring; | 162 | struct amdgpu_ring *ring = job->ring; |
168 | 163 | ||
@@ -172,7 +167,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
172 | if (r) | 167 | if (r) |
173 | DRM_ERROR("Error getting VM ID (%d)\n", r); | 168 | DRM_ERROR("Error getting VM ID (%d)\n", r); |
174 | 169 | ||
175 | fence = amdgpu_sync_get_fence(&job->sync); | 170 | fence = amdgpu_sync_get_fence(&job->sync, NULL); |
176 | } | 171 | } |
177 | 172 | ||
178 | return fence; | 173 | return fence; |
@@ -180,7 +175,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
180 | 175 | ||
181 | static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) | 176 | static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) |
182 | { | 177 | { |
183 | struct dma_fence *fence = NULL; | 178 | struct dma_fence *fence = NULL, *finished; |
184 | struct amdgpu_device *adev; | 179 | struct amdgpu_device *adev; |
185 | struct amdgpu_job *job; | 180 | struct amdgpu_job *job; |
186 | int r; | 181 | int r; |
@@ -190,15 +185,18 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) | |||
190 | return NULL; | 185 | return NULL; |
191 | } | 186 | } |
192 | job = to_amdgpu_job(sched_job); | 187 | job = to_amdgpu_job(sched_job); |
188 | finished = &job->base.s_fence->finished; | ||
193 | adev = job->adev; | 189 | adev = job->adev; |
194 | 190 | ||
195 | BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); | 191 | BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); |
196 | 192 | ||
197 | trace_amdgpu_sched_run_job(job); | 193 | trace_amdgpu_sched_run_job(job); |
198 | /* skip ib schedule when vram is lost */ | 194 | |
199 | if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) { | 195 | if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) |
200 | dma_fence_set_error(&job->base.s_fence->finished, -ECANCELED); | 196 | dma_fence_set_error(finished, -ECANCELED);/* skip IB as well if VRAM lost */ |
201 | DRM_ERROR("Skip scheduling IBs!\n"); | 197 | |
198 | if (finished->error < 0) { | ||
199 | DRM_INFO("Skip scheduling IBs!\n"); | ||
202 | } else { | 200 | } else { |
203 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, | 201 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, |
204 | &fence); | 202 | &fence); |