diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 69 |
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, |