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 | } |
