aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c69
1 files changed, 20 insertions, 49 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 15b7149d1204..6c5646b48d1a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -184,47 +184,22 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
184 return r; 184 return r;
185 } 185 }
186 186
187 if (ring->funcs->support_64bit_ptrs) { 187 r = amdgpu_wb_get(adev, &ring->rptr_offs);
188 r = amdgpu_wb_get_64bit(adev, &ring->rptr_offs); 188 if (r) {
189 if (r) { 189 dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
190 dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r); 190 return r;
191 return r;
192 }
193
194 r = amdgpu_wb_get_64bit(adev, &ring->wptr_offs);
195 if (r) {
196 dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
197 return r;
198 }
199
200 } else {
201 r = amdgpu_wb_get(adev, &ring->rptr_offs);
202 if (r) {
203 dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
204 return r;
205 }
206
207 r = amdgpu_wb_get(adev, &ring->wptr_offs);
208 if (r) {
209 dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
210 return r;
211 }
212
213 } 191 }
214 192
215 if (amdgpu_sriov_vf(adev) && ring->funcs->type == AMDGPU_RING_TYPE_GFX) { 193 r = amdgpu_wb_get(adev, &ring->wptr_offs);
216 r = amdgpu_wb_get_256Bit(adev, &ring->fence_offs); 194 if (r) {
217 if (r) { 195 dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
218 dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r); 196 return r;
219 return r; 197 }
220 }
221 198
222 } else { 199 r = amdgpu_wb_get(adev, &ring->fence_offs);
223 r = amdgpu_wb_get(adev, &ring->fence_offs); 200 if (r) {
224 if (r) { 201 dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r);
225 dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r); 202 return r;
226 return r;
227 }
228 } 203 }
229 204
230 r = amdgpu_wb_get(adev, &ring->cond_exe_offs); 205 r = amdgpu_wb_get(adev, &ring->cond_exe_offs);
@@ -286,19 +261,15 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
286{ 261{
287 ring->ready = false; 262 ring->ready = false;
288 263
289 if (ring->funcs->support_64bit_ptrs) { 264 /* Not to finish a ring which is not initialized */
290 amdgpu_wb_free_64bit(ring->adev, ring->rptr_offs); 265 if (!(ring->adev) || !(ring->adev->rings[ring->idx]))
291 amdgpu_wb_free_64bit(ring->adev, ring->wptr_offs); 266 return;
292 } else { 267
293 amdgpu_wb_free(ring->adev, ring->rptr_offs); 268 amdgpu_wb_free(ring->adev, ring->rptr_offs);
294 amdgpu_wb_free(ring->adev, ring->wptr_offs); 269 amdgpu_wb_free(ring->adev, ring->wptr_offs);
295 }
296 270
297 amdgpu_wb_free(ring->adev, ring->cond_exe_offs); 271 amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
298 if (amdgpu_sriov_vf(ring->adev) && ring->funcs->type == AMDGPU_RING_TYPE_GFX) 272 amdgpu_wb_free(ring->adev, ring->fence_offs);
299 amdgpu_wb_free_256bit(ring->adev, ring->fence_offs);
300 else
301 amdgpu_wb_free(ring->adev, ring->fence_offs);
302 273
303 amdgpu_bo_free_kernel(&ring->ring_obj, 274 amdgpu_bo_free_kernel(&ring->ring_obj,
304 &ring->gpu_addr, 275 &ring->gpu_addr,