diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_ring.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 67 |
1 files changed, 42 insertions, 25 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 747b4bffb84b..4d12b2d17b4d 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -165,19 +165,24 @@ int radeon_ib_pool_init(struct radeon_device *rdev) | |||
165 | return 0; | 165 | return 0; |
166 | /* Allocate 1M object buffer */ | 166 | /* Allocate 1M object buffer */ |
167 | INIT_LIST_HEAD(&rdev->ib_pool.scheduled_ibs); | 167 | INIT_LIST_HEAD(&rdev->ib_pool.scheduled_ibs); |
168 | r = radeon_object_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, | 168 | r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, |
169 | true, RADEON_GEM_DOMAIN_GTT, | 169 | true, RADEON_GEM_DOMAIN_GTT, |
170 | false, &rdev->ib_pool.robj); | 170 | &rdev->ib_pool.robj); |
171 | if (r) { | 171 | if (r) { |
172 | DRM_ERROR("radeon: failed to ib pool (%d).\n", r); | 172 | DRM_ERROR("radeon: failed to ib pool (%d).\n", r); |
173 | return r; | 173 | return r; |
174 | } | 174 | } |
175 | r = radeon_object_pin(rdev->ib_pool.robj, RADEON_GEM_DOMAIN_GTT, &gpu_addr); | 175 | r = radeon_bo_reserve(rdev->ib_pool.robj, false); |
176 | if (unlikely(r != 0)) | ||
177 | return r; | ||
178 | r = radeon_bo_pin(rdev->ib_pool.robj, RADEON_GEM_DOMAIN_GTT, &gpu_addr); | ||
176 | if (r) { | 179 | if (r) { |
180 | radeon_bo_unreserve(rdev->ib_pool.robj); | ||
177 | DRM_ERROR("radeon: failed to pin ib pool (%d).\n", r); | 181 | DRM_ERROR("radeon: failed to pin ib pool (%d).\n", r); |
178 | return r; | 182 | return r; |
179 | } | 183 | } |
180 | r = radeon_object_kmap(rdev->ib_pool.robj, &ptr); | 184 | r = radeon_bo_kmap(rdev->ib_pool.robj, &ptr); |
185 | radeon_bo_unreserve(rdev->ib_pool.robj); | ||
181 | if (r) { | 186 | if (r) { |
182 | DRM_ERROR("radeon: failed to map ib poll (%d).\n", r); | 187 | DRM_ERROR("radeon: failed to map ib poll (%d).\n", r); |
183 | return r; | 188 | return r; |
@@ -203,14 +208,21 @@ int radeon_ib_pool_init(struct radeon_device *rdev) | |||
203 | 208 | ||
204 | void radeon_ib_pool_fini(struct radeon_device *rdev) | 209 | void radeon_ib_pool_fini(struct radeon_device *rdev) |
205 | { | 210 | { |
211 | int r; | ||
212 | |||
206 | if (!rdev->ib_pool.ready) { | 213 | if (!rdev->ib_pool.ready) { |
207 | return; | 214 | return; |
208 | } | 215 | } |
209 | mutex_lock(&rdev->ib_pool.mutex); | 216 | mutex_lock(&rdev->ib_pool.mutex); |
210 | bitmap_zero(rdev->ib_pool.alloc_bm, RADEON_IB_POOL_SIZE); | 217 | bitmap_zero(rdev->ib_pool.alloc_bm, RADEON_IB_POOL_SIZE); |
211 | if (rdev->ib_pool.robj) { | 218 | if (rdev->ib_pool.robj) { |
212 | radeon_object_kunmap(rdev->ib_pool.robj); | 219 | r = radeon_bo_reserve(rdev->ib_pool.robj, false); |
213 | radeon_object_unref(&rdev->ib_pool.robj); | 220 | if (likely(r == 0)) { |
221 | radeon_bo_kunmap(rdev->ib_pool.robj); | ||
222 | radeon_bo_unpin(rdev->ib_pool.robj); | ||
223 | radeon_bo_unreserve(rdev->ib_pool.robj); | ||
224 | } | ||
225 | radeon_bo_unref(&rdev->ib_pool.robj); | ||
214 | rdev->ib_pool.robj = NULL; | 226 | rdev->ib_pool.robj = NULL; |
215 | } | 227 | } |
216 | mutex_unlock(&rdev->ib_pool.mutex); | 228 | mutex_unlock(&rdev->ib_pool.mutex); |
@@ -288,29 +300,28 @@ int radeon_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
288 | rdev->cp.ring_size = ring_size; | 300 | rdev->cp.ring_size = ring_size; |
289 | /* Allocate ring buffer */ | 301 | /* Allocate ring buffer */ |
290 | if (rdev->cp.ring_obj == NULL) { | 302 | if (rdev->cp.ring_obj == NULL) { |
291 | r = radeon_object_create(rdev, NULL, rdev->cp.ring_size, | 303 | r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, true, |
292 | true, | 304 | RADEON_GEM_DOMAIN_GTT, |
293 | RADEON_GEM_DOMAIN_GTT, | 305 | &rdev->cp.ring_obj); |
294 | false, | ||
295 | &rdev->cp.ring_obj); | ||
296 | if (r) { | 306 | if (r) { |
297 | DRM_ERROR("radeon: failed to create ring buffer (%d).\n", r); | 307 | dev_err(rdev->dev, "(%d) ring create failed\n", r); |
298 | mutex_unlock(&rdev->cp.mutex); | ||
299 | return r; | 308 | return r; |
300 | } | 309 | } |
301 | r = radeon_object_pin(rdev->cp.ring_obj, | 310 | r = radeon_bo_reserve(rdev->cp.ring_obj, false); |
302 | RADEON_GEM_DOMAIN_GTT, | 311 | if (unlikely(r != 0)) |
303 | &rdev->cp.gpu_addr); | 312 | return r; |
313 | r = radeon_bo_pin(rdev->cp.ring_obj, RADEON_GEM_DOMAIN_GTT, | ||
314 | &rdev->cp.gpu_addr); | ||
304 | if (r) { | 315 | if (r) { |
305 | DRM_ERROR("radeon: failed to pin ring buffer (%d).\n", r); | 316 | radeon_bo_unreserve(rdev->cp.ring_obj); |
306 | mutex_unlock(&rdev->cp.mutex); | 317 | dev_err(rdev->dev, "(%d) ring pin failed\n", r); |
307 | return r; | 318 | return r; |
308 | } | 319 | } |
309 | r = radeon_object_kmap(rdev->cp.ring_obj, | 320 | r = radeon_bo_kmap(rdev->cp.ring_obj, |
310 | (void **)&rdev->cp.ring); | 321 | (void **)&rdev->cp.ring); |
322 | radeon_bo_unreserve(rdev->cp.ring_obj); | ||
311 | if (r) { | 323 | if (r) { |
312 | DRM_ERROR("radeon: failed to map ring buffer (%d).\n", r); | 324 | dev_err(rdev->dev, "(%d) ring map failed\n", r); |
313 | mutex_unlock(&rdev->cp.mutex); | ||
314 | return r; | 325 | return r; |
315 | } | 326 | } |
316 | } | 327 | } |
@@ -321,11 +332,17 @@ int radeon_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
321 | 332 | ||
322 | void radeon_ring_fini(struct radeon_device *rdev) | 333 | void radeon_ring_fini(struct radeon_device *rdev) |
323 | { | 334 | { |
335 | int r; | ||
336 | |||
324 | mutex_lock(&rdev->cp.mutex); | 337 | mutex_lock(&rdev->cp.mutex); |
325 | if (rdev->cp.ring_obj) { | 338 | if (rdev->cp.ring_obj) { |
326 | radeon_object_kunmap(rdev->cp.ring_obj); | 339 | r = radeon_bo_reserve(rdev->cp.ring_obj, false); |
327 | radeon_object_unpin(rdev->cp.ring_obj); | 340 | if (likely(r == 0)) { |
328 | radeon_object_unref(&rdev->cp.ring_obj); | 341 | radeon_bo_kunmap(rdev->cp.ring_obj); |
342 | radeon_bo_unpin(rdev->cp.ring_obj); | ||
343 | radeon_bo_unreserve(rdev->cp.ring_obj); | ||
344 | } | ||
345 | radeon_bo_unref(&rdev->cp.ring_obj); | ||
329 | rdev->cp.ring = NULL; | 346 | rdev->cp.ring = NULL; |
330 | rdev->cp.ring_obj = NULL; | 347 | rdev->cp.ring_obj = NULL; |
331 | } | 348 | } |